以随机顺序运行TestNG测试

sle*_*ske 5 testing testng unit-testing

我如何使我的JUnit测试以随机顺序运行相似,我希望TestNG以随机顺序运行我的测试,因此无意识的依赖关系无法进入.

TestNG的手册指出:

默认情况下,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>
Run Code Online (Sandbox Code Playgroud)

该软件包testngtests包含两个测试类(MyTest1,MyTest2),这些类包含一些空方法,如下所示:

@Test
public void testOne(){

}
Run Code Online (Sandbox Code Playgroud)

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

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

那么文档错了吗?

或者"随机顺序"只是表示"没有保证订单"?然后,我如何让TestNG主动随机化测试订单?

Ced*_*ust 5

是的,"随机"应该是"不可预测的".

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


Joe*_*Joe 5

为了扩展Cedric Beust的答案,这是我执行此操作的代码,并从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;
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用它,请将其添加到测试类之前:

import org.testng.annotations.Listeners;

@Listeners(TestOrderRandomizer.class)
public class TesterClass {
...
Run Code Online (Sandbox Code Playgroud)

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