Java 使用TestNG数据提供程序跳过某些测试迭代

Java 使用TestNG数据提供程序跳过某些测试迭代,java,selenium-webdriver,testng,testng-dataprovider,Java,Selenium Webdriver,Testng,Testng Dataprovider,我正在使用TestNG数据提供程序读取一个datapool.xls文件,该文件在一个名为ReadData的类中包含1017个测试用例和214列 然后,我将214个字符串参数传递到名为EnterData的单独类中的@Test注释中 @Test(dataProvider="autodata", dataProviderClass = ReadAutoData.class) public void autoentry(String Quote, String Garage_Zip, etc...) {

我正在使用TestNG数据提供程序读取一个datapool.xls文件,该文件在一个名为ReadData的类中包含1017个测试用例和214列

然后,我将214个字符串参数传递到名为EnterData的单独类中的@Test注释中

@Test(dataProvider="autodata", dataProviderClass = ReadAutoData.class)
public void autoentry(String Quote, String Garage_Zip, etc...) {
我在@Test中创建了一个for循环,只执行ceratin迭代(比如1-10)的操作,总共只输入10个测试用例。我的问题是,在运行结束时,它仍然显示“Total tests run:1017”,而不是仅显示10个测试,因为for循环实际执行了任何操作

// Start for loop for entering auto policies
for (int a = start; a <= end; a++)
{
    if (quote == a)
    {       
        System.out.println("Tier = " + Tier);                       
    } 
}
//启动用于输入自动策略的循环

对于(int a=start;a您始终可以抛出TestNG的
SkipException
,将跳过的执行标记为已跳过而不是已通过。
SkipException
是一种特殊的异常,不会被识别为失败


除此之外,您可以修改
ReadAutoData.autodata
以返回更少的数据集(行),例如,仅返回文件中数千行中的前10行。

实现这一点的唯一方法是了解TestNG框架如何执行。

这意味着:

  • SkipException
    不是解决方案,因为它将始终统计所有测试用例,即使它们被跳过
  • 测试数是
    @DataProvider
    方法返回的行数
  • 解决方案是从
    @DataProvider
    注释的方法返回正确数量的测试用例:

    public class ReadAutoData {
        private static int indexFrom;
        private static int indexTo;
    
        @DataProvider(name = "autodata")
        public static Object[][] autodata() {
            // you should probably cache this into static variable
            Object[][] arrayObject = getExcelData("C:/dev/AutoDP.xls","NON-COMBO-DP"); 
    
            return java.util.Arrays.copyOfRange(arrayObject, indexFrom, indexTo);
        }
    
        public Class<?> autoDataWithinRange(int from, int to) {
            indexFrom = from;
            indexTo   = to;
    
            return ReadAutoData.class;
        }
    }
    
    @Test(dataProvider="autodata", dataProviderClass = ReadAutoData.autoDataWithinRange(0, 10))
    public void autoentry(String Quote, String Garage_Zip, etc...) {
    
    公共类ReadAutoData{
    私有静态int-indexFrom;
    私有静态int索引;
    @数据提供者(name=“autodata”)
    公共静态对象[][]自动数据(){
    //您可能应该将其缓存到静态变量中
    对象[][]arrayObject=getExcelData(“C:/dev/AutoDP.xls”,“非组合-DP”);
    返回java.util.Arrays.copyOfRange(arrayObject、indexFrom、indexTo);
    }
    公共类autoDataWithinRange(int-from,int-to){
    indexFrom=from;
    indexTo=to;
    返回ReadAutoData.class;
    }
    }
    @测试(dataProvider=“autodata”,dataProviderClass=ReadAutoData.autoDataWithinRange(0,10))
    公共无效自动输入(字符串引号、字符串压缩等){
    

    如果您不同时运行测试,这将起作用。如果您同时运行测试,您仍然可以使用
    ThreadLocal
    s对其进行少量修改。

    如何通过在调用之前实现
    IInvokedMethodListener
    和实现方法
    来创建侦听器类(IInvokedMethod,ITestResult tr)
    在这一方面,您可以获取测试结果对象并获取参数,并决定如何处理该数据集

    Object [] params = tr.getParameters();
    // put some logic on params and decide
    if ( params is something ) {
    tr.setStatus(ITestResult.SKIP);
    }
    

    我假设您希望根据参数运行或不运行。

    您同意显示10个已执行的rest skipped吗?是的,这正是我想要的。是什么阻止您将测试的决策逻辑放入数据提供程序本身,从而只发送您希望运行的10个测试?因为我不准确我确定如何只告诉@DataProvider要获取哪些行。我目前正在尝试实现Crazy的方法。您可以通过测试本身将索引发送到DataProvider。您可以查看本文我喜欢您要去的地方,但我想我无法正确地实现它。当我使用SkipException时,它运行了10个测试用例,但是,显示了所有跳过的1017个测试。我不确定如何让它只加载我想要运行的测试用例。假设我想从20开始,然后转到30,等等。请参阅编辑2。我已经让它至少显示了现在跳过了多少个测试。问题是它仍然显示所有1017个测试正在运行。好吧,我已经尝试实现了如果这样做,并且在尝试将dataProviderClass传递给@Test(如您所述)时,我会遇到以下错误:“注释属性Test.dataProviderClass的值必须是类文本”.你是对的。在这种情况下,你将不得不做一点不同的事情,但重点仍然是一样的。明白了!!!!非常感谢你的帮助。通过这一点我学到了很多。我现在让@DataProvider读取一个.properties文件,从数据池运行迭代,并将其传递到indexFrom(-1)还有indexTo,它像做梦一样工作。
    public class ReadAutoData {
        private static int indexFrom;
        private static int indexTo;
    
        @DataProvider(name = "autodata")
        public static Object[][] autodata() {
            // you should probably cache this into static variable
            Object[][] arrayObject = getExcelData("C:/dev/AutoDP.xls","NON-COMBO-DP"); 
    
            return java.util.Arrays.copyOfRange(arrayObject, indexFrom, indexTo);
        }
    
        public Class<?> autoDataWithinRange(int from, int to) {
            indexFrom = from;
            indexTo   = to;
    
            return ReadAutoData.class;
        }
    }
    
    @Test(dataProvider="autodata", dataProviderClass = ReadAutoData.autoDataWithinRange(0, 10))
    public void autoentry(String Quote, String Garage_Zip, etc...) {
    
    Object [] params = tr.getParameters();
    // put some logic on params and decide
    if ( params is something ) {
    tr.setStatus(ITestResult.SKIP);
    }