我有一个 Maven 项目,可以在本地正常运行所有单元测试,但是当同一项目在我们的 Jenkins 服务器上运行时,某些单元测试或其他测试偶尔会在完全不相关的更改后开始失败。这就像它以随机顺序运行测试,并且在每次测试之前不重置内存中的 HSQLDB 数据库,因此一个随机选择的测试的输出将被输入到下一个测试的输入中。我认为测试数据的重置是自动 JUnit 过程的一部分。
有人知道是什么原因造成的,更重要的是,如何治愈它?
该项目的 Jenkins 设置是:Jenkins 版本。 1.534、Maven 3.1.1、Java 1.7
当前失败的测试设置如下:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:test-context.xml"})
public class MyAppStatusServiceTest {
@Autowired
MyAppStatusService service;
@Test
public void createTest() {
MyAppStatus test = new MyAppStatus();
test.setStatusCode('Y');
test.setStatusDefinition("Test Data");
test = service.save(test);
assertEquals("Test Data",test.getStatusDefinition());
}
@Test
public void readTest() {
MyAppStatus test = service.findOne(ApplicationStatus.PENDING.getCode() );
assertEquals("Pending",test.getStatusDefinition());
}
@Test
public void updateTest() {
MyAppStatus test = service.findOne(ApplicationStatus.PENDING.getCode());
test.setStatusDefinition("New Value");
test = service.save(test);
MyAppStatus readme = service.findOne(ApplicationStatus.PENDING.getCode());
assertEquals("New Value", StringUtils.trim(readme.getStatusDefinition()));
}
}
返回的错误是第二次测试失败,如下:
org.junit.ComparisonFailure: expected:<[Pending]> but was:<[New Value]>
所以看起来底部测试正在运行,数据没有重置,然后中间测试正在运行(并且失败)。我无法在本地复制这种行为,所以有点令人沮丧。
最佳答案
Junit
不会重置您在测试
中使用的任何测试数据。 test
顺序始终是随机的,即使在本地环境中,您的测试也可能会失败,这与 jenkins
无关。
使用@Before带注释的方法将记录插入数据库并使用 @After用于从数据库中删除记录的注释。
Before
和 After
注释方法将在每次测试执行之前和之后调用。
e.g
@Before
public void onceBeforeEachTest(){
// Insert test data records.
}
@After
public void onceAfterEachTest(){
// Delete test data records.
}
关于java - 在 Jenkins 上构建时,单元测试没有重置上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23915658/