如何使 JUnit 测试用例按顺序运行?
Posted
技术标签:
【中文标题】如何使 JUnit 测试用例按顺序运行?【英文标题】:How to make JUnit test cases to run in sequential order? 【发布时间】:2012-03-28 21:42:02 【问题描述】:我正在使用 JUnit4。
我在一个测试用例中有一套测试方法。
每个测试方法插入一些记录并验证一个测试结果,最后删除插入的记录。
由于 JUnit 并行运行,测试方法会因为某些原因而失败 以前的测试方法执行期间存在的记录。这 只发生在我同事的机器上(Windows 7),不在我的机器上(Cent 操作系统 6)。
我们需要的是测试方法必须在我们所有的机器中通过。
我已尝试清除 Setup() 方法中的记录,但它再次仅适用于我的机器。 JUnit 中是否有任何选项可以使测试方法以统一的顺序运行?
谢谢,
【问题讨论】:
【参考方案1】:JUnit 4.11 现在支持使用@FixMethodOrder
注解指定执行顺序。
【讨论】:
【参考方案2】: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/
【讨论】:
现在(2020年),我发现了另一个分配方法顺序的功能,我不知道这个功能是什么时候引入的。它使用@Order(此处为正数)来分配序数。 baeldung.com/…. @DanielYang 那是针对 JUnit 5,但问题是针对 JUnit 4。【参考方案3】:即使您有数据层,并行运行测试也没有问题。但是您需要进行额外的工作来为您的数据创建 MOCK UP,这样它就不会影响数据库。您可以使用不同的模型框架,例如 Mockito、EasyMock 和 Arquillian。
【讨论】:
【参考方案4】:因为您正在并行运行测试,并且您正在访问数据库,所以您很可能会遇到问题,因为对于每个测试,数据库不一定处于一致状态。
解决方案:不要并行运行测试。默认情况下,JUnit 不会并行运行测试,因此您要么在 maven 中设置选项,要么在 JUnit 中使用并行运行器之一。
如果您在 Windows 上的测试失败但在 Cent OS 上的测试之间仍然存在问题,那么这可能是运行顺序的问题,您需要修复它。请参阅我对Has JUnit4 begun supporting ordering of test? Is it intentional? 的回复。
解决这个问题的方法(至少在 JUnit 术语中)是删除测试之间的依赖关系。基本上,JUnit 不支持排序,测试应该能够以任何顺序运行。
如果你真的需要在测试之间建立依赖关系,请使用 TestNG,你可以在其中建立依赖关系。
【讨论】:
【参考方案5】:JUnit 不保证测试的顺序。
这样做的原因是单元测试应该是原子的 - 所有的设置都应该发生在 setup / tear down 方法中,而不是其他测试。
考虑将插入数据的代码移动到另一个辅助类中,该辅助类可以被插入的测试和需要验证的类调用,并在 @Before 方法中调用该类。
如果可以的话,您还应该考虑使用模拟解决方案(例如 Mockito),而不是直接访问数据库 - 模拟将大大有助于确保您的测试良好且独立,并且作为一个很好的附带好处,通常帮助指出您可以在哪里使用一些重构。
【讨论】:
谢谢你的回答,我去看看。 你也可以使用 DBUnit 之类的东西来控制你的数据库设置和拆卸,但是对于纯单元测试,Mockito 更有意义,因为它允许测试完全独立。以上是关于如何使 JUnit 测试用例按顺序运行?的主要内容,如果未能解决你的问题,请参考以下文章