TestNG Dataprovider 需要帮助 运行 @Test 根据测试数据单独进行
TestNG Dataprovider Need help to run @Test individually based on test data
我正在进行 Rest API 测试(POST 方法),我正在使用 TestNg Dataprovider 从电子表格中读取 json 数据。
我的 Dataprovider returns HashMap 键:整数 Row_Number 和值:测试数据的 ArrayList (String)。下面是 DataProvider 返回的示例地图。
{0=[样品 1、名称 1、样品 1.名称 1@example.com、(000) 111-1111]、1=[样品 2、名称 2、样品 2.名称 2@example.com、(000 ) 111-1112]}
我当前的 Dataprovider 实现是,
@DataProvider
public Object[][] JSONBODY()
{
String test_data = "json_data";
int row = ExcelUtils.getRowNum(test_data, col_num);
int total_col = ExcelUtils.getLastColumnNumber(row);
Map<Integer, ArrayList<String>> map = ExcelUtils.getTableArray(spreadsheet_location,test_data,total_col);
return new Object[][] { { map } };
}
getTableArray 实现
public static Map<Integer, ArrayList<String>> getTableArray(String FilePath, String testdata, int total_Col) throws Exception {
Map<Integer, ArrayList<String>> map = new HashMap<Integer, ArrayList<String>>();
ArrayList<Integer> iTestCaseRow = null;
try
{
FileInputStream ExcelFile = new FileInputStream(FilePath);
ExcelWBook = new XSSFWorkbook(ExcelFile);
ExcelWSheet = ExcelWBook.getSheet(SheetName);
int startCol = 1;
iTestCaseRow = ExcelUtils.getRowContains(testdata ,col_num); // getRowContains returns list of row numbers for value in testdata.
int totalRows = iTestCaseRow.size();
int totalCols = total_Col;
for(int i=0; i<totalRows;i++)
{
ArrayList<String> str = new ArrayList<String>();
for (int j=startCol;j<=totalCols;j++)
{
str.add (ExcelUtils.getCellData(iTestCaseRow.get(i),j));
}
map.put(iTestCaseRow.get(i), str);
}
return map;
}
}
测试方法
@Test(dataProvider = "JSONBODY")
public void TestMethod(Map<Integer, ArrayList<String>> map) throws Exception {
try
{
Log.startTestCase("Start executing Test Case");
Set<Integer> key = map.keySet();
for(Integer row: key)
{
SamplePojo pojo = new SamplePojo();
ArrayList<String> data = map.get(row);
pojo.setFirstName(data.get(0));
pojo.setLastName(data.get(1));
pojo.setEmail(data.get(2));
pojo.setPhone(data.get(3));
Response res = RestAssured.given().contentType(ContentType).body(pojo).when().post(POST_URL);
Log.info(res.asString());
Assert.assertTrue(res.getStatusCode() == 200 , "Test Case failed");
}
}
}
电子表格测试数据是,
Spreadsheet Data
当我执行我的@Test 方法时,TestNG 作为一个方法而不是两个方法执行,因为我在电子表格中有 2 行测试数据(值:json_data)。
请帮助我 运行 每个 key:value 对的测试方法。
提前致谢!
问题出在您的数据提供程序中。
获得地图后,您需要转换该地图,使其中的每个条目现在都是 2D 对象数组的一部分。在您的情况下,您基本上只是将整个地图添加为二维对象数组中的一个数据项。
请参阅下面的完整示例,了解我所指的内容。为了方便起见,我基本上排除了excel电子表格阅读逻辑等,
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestClass {
@Test(dataProvider = "dp")
public void testMethod(Map<Integer, List<String>> data) {
Assert.assertTrue(data.size() == 1);
List<String> values = data.values().iterator().next();
System.err.println("Values = " + values);
}
@DataProvider(name = "dp")
public Object[][] getData() {
Map<Integer, List<String>> data = getTableArray();
//Transform the Map into a 2D array such that every key/value
//pair in the map becomes one element in the 2D array
int size = data.size();
Object[][] dataToUse = new Object[size][1];
int i = 0;
for (Map.Entry<Integer, List<String>> entry : data.entrySet()) {
Map<Integer, List<String>> localMap = new HashMap<>();
localMap.put(entry.getKey(), entry.getValue());
dataToUse[i++] = new Object[]{localMap};
}
return dataToUse;
}
static Map<Integer, List<String>> getTableArray() {
Map<Integer, List<String>> data = new HashMap<>();
data.put(1, Arrays.asList("Sample1", "Name1", "sample1.name1@gmail.com", "(000) 111-1111"));
data.put(2, Arrays.asList("Sample2", "Name2", "sample2.name2@gmail.com", "(000) 111-1112"));
data.put(3, Arrays.asList("Sample3", "Name3", "sample3.name3@gmail.com", "(000) 111-1113"));
return data;
}
}
这是输出
Values = [Sample1, Name1, sample1.name1@gmail.com, (000) 111-1111]
Values = [Sample2, Name2, sample2.name2@gmail.com, (000) 111-1112]
Values = [Sample3, Name3, sample3.name3@gmail.com, (000) 111-1113]
===============================================
Default Suite
Total tests run: 3, Failures: 0, Skips: 0
===============================================
两个选项:
Map<Integer, ArrayList<String>> map = ExcelUtils.getTableArray(spreadsheet_location,test_data,total_col);
Object[][] dataToBeReturned = new Object[map.size()][];
//Loop through map and build your array..code not tested..something to the effect
for(Entry<Integer, Arra..> datum : map.entrySet()) {
dataToBeReturned[i++] = new Object[] {datum.getKey(), datum.getValue()}
}
return dataToBeReturned;
或者在你的 excelreader 本身,因为你在任何情况下都在循环数据,要么把它放在一个数组而不是地图中 - 比如
instead of map.put(iTestCaseRow.get(i), str);
use dataToBeReturned[i++] = new Object[] {iTestCaseRow.get(i), str}
我正在进行 Rest API 测试(POST 方法),我正在使用 TestNg Dataprovider 从电子表格中读取 json 数据。 我的 Dataprovider returns HashMap 键:整数 Row_Number 和值:测试数据的 ArrayList (String)。下面是 DataProvider 返回的示例地图。 {0=[样品 1、名称 1、样品 1.名称 1@example.com、(000) 111-1111]、1=[样品 2、名称 2、样品 2.名称 2@example.com、(000 ) 111-1112]}
我当前的 Dataprovider 实现是,
@DataProvider
public Object[][] JSONBODY()
{
String test_data = "json_data";
int row = ExcelUtils.getRowNum(test_data, col_num);
int total_col = ExcelUtils.getLastColumnNumber(row);
Map<Integer, ArrayList<String>> map = ExcelUtils.getTableArray(spreadsheet_location,test_data,total_col);
return new Object[][] { { map } };
}
getTableArray 实现
public static Map<Integer, ArrayList<String>> getTableArray(String FilePath, String testdata, int total_Col) throws Exception {
Map<Integer, ArrayList<String>> map = new HashMap<Integer, ArrayList<String>>();
ArrayList<Integer> iTestCaseRow = null;
try
{
FileInputStream ExcelFile = new FileInputStream(FilePath);
ExcelWBook = new XSSFWorkbook(ExcelFile);
ExcelWSheet = ExcelWBook.getSheet(SheetName);
int startCol = 1;
iTestCaseRow = ExcelUtils.getRowContains(testdata ,col_num); // getRowContains returns list of row numbers for value in testdata.
int totalRows = iTestCaseRow.size();
int totalCols = total_Col;
for(int i=0; i<totalRows;i++)
{
ArrayList<String> str = new ArrayList<String>();
for (int j=startCol;j<=totalCols;j++)
{
str.add (ExcelUtils.getCellData(iTestCaseRow.get(i),j));
}
map.put(iTestCaseRow.get(i), str);
}
return map;
}
}
测试方法
@Test(dataProvider = "JSONBODY")
public void TestMethod(Map<Integer, ArrayList<String>> map) throws Exception {
try
{
Log.startTestCase("Start executing Test Case");
Set<Integer> key = map.keySet();
for(Integer row: key)
{
SamplePojo pojo = new SamplePojo();
ArrayList<String> data = map.get(row);
pojo.setFirstName(data.get(0));
pojo.setLastName(data.get(1));
pojo.setEmail(data.get(2));
pojo.setPhone(data.get(3));
Response res = RestAssured.given().contentType(ContentType).body(pojo).when().post(POST_URL);
Log.info(res.asString());
Assert.assertTrue(res.getStatusCode() == 200 , "Test Case failed");
}
}
}
电子表格测试数据是, Spreadsheet Data
当我执行我的@Test 方法时,TestNG 作为一个方法而不是两个方法执行,因为我在电子表格中有 2 行测试数据(值:json_data)。 请帮助我 运行 每个 key:value 对的测试方法。 提前致谢!
问题出在您的数据提供程序中。 获得地图后,您需要转换该地图,使其中的每个条目现在都是 2D 对象数组的一部分。在您的情况下,您基本上只是将整个地图添加为二维对象数组中的一个数据项。
请参阅下面的完整示例,了解我所指的内容。为了方便起见,我基本上排除了excel电子表格阅读逻辑等,
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestClass {
@Test(dataProvider = "dp")
public void testMethod(Map<Integer, List<String>> data) {
Assert.assertTrue(data.size() == 1);
List<String> values = data.values().iterator().next();
System.err.println("Values = " + values);
}
@DataProvider(name = "dp")
public Object[][] getData() {
Map<Integer, List<String>> data = getTableArray();
//Transform the Map into a 2D array such that every key/value
//pair in the map becomes one element in the 2D array
int size = data.size();
Object[][] dataToUse = new Object[size][1];
int i = 0;
for (Map.Entry<Integer, List<String>> entry : data.entrySet()) {
Map<Integer, List<String>> localMap = new HashMap<>();
localMap.put(entry.getKey(), entry.getValue());
dataToUse[i++] = new Object[]{localMap};
}
return dataToUse;
}
static Map<Integer, List<String>> getTableArray() {
Map<Integer, List<String>> data = new HashMap<>();
data.put(1, Arrays.asList("Sample1", "Name1", "sample1.name1@gmail.com", "(000) 111-1111"));
data.put(2, Arrays.asList("Sample2", "Name2", "sample2.name2@gmail.com", "(000) 111-1112"));
data.put(3, Arrays.asList("Sample3", "Name3", "sample3.name3@gmail.com", "(000) 111-1113"));
return data;
}
}
这是输出
Values = [Sample1, Name1, sample1.name1@gmail.com, (000) 111-1111]
Values = [Sample2, Name2, sample2.name2@gmail.com, (000) 111-1112]
Values = [Sample3, Name3, sample3.name3@gmail.com, (000) 111-1113]
===============================================
Default Suite
Total tests run: 3, Failures: 0, Skips: 0
===============================================
两个选项:
Map<Integer, ArrayList<String>> map = ExcelUtils.getTableArray(spreadsheet_location,test_data,total_col);
Object[][] dataToBeReturned = new Object[map.size()][];
//Loop through map and build your array..code not tested..something to the effect
for(Entry<Integer, Arra..> datum : map.entrySet()) {
dataToBeReturned[i++] = new Object[] {datum.getKey(), datum.getValue()}
}
return dataToBeReturned;
或者在你的 excelreader 本身,因为你在任何情况下都在循环数据,要么把它放在一个数组而不是地图中 - 比如
instead of map.put(iTestCaseRow.get(i), str);
use dataToBeReturned[i++] = new Object[] {iTestCaseRow.get(i), str}