我有一个只有在运行所有测试时才会失败的测试。我认为一个测试导致另一个测试失败,我想在尝试修复它之前证明它。
如果我运行所有测试,它运行“测试污染测试”,然后运行“测试污染后失败的测试”。它还在中间运行许多不相关的、缓慢的测试。但是如果我使用一个模式只运行这两个,它会运行“测试污染后失败的测试”,然后运行“测试污染测试”。结果,两者都通过了。
我如何只运行“测试污染测试”和“测试污染后失败的测试”,按此顺序?
注意:这些测试在不同的类中。
我有一个只有在运行所有测试时才会失败的测试。我认为一个测试导致另一个测试失败,我想在尝试修复它之前证明它。
如果我运行所有测试,它运行“测试污染测试”,然后运行“测试污染后失败的测试”。它还在中间运行许多不相关的、缓慢的测试。但是如果我使用一个模式只运行这两个,它会运行“测试污染后失败的测试”,然后运行“测试污染测试”。结果,两者都通过了。
我如何只运行“测试污染测试”和“测试污染后失败的测试”,按此顺序?
注意:这些测试在不同的类中。
4条答案
按热度按时间3z6pesqy1#
根据JUnit's wiki:
根据设计,JUnit不指定测试方法调用的执行顺序。到目前为止,方法只是按照反射API返回的顺序调用。然而,使用JVM顺序是不明智的,因为Java平台没有指定任何特定的顺序,实际上JDK 7返回的顺序或多或少是随机的。当然,编写良好的测试代码不会假定任何顺序,但有些代码会,并且在某些平台上,可预测的失败比随机失败要好。
从4.11版开始,JUnit将默认使用确定性但不可预测的顺序(MethodSorters.DEFAULT)。要更改测试执行顺序,只需使用@FixMethodOrder注解测试类并指定可用的MethodSorters之一:
@FixMethodOrder(MethodSorters.JVM)
:按照JVM返回的顺序保留测试方法。该顺序可能因运行而异。@FixMethodOrder(MethodSorters.NAME_ASCENDING)
:按照方法名称和字典顺序对测试方法进行排序。您可以使用
MethodSorters.NAME_ASCENDING
并更改方法名称以匹配特定的顺序。我知道您只是为了调试而使用它,但是它依赖于您的测试方法执行顺序,并且JUnit没有提供对测试方法执行顺序的更细粒度的控制,这是一个测试测试方法5rgfhyps2#
正如Ali Dehghani所说,您可以通过以下方式命令测试方法执行:
@FixMethodOrder(MethodSorters.NAME_ASCENDING):按方法名称以字典顺序对测试方法进行排序。
验证码:
mctunoxg3#
单元测试应该是独立的,因此大多数框架不保证或强制执行它们的运行顺序。但是,既然你想强制执行一个顺序,我过去做过的最简单的方法是创建一个“扔掉”的测试套件或测试方法,它以我希望它们运行的任何顺序调用测试。单元测试是方法,只需调用它们。如果您要处理数十个测试,这很容易做到,如果您要处理数百个或数千个测试,这一点都不吸引人。
尝试尽可能地隔离测试间的交互,然后在一次性调用方法中交换交互性差的测试的顺序。
de90aj5v4#
在 JUnit 5(从5.8.0版本开始)中,测试类也可以订购。
其他Junit内置类排序器实现:
您也可以提供自己的排序器。它必须实现ClassOrderer接口:
注意,
@Nested
测试类不能按ClassOrderer
排序。请参阅JUnit 5文档和ClassOrderer API docs以了解更多信息。
来源:JUnit test class order
我建议注意:https://stackoverflow.com/a/68269239/10663941
方法顺序:https://www.baeldung.com/junit-5-test-order(因为我来这里是为了寻找答案)