Testng 如何只运行一次每个测试?

Testng 如何只运行一次每个测试?,testng,Testng,例如,我有下一套测试。三组。我想运行下一个组序列: 冒烟 特征1 特征2 我不想运行两次测试,例如,smokeAndFeature1测试 我可以仅使用testNG归档此目标吗 从我的角度来看,我看到了几种解决方案: 使用java而不是xml创建测试套件 使用god对象存储有关已执行测试用例的元数据,若测试在之前执行,则跳过侦听器中的测试 在标记中使用BeanShell脚本 公共类组测试{ private static final String SMOKE = "SMOKE"; private

例如,我有下一套测试。三组。我想运行下一个组序列:

  • 冒烟
  • 特征1
  • 特征2
我不想运行两次测试,例如,smokeAndFeature1测试

我可以仅使用testNG归档此目标吗

从我的角度来看,我看到了几种解决方案:

  • 使用java而不是xml创建测试套件
  • 使用god对象存储有关已执行测试用例的元数据,若测试在之前执行,则跳过侦听器中的测试
  • 标记中使用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,谢谢,我在下面回答