如何使JUnit测试以随机顺序运行?

如何使JUnit测试以随机顺序运行?,junit,Junit,我有测试的经典结构,我有一个不同套件的测试套件,如DatabaseTests、UnitTests等。有时这些套件包含其他套件,如SlowDatabaseTests、FastDatabaseTests等 我想要的是将测试的运行顺序随机化,这样我就可以确保它们不会相互依赖。随机化应该在每一个层次上进行,就像套件应该洗牌测试类顺序,测试类应该洗牌测试方法顺序一样 如果在Eclipse中可以做到这一点,那将是最好的 我会确保他们不依赖于 彼此 您应该确保这种情况不会依赖于随机执行顺序。什么使您担心可能存

我有测试的经典结构,我有一个不同套件的测试套件,如DatabaseTests、UnitTests等。有时这些套件包含其他套件,如SlowDatabaseTests、FastDatabaseTests等

我想要的是将测试的运行顺序随机化,这样我就可以确保它们不会相互依赖。随机化应该在每一个层次上进行,就像套件应该洗牌测试类顺序,测试类应该洗牌测试方法顺序一样

如果在Eclipse中可以做到这一点,那将是最好的

我会确保他们不依赖于 彼此


您应该确保这种情况不会依赖于随机执行顺序。什么使您担心可能存在依赖关系?

通常,您需要编写自己的测试运行程序,并在测试运行程序类中聚合方法并随机运行每个测试(确保不运行两次测试)

在此处阅读有关测试框架以及如何编写自己的测试运行程序的更多信息:

您确实有一个,但我看不出您会如何使用它

您可以扩展并让()返回super.computeTestMethods()的随机副本。然后使用@将其设置为要使用的运行程序

e、 g

package com.stackoverflow.mlk;
导入java.util.Collections;
导入org.junit.runners.BlockJUnit4ClassRunner;
导入org.junit.runners.model.InitializationError;
公共类RandomBlockJUnit4ClassRunner扩展了BlockJUnit4ClassRunner{
公共类运行程序(类klass)
抛出初始化错误{
超级(klass);;
}
受保护的java.util.List computeTestMethods(){
java.util.List methods=super.computeTestMethods();
收集。洗牌(方法);
返回方法;
}
}
然后

@RunWith(com.stackoverflow.mlk.RandomBlockJUnit4ClassRunner.class)
公共秩序{
@试验
公众假期一({
}
@试验
公众假期二({
}
@试验
公共空间三(){
}
}
引入了一些订单,但不是
随机的
。也许你并不真的想要这个;测试应该决定性地运行。如果需要验证不同排列的测试是否仍然通过,请测试所有排列;或者,如果速度慢得不切实际,则引入由环境变量等决定的“随机”混洗种子,以便重现任何失败。给出了一个JUnit 3的例子。

自2年以来,并指出了两个独立的问题:
-根据执行顺序进行测试
-不可重复的测试


考虑从根本上解决问题,而不是试图在事后使用框架来完成工作。使用设置和拆卸方法确保隔离,并在最小级别进行测试。

随机排列顺序不会证明任何事情,因为随机排列可能“偶然”起作用。此外,它不可重复,因此您永远无法跟踪失败的原因。如果每次运行测试时我都将执行顺序写入某个位置,则我将能够跟踪原因。您可以通过给Random()一个种子使其可重复,该种子是日期的函数,而不是时间。如果您这样做,我强烈建议您进行连续构建,以便在测试失败时注意到。@skaffman这可能是真的,但如果您不随机化顺序,错误仍然会存在,但您永远不会发现它。因此,这取决于您喜欢什么:(a)您不知道的bug,或(b)您知道但无法跟踪的bug。@Ryan:测试可以在测试开始时输出RNG种子,以便重复。我们在编写单元测试并使其独立时非常小心。但我们在编写生产代码时也非常小心,错误时有发生,不能保证它们是独立的。另外,我们不仅在单元测试中使用JUnit,而且在功能测试中也使用JUnit,因此它们有时会使数据库处于某种状态。@lutz我猜是因为您在回答OP的问题“确保情况如此”时,没有回答另一个问题?如果您总是按顺序运行测试,您如何确保这种情况发生?@nimcap测试数据库应该在每个测试结束时重置,方法是为每个测试使用事务,或者清除并重新初始化它。无论如何,JUnit可能不是集成测试的合适工具。JUnit适合集成测试。虽然理想情况下,它们应该放在一个单独的包或文件夹中,所以很明显它们需要一个活动的后端,而不是独立的单元测试。如果您尝试此方法,请注意,如果您的测试使用TestSetup或尝试通过扩展TestSuite进行套件级别的设置和拆除,那么此处建议的方法将不起作用;测试运行程序没有“看到”TestSuite或TestDecorators。如果您从Eclipse这样的IDE运行测试,那么编写自己的JUnit3测试运行程序也将不起作用。回答不错,但还不够。我还需要实现一个套件运行程序,以随机化测试类顺序。此外,我有很多测试,我不想把@RunWith注释放在所有测试中。我认为这可以在套件中处理,runnerI发现这非常有用,于是我创建了一个小型Java项目,将测试和套件随机化。有关更多信息,请访问其网页: