Java 使用TestNG数据提供程序跳过某些测试迭代
我正在使用TestNG数据提供程序读取一个datapool.xls文件,该文件在一个名为ReadData的类中包含1017个测试用例和214列 然后,我将214个字符串参数传递到名为EnterData的单独类中的@Test注释中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...) {
@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);
}