我正在使用JUnit4。
我在测试用例中有一组测试方法。
每个测试方法都会插入一些记录并验证测试结果,最后删除插入的记录。
由于JUnit并行运行,测试方法因某些原因而失败 执行上一个测试方法时出现的记录。这个 只发生在我的同事机器(Windows 7),而不是我的机器(Cent OS 6)。
我们需要的是测试方法必须通过我们所有的机器。
我已经尝试清除Setup()方法中的记录,但它又只能在我的机器上运行。 JUnit中是否有任何选项可以使测试方法以统一的顺序运行?
谢谢,
答案 0 :(得分:26)
JUnit 4.11现在支持使用@FixMethodOrder
注释指定执行顺序。
答案 1 :(得分:24)
MethodSorters是Junit 4.6发布后引入的新类。该类声明了三种类型的执行顺序,可以在执行它们时在测试用例中使用。
NAME_ASCENDING(MethodSorters.NAME_ASCENDING) - 对测试方法进行排序 按方法名称,按字典顺序排列。
JVM(null) - 按照返回的顺序保留测试方法 JVM。请注意,来自JVM的顺序因运行而异。
DEFAULT(MethodSorter.DEFAULT) - 对测试方法进行排序 确定性但不可预测的顺序。
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runners.MethodSorters;
//Running test cases in order of method names in ascending order
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class OrderedTestCasesExecution {
@Test
public void secondTest() {
System.out.println("Executing second test");
}
@Test
public void firstTest() {
System.out.println("Executing first test");
}
@Test
public void thirdTest() {
System.out.println("Executing third test");
}
}
输出:
Executing first test
Executing second test
Executing third test
参考:http://howtodoinjava.com/2012/11/24/ordered-testcases-execution-in-junit-4/
答案 2 :(得分:7)
JUnit无法保证测试顺序。
原因是单元测试是原子的 - 所有设置都应该在设置/拆除方法中进行,而不是通过其他测试。
考虑将插入数据的代码移动到另一个辅助类中,该类可以由插入的测试和需要验证的类调用,并在@Before方法中调用该类。
你应该考虑一个模拟解决方案(例如Mockito),而不是直接命中数据库,如果可以的话 - 模拟将大大有助于确保你的测试很好并且孤立,并且,作为一个很好的附带好处,通常帮助指出你可以使用一些重构的地方。
答案 3 :(得分:2)
因为您并行运行测试,并且您正在访问数据库,所以您很可能遇到问题,因为每次测试数据库都不一定处于连贯状态。
解决方案:不要并行运行测试。默认情况下,JUnit不会并行运行测试,因此您要么在maven中设置选项,要么在JUnit中使用其中一个并行运行器。
如果您在Windows上测试失败但在Cent OS上没有出现问题,则可能是运行顺序问题,您需要修复它。请参阅我对Has JUnit4 begun supporting ordering of test? Is it intentional?的回答。
解决这个问题的方法(至少在JUnit术语中)是删除测试之间的依赖关系。基本上,JUnit不支持排序,测试应该能够以任何顺序运行。
如果您确实需要在测试之间存在依赖关系,请使用TestNG,您可以在其中拥有依赖关系。
答案 4 :(得分:-2)
即使您有数据层,并行运行测试也没有问题。但是你需要额外的工作来为你的数据创建MOCK UP,这样就不会对数据库产生影响。您可以使用不同的模型框架,如Mockito,EasyMock和Arquillian。