以随机顺序运行TestNG测试

时间:2011-10-04 12:56:05

标签: unit-testing testing testng

How can I make my JUnit tests run in random order?类似,我希望TestNG以随机顺序运行我的测试,因此无意识的依赖关系无法进入。

TestNG manual states

  

默认情况下,TestNG将运行testng.xml文件中的测试   随机顺序。

但是,我创建了一个小型测试项目,其中包含一个简单的testng.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="My suite">
    <test name="Simple test">
        <packages>
            <package name="testngtests"></package>
        </packages>
    </test>
</suite>

testngtests包含两个测试类(MyTest1,MyTest2),它们包含一些空方法,如下所示:

@Test
public void testOne(){

}

测试方法都是空的,只是名称不同。

当我运行它们(使用Eclipse TestNG运行程序或在命令行上)时,测试按照相同的顺序运行(即按字母顺序排序,首先按类排序,然后按方法名称排序)。

文档错误吗?

或“按随机顺序”只是表示“没有保证订单”?那么我如何让TestNG主动随机化测试顺序呢?

2 个答案:

答案 0 :(得分:5)

是的,“随机”应该是“不可预测的”。

如果你想要真正的随机化,请查找IMethodInterceptor,其中TestNG将为您提供将订购更改为您喜欢的任何内容的机会。

答案 1 :(得分:4)

要展开Cedric Beust's answer,请在this example from GitHub的帮助下找到执行此操作的代码:

import org.testng.IMethodInstance;
import org.testng.IMethodInterceptor;
import org.testng.ITestContext;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class TestOrderRandomizer implements IMethodInterceptor {
    @Override
    public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {
        long seed = System.nanoTime();
        System.out.println(String.format("Randomizing order of tests with seed: %s", seed));
        Collections.shuffle(methods, new Random(seed));
        return methods;
    }
}

要使用它,请在测试类之前添加:

import org.testng.annotations.Listeners;

@Listeners(TestOrderRandomizer.class)
public class TesterClass {
...

打印种子可以通过再次种植相同的种子来重现运行顺序。