@RunWith(com.stackoverflow.mlk.RandomBlockJUnit4ClassRunner.class)
public class RandomOrder {
@Test
public void one() {
}
@Test
public void two() {
}
@Test
public void three() {
}
}
test {
useJUnitPlatform()
systemProperties([
//Random in method level
'junit.jupiter.testmethod.order.default': 'org.junit.jupiter.api.MethodOrderer$Random',
// Random in class level
'junit.jupiter.testclass.order.default' : 'org.junit.jupiter.api.ClassOrderer$Random',
// Log configuration to see the seed
'java.util.logging.config.file' : file('src/test/resources/logging.properties')
])
//To print the JUnit logs in console
testLogging {
events "passed", "skipped", "failed", "standardOut", "standardError"
}
}
7条答案
按热度按时间rpppsulh1#
你确实有一个Sortable,但我不知道你会如何使用它。
您可以扩展BlockJUnit4ClassRunner并让computeTestMethods()返回super.computeTestMethods()的随机化副本,然后使用@RunWith将其设置为要使用的runner。
例如:
然后
8ehkhllq2#
https://github.com/KentBeck/junit/pull/386引入了一些订单,但没有
RANDOM
,可能你并不真的想要这个;测试应该确定性地运行。2如果你需要验证不同的测试排列仍然通过,要么测试所有排列;或者,如果这样做太慢,那么可以引入一个由环境变量或类似变量确定的“随机”种子进行混洗,以便可以重现任何失败。http://hg.netbeans.org/main/file/66d9fb12e98f/nbjunit/src/org/netbeans/junit/MethodOrder.java给出了一个针对JUnit 3执行此操作的示例。uqjltbpv3#
一般来说,您需要做的是编写自己的测试运行程序,并在测试运行程序类中聚合方法并随机运行每个测试(确保不运行两次测试)。
在此处阅读有关测试框架以及如何编写自己的测试运行程序的详细信息:http://www.ddj.com/architect/184415674
6qqygrtg4#
在JUnit 4.13中,要以随机顺序运行测试类中的测试,请编写一个小的helper类:
然后,使用以下内容注解测试类:
这样,这个类的测试方法就以随机的顺序运行,另外,如果它们意外地失败了,你知道随机种子会完全按照这个顺序重复。
我不知道如何为整个项目或测试套件配置这个。
4c8rllxm5#
我会确保他们不会相互依赖
你应该确保不依赖于随机执行顺序的情况是这样的。是什么让你担心依赖关系可能存在呢?
toe950276#
This issue is open on JUnit GitHub,并指出2个独立问题:
考虑从根本上解决问题,而不是尝试使用框架来完成工作。使用setUp和tearDown方法来保证隔离,并在最小的级别进行测试。
k2fxgqgv7#
以下是
Gradle
和JUnit 5.8.0
的解决方案步骤1:确保您具有最新的JUnit版本依赖项。
步骤2:在build.gradle测试部分下定义所需的属性
步骤3:在
src/test/resources
下定义logging.properties
步骤4:运行测试。
gradlew clean test
您可以在控制台中看到用于随机测试的种子
如果是片状测试,您可以通过配置JUnit测试失败的相同种子来重现它
参考文献:how-to-randomize-tests-in-junit,Random