sle*_*ske 5 testing testng unit-testing
与我如何使我的JUnit测试以随机顺序运行相似?,我希望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主动随机化测试订单?
为了扩展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)
打印种子可以通过再次种植相同的种子来重现运行顺序。