使用 TestNG DataProvider 跳过某些测试迭代
Skip Certain Test Iterations Using TestNG DataProvider
我正在使用 TestNG DataProvider 读取一个 datapool.xls 文件,该文件包含 1017 个测试用例和一个名为 ReadData 的 class 中的 214 列。
然后我将 214 个字符串参数传递到名为 EnterData 的单独 class 中的 @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" 而不是因为 for 循环而实际执行任何操作的 10。
// Start for loop for entering auto policies
for (int a = start; a <= end; a++)
{
if (quote == a)
{
System.out.println("Tier = " + Tier);
}
}
我明白为什么它将测试总数 运行 显示为整个数据池,因为它在技术上传入并 运行 通过数据池中的所有内容,我只是不知道如何只让它显示实际 运行.
的测试数量
基本上,我正在寻找一种将 @Test 注释本身放入 for 循环的方法,可能吗?...
编辑:
这是我当前在 ReadAutoData Class 中读取数据池的代码:
@DataProvider(name = "autodata")
public static Object[][] autodata() {
Object[][] arrayObject = getExcelData("C:/dev/AutoDP.xls","NON-COMBO-DP");
return arrayObject;
}
/**
* @param File Name
* @param Sheet Name
* @return
*/
public static String[][] getExcelData(String fileName, String sheetName) {
String[][] arrayExcelData = null;
try {
FileInputStream fs = new FileInputStream(fileName);
Workbook wb = Workbook.getWorkbook(fs);
Sheet sh = wb.getSheet(sheetName);
int totalNoOfCols = sh.getColumns();
int totalNoOfRows = sh.getRows();
arrayExcelData = new String[totalNoOfRows-1][totalNoOfCols];
for (int i= 1 ; i < totalNoOfRows; i++) {
for (int j=0; j < totalNoOfCols; j++) {
arrayExcelData[i-1][j] = sh.getCell(j, i).getContents();
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
e.printStackTrace();
} catch (BiffException e) {
e.printStackTrace();
}
return arrayExcelData;
}
编辑 2:
这是我目前在 1017 个测试用例中所处的位置,我现在通过在 for 循环的开头添加以下内容来显示 1007 个跳过:
// Start for loop for entering auto policies
for (int a = start; a <= end; a++)
{
if (quote < start) throw new SkipException("Testing skip.");
if (quote > end) throw new SkipException("Testing skip.");
if (quote == a)
{
System.out.println("Starting Iteration = " + Quote);
然而,它仍然显示 1017 个测试 运行。
您始终可以抛出 TestNG 的 SkipException
以将跳过的执行标记为跳过而不是通过。 SkipException
是一个不被识别为失败的特殊异常。
除此之外,您可以将 ReadAutoData.autodata
修改为 return 更少的数据集(行),例如文件中只有数千个中的前 10 个。
实现这一目标的唯一方法是了解 TestNG 框架的执行方式。
这意味着:
SkipException
不是解决方案,因为它总是计算所有测试用例,即使它们被跳过。
- 测试数是return由
@DataProvider
方法编辑的行数。
然后解决方案是 return 来自 @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...) {
如果您不是 运行 同时测试,这将有效。如果是,您仍然可以使用 ThreadLocal
s.
稍加修改即可使用它
如何通过实现IInvokedMethodListener
和实现方法 beforeInvocation(IInvokedMethod method, ITestResult tr)
创建侦听器 class 在这边,您可以获取测试结果对象并获取参数并决定为此做什么数据集.
Object [] params = tr.getParameters();
// put some logic on params and decide
if ( params is something ) {
tr.setStatus(ITestResult.SKIP);
}
我假设你想 运行 或不 运行 基于参数。
我正在使用 TestNG DataProvider 读取一个 datapool.xls 文件,该文件包含 1017 个测试用例和一个名为 ReadData 的 class 中的 214 列。
然后我将 214 个字符串参数传递到名为 EnterData 的单独 class 中的 @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" 而不是因为 for 循环而实际执行任何操作的 10。
// Start for loop for entering auto policies
for (int a = start; a <= end; a++)
{
if (quote == a)
{
System.out.println("Tier = " + Tier);
}
}
我明白为什么它将测试总数 运行 显示为整个数据池,因为它在技术上传入并 运行 通过数据池中的所有内容,我只是不知道如何只让它显示实际 运行.
的测试数量基本上,我正在寻找一种将 @Test 注释本身放入 for 循环的方法,可能吗?...
编辑:
这是我当前在 ReadAutoData Class 中读取数据池的代码:
@DataProvider(name = "autodata")
public static Object[][] autodata() {
Object[][] arrayObject = getExcelData("C:/dev/AutoDP.xls","NON-COMBO-DP");
return arrayObject;
}
/**
* @param File Name
* @param Sheet Name
* @return
*/
public static String[][] getExcelData(String fileName, String sheetName) {
String[][] arrayExcelData = null;
try {
FileInputStream fs = new FileInputStream(fileName);
Workbook wb = Workbook.getWorkbook(fs);
Sheet sh = wb.getSheet(sheetName);
int totalNoOfCols = sh.getColumns();
int totalNoOfRows = sh.getRows();
arrayExcelData = new String[totalNoOfRows-1][totalNoOfCols];
for (int i= 1 ; i < totalNoOfRows; i++) {
for (int j=0; j < totalNoOfCols; j++) {
arrayExcelData[i-1][j] = sh.getCell(j, i).getContents();
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
e.printStackTrace();
} catch (BiffException e) {
e.printStackTrace();
}
return arrayExcelData;
}
编辑 2:
这是我目前在 1017 个测试用例中所处的位置,我现在通过在 for 循环的开头添加以下内容来显示 1007 个跳过:
// Start for loop for entering auto policies
for (int a = start; a <= end; a++)
{
if (quote < start) throw new SkipException("Testing skip.");
if (quote > end) throw new SkipException("Testing skip.");
if (quote == a)
{
System.out.println("Starting Iteration = " + Quote);
然而,它仍然显示 1017 个测试 运行。
您始终可以抛出 TestNG 的 SkipException
以将跳过的执行标记为跳过而不是通过。 SkipException
是一个不被识别为失败的特殊异常。
除此之外,您可以将 ReadAutoData.autodata
修改为 return 更少的数据集(行),例如文件中只有数千个中的前 10 个。
实现这一目标的唯一方法是了解 TestNG 框架的执行方式。
这意味着:
SkipException
不是解决方案,因为它总是计算所有测试用例,即使它们被跳过。- 测试数是return由
@DataProvider
方法编辑的行数。
然后解决方案是 return 来自 @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...) {
如果您不是 运行 同时测试,这将有效。如果是,您仍然可以使用 ThreadLocal
s.
如何通过实现IInvokedMethodListener
和实现方法 beforeInvocation(IInvokedMethod method, ITestResult tr)
创建侦听器 class 在这边,您可以获取测试结果对象并获取参数并决定为此做什么数据集.
Object [] params = tr.getParameters();
// put some logic on params and decide
if ( params is something ) {
tr.setStatus(ITestResult.SKIP);
}
我假设你想 运行 或不 运行 基于参数。