Testng 如何只运行一次每个测试?
例如,我有下一套测试。三组。我想运行下一个组序列:Testng 如何只运行一次每个测试?,testng,Testng,例如,我有下一套测试。三组。我想运行下一个组序列: 冒烟 特征1 特征2 我不想运行两次测试,例如,smokeAndFeature1测试 我可以仅使用testNG归档此目标吗 从我的角度来看,我看到了几种解决方案: 使用java而不是xml创建测试套件 使用god对象存储有关已执行测试用例的元数据,若测试在之前执行,则跳过侦听器中的测试 在标记中使用BeanShell脚本 公共类组测试{ private static final String SMOKE = "SMOKE"; private
- 冒烟
- 特征1
- 特征2
标记中使用BeanShell脚本
公共类组测试{
private static final String SMOKE = "SMOKE";
private static final String FEATURE_1 = "FEATURE_1";
private static final String FEATURE_2 = "FEATURE_2";;
@Test(groups = {SMOKE})
public void smokeOnly(){
System.out.println("smokeOnly");
}
@Test(groups = {FEATURE_1})
public void feature1Only() {
System.out.println("feature1Only");
}
@Test(groups = {FEATURE_2})
public void feature2Only() {
System.out.println("feature2Only");
}
@Test(groups = {FEATURE_1, SMOKE})
public void smokeAndFeature1() {
System.out.println("smokeAndFeature1");
}
@Test(groups = {FEATURE_2, SMOKE})
public void smokeAndFeature2() {
System.out.println("smokeAndFeature2");
}
@Test(groups = {FEATURE_2, FEATURE_1})
public void feature1AndFeature2() {
System.out.println("feature1AndFeature2");
}
@Test(groups = {SMOKE, FEATURE_2, FEATURE_1})
public void smokeFeature1AndFeature2() {
System.out.println("smokeFeature1AndFeature2");
}
}最后,我发现我想做什么。我放弃了使用小组的想法。它只需要运行一个测试 例如,如果我有4台设备要运行,第一台设备将只启动第1、5、9等测试。第二台设备第二台、第六台、第十台等 我使用了testng提供的方法选择器机制 我的方法选择器实现:
import org.testng.IMethodSelector;
import org.testng.IMethodSelectorContext;
import org.testng.ITestNGMethod;
import java.util.List;
public class ParallelExecutionMethodSelector implements IMethodSelector {
private int counter = 1;
private int part = 1;
@Override
public boolean includeMethod(IMethodSelectorContext context, ITestNGMethod method, boolean isTestMethod) {
if (isTestMethod) {
final int testIndex = 1 + method.getXmlTest().getIndex();
final int partVal = part;
final int testNumber = method.getXmlTest().getSuite().getTests().size();
// split a list of test in chunks
if (counter / partVal == testNumber ) {
part++;
}
// pick up only a test with the value id as current test index
boolean include = (counter - testNumber * (partVal - 1) == testIndex);
// To disable the next method selector class
context.setStopped(true);
counter++;
return include;
}
return false;
}
@Override
public void setTestMethods(List<ITestNGMethod> testMethods) {
}
}
import org.testng.IMethodSelector;
导入org.testng.IMethodSelectorContext;
导入org.testng.ITestNGMethod;
导入java.util.List;
公共类ParallelExecutionMethodSelector实现IMethodSelector{
专用整数计数器=1;
私有整数部分=1;
@凌驾
公共布尔includeMethod(IMethodSelectorContext上下文、ITestNGMethod方法、布尔isTestMethod){
如果(isTestMethod){
final int testIndex=1+method.getXmlTest().getIndex();
最终int partVal=零件;
final int testNumber=method.getXmlTest().getSuite().getTests().size();
//将测试列表拆分为块
if(计数器/partVal==testNumber){
部分++;
}
//仅选取值id为当前测试索引的测试
布尔include=(计数器-testNumber*(partVal-1)=testIndex);
//禁用下一个方法选择器类
context.setStopped(true);
计数器++;
回报包括;
}
返回false;
}
@凌驾
公共void setTestMethods(列出测试方法){
}
}
我在下一个testngxml配置中使用它
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Debug" parallel="tests" thread-count="4">
<method-selectors>
<method-selector>
<selector-class name="com.example.ParallelExecutionMethodSelector" />
</method-selector>
</method-selectors>
<test name="Debug Thread-1" enabled="true">
<parameter name="deviceName" value="22456BDE5D448B047D8A4"/>
<packages>
<package name="com.mobile.tests.*" />
</packages>
</test>
<test name="Debug Thread-2" enabled="true">
<parameter name="deviceName" value="2F212D84C28C8AED24F0E"/>
<packages>
<package name="com.mobile.tests.*" />
</packages>
</test>
<test name="Debug Thread-3" enabled="true">
<parameter name="deviceName" value="A91730017660D2215CA6A"/>
<packages>
<package name="com.mobile.tests.*" />
</packages>
</test>
<test name="Debug Thread-4" enabled="true">
<parameter name="deviceName" value="3AFEC04596F29DA3A7948"/>
<packages>
<package name="com.mobile.tests.*" />
</packages>
</test>
</suite>
如果将@Test
方法绑定到两个或多个组,并将它们包含在执行计划中,则无法执行此操作。如果一个@Test
方法是两个或更多组的一部分,并且您选择了所有这些组,那么TestNG将执行这些方法很多次。@Krishnan Mahadevan,谢谢,我在下面回答