如何让我的JUnit测试以随机顺序运行?

时间:2009-09-18 12:39:56

标签: junit

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

我想要的是随机化测试的运行顺序,这样我就可以确保它们不相互依赖。随机化应该在每个级别,比如套件应该改组测试类顺序,测试类应该改组测试方法顺序。

如果可以在Eclipse中执行此操作,那将是最好的。

6 个答案:

答案 0 :(得分:14)

你有一个Sortable,但我看不出你会如何使用它。

您可以扩展BlockJUnit4ClassRunner并让computeTestMethods()返回super.computeTestMethods()的随机副本。然后使用@ RunWith将其设置为要使用的跑步者。

e.g。

package com.stackoverflow.mlk;

import java.util.Collections;

import org.junit.runners.BlockJUnit4ClassRunner;
import org.junit.runners.model.InitializationError;

public class RandomBlockJUnit4ClassRunner extends BlockJUnit4ClassRunner {

    public RandomBlockJUnit4ClassRunner(Class<?> klass)
            throws InitializationError {
        super(klass);
    }

    protected java.util.List<org.junit.runners.model.FrameworkMethod> computeTestMethods() {
        java.util.List<org.junit.runners.model.FrameworkMethod> methods = super.computeTestMethods();
        Collections.shuffle(methods);
        return methods;
    }

}

然后

@RunWith(com.stackoverflow.mlk.RandomBlockJUnit4ClassRunner.class)
public class RandomOrder {
    @Test
    public void one() {
    }

    @Test
    public void two() {
    }

    @Test
    public void three() {
    }
}

答案 1 :(得分:4)

https://github.com/KentBeck/junit/pull/386介绍了一些订单但不是RANDOM。可能你真的不想要这个;测试应该确定性地运行。如果您需要验证测试的不同排列是否仍然通过,请测试所有排列;或者,如果这将是不切实际的缓慢,则引入由随机环境变量等确定的随机“随机”种子,以便您可以重现任何失败。 http://hg.netbeans.org/main/file/66d9fb12e98f/nbjunit/src/org/netbeans/junit/MethodOrder.java给出了一个为JUnit 3执行此操作的示例。

答案 2 :(得分:3)

一般来说,你需要做的是编写自己的测试运行器,并在测试运行器类中聚合方法并随机运行每个测试(确保你没有运行两次测试)。

在此处阅读有关测试框架以及如何编写自己的测试运行器的更多信息: http://www.ddj.com/architect/184415674

答案 3 :(得分:0)

  

我会确保他们不依赖   彼此

您应该确保不依赖于随机执行顺序就是这种情况。是什么让你担心依赖可能存在?

答案 4 :(得分:0)

This issue is open on JUnit GitHub 2年以来,并指出了2个独立的问题:
  - 测试取决于执行顺序;
  - 不可重复的测试。

考虑在根目录下解决问题,而不是尝试使用框架来完成工作。使用setUp和tearDown方法来保证隔离,并在最小的级别进行测试。

答案 5 :(得分:0)

在 JUnit 4.13 中,要以随机顺序在测试类中运行测试,请编写一个小帮助类:

import org.junit.runner.manipulation.Ordering;

import java.util.Random;

public class RandomOrder implements Ordering.Factory {
    @Override
    public Ordering create(Ordering.Context context) {
        long seed = new Random().nextLong();
        System.out.println("RandomOrder: seed = " + seed);
        return Ordering.shuffledBy(new Random(seed));
    }
}

然后,注释您的测试类:

@OrderWith(RandomOrder.class)

这样,这一类的测试方法是随机运行的。另外,如果它们意外失败,您知道随机种子完全重复此顺序。

我不知道如何为整个项目或测试套件配置它。