使用 DataProvider 进行测试,每次使用不同的 DP 参数重复多次
Test with DataProvider repeated some number of times with a different DP parameter for each time
我有 20 个或更多 table。 table 的数量可能不同。为了确定 table 的数量,我使用 driver.findElements(By.xpath(...)).size() 功能。
对于一个 table 我创建了 DataProvider 方法,即 returns 一个对象:
@DataProvider
public Object[][] tableValues() throws Exception {
.........
int c = 0; // here I use HashMap<String, String> object
//filled with entry.getValue = column label, entry.getKey() = cell value of column
Object obj[][] = new Object[tableMap.size()][4];
print("========== DataProvider object generating...");
print("========== Size of tableMap: "+tableMap.size());
for (Map.Entry entry: tableMap.entrySet()) {
obj[c][0] = fileName;
obj[c][1] = entry.getValue();
obj[c][2] = entry.getKey();
obj[c][3] = false;
c++;
}
obj[tableMap.size()-1][3]=true;
return obj;
}
在这种情况下,第一个 table 的文件名 = "file name 1"。
我使用此对象断言 table 的每个值都可以通过网络搜索功能在数据库中找到。对于搜索,我只使用 entry.getKey 值,但在范围报告中使用文件名和 entry.getValue 来显示值所在的位置。
我在这里对文件名进行了硬编码,仅使用此文件名检查 table 的值。
我想重复 DataProvider 和测试方法 "number of tables" 次,每次都使用从 01 开始的下一个 table 数字。
我可以换一种说法:例如,我有 20 tables。我应该使用 20 个 DataProvider 和 20 个不同的文件名,我应该使用不同的 table 名称 运行 @Test(dataProvider = "tableValues") 20 次。我无法在一个大 DataProvider 中获得 20 table 集。我可以做到,但我不应该这样做,因为 tables 的值可能会在 10-20 分钟后发生变化,并且可能会改变测试结果。我得到有限的行数并快速检查它们。然后我去另一个 table 获取值,断言值等等。
@Test(dataProvider = "tableValues")
public void ValuesAsserting(String fileName, String columnName, String cellValue, boolean flag) throws Exception {
if (cellValue != null) { //Steps:
inputField(cellValue, "searchFieldXpath"); //1
buttonClick("searchButtonXpath"); //2
waitLoaderDisplayed(); //3
waitLoaderHidden(); //4
print("Verifying "+fileName+": "+columnName+": "+cellValue);
logger = extent.createTest("Verifying of "+fileName+" value: "+"\n"+columnName+": "+cellValue);
assertValueIsInResults(cellValue,"searchResultsXpath"); //5
// asserts file's generation time before and after testing
scanTimeAssert(flag); //After tests
}
}
我在 TestNG 文档中找到了解决方案。 @Factory注解有助于解决。
// It is my main class Factory provides with file's number required for xpath to open it and go further:
public class AllTablesTest extends BaseTest {
// It is the main thing I added to get it worked within factory:
private int fNumber;
public AllTablesTest(int fileNumber) {
this.fNumber = fileNumber;
}
........
}
// WebTestFactory class I get from TestNG documentation and changed it to get desirable number of files:
public class WebTestFactory extends BaseTest{
int numberOfFiles;
@Factory
public Object[] createInstances() throws Exception {
getDriver("Chrome");
getUrl("adminUrl");
login(getValue("adminEmail"),getValue("adminPass"));
numberOfFiles = getNumberOfFiles();
Object[] result = new Object[numberOfFiles];
for (int i=0; i<numberOfFiles; i++) {
result[i]=new AllTablesTest(i+1);
}
return result;
}
我有 20 个或更多 table。 table 的数量可能不同。为了确定 table 的数量,我使用 driver.findElements(By.xpath(...)).size() 功能。
对于一个 table 我创建了 DataProvider 方法,即 returns 一个对象:
@DataProvider
public Object[][] tableValues() throws Exception {
.........
int c = 0; // here I use HashMap<String, String> object
//filled with entry.getValue = column label, entry.getKey() = cell value of column
Object obj[][] = new Object[tableMap.size()][4];
print("========== DataProvider object generating...");
print("========== Size of tableMap: "+tableMap.size());
for (Map.Entry entry: tableMap.entrySet()) {
obj[c][0] = fileName;
obj[c][1] = entry.getValue();
obj[c][2] = entry.getKey();
obj[c][3] = false;
c++;
}
obj[tableMap.size()-1][3]=true;
return obj;
}
在这种情况下,第一个 table 的文件名 = "file name 1"。
我使用此对象断言 table 的每个值都可以通过网络搜索功能在数据库中找到。对于搜索,我只使用 entry.getKey 值,但在范围报告中使用文件名和 entry.getValue 来显示值所在的位置。
我在这里对文件名进行了硬编码,仅使用此文件名检查 table 的值。
我想重复 DataProvider 和测试方法 "number of tables" 次,每次都使用从 01 开始的下一个 table 数字。 我可以换一种说法:例如,我有 20 tables。我应该使用 20 个 DataProvider 和 20 个不同的文件名,我应该使用不同的 table 名称 运行 @Test(dataProvider = "tableValues") 20 次。我无法在一个大 DataProvider 中获得 20 table 集。我可以做到,但我不应该这样做,因为 tables 的值可能会在 10-20 分钟后发生变化,并且可能会改变测试结果。我得到有限的行数并快速检查它们。然后我去另一个 table 获取值,断言值等等。
@Test(dataProvider = "tableValues")
public void ValuesAsserting(String fileName, String columnName, String cellValue, boolean flag) throws Exception {
if (cellValue != null) { //Steps:
inputField(cellValue, "searchFieldXpath"); //1
buttonClick("searchButtonXpath"); //2
waitLoaderDisplayed(); //3
waitLoaderHidden(); //4
print("Verifying "+fileName+": "+columnName+": "+cellValue);
logger = extent.createTest("Verifying of "+fileName+" value: "+"\n"+columnName+": "+cellValue);
assertValueIsInResults(cellValue,"searchResultsXpath"); //5
// asserts file's generation time before and after testing
scanTimeAssert(flag); //After tests
}
}
我在 TestNG 文档中找到了解决方案。 @Factory注解有助于解决。
// It is my main class Factory provides with file's number required for xpath to open it and go further:
public class AllTablesTest extends BaseTest {
// It is the main thing I added to get it worked within factory:
private int fNumber;
public AllTablesTest(int fileNumber) {
this.fNumber = fileNumber;
}
........
}
// WebTestFactory class I get from TestNG documentation and changed it to get desirable number of files:
public class WebTestFactory extends BaseTest{
int numberOfFiles;
@Factory
public Object[] createInstances() throws Exception {
getDriver("Chrome");
getUrl("adminUrl");
login(getValue("adminEmail"),getValue("adminPass"));
numberOfFiles = getNumberOfFiles();
Object[] result = new Object[numberOfFiles];
for (int i=0; i<numberOfFiles; i++) {
result[i]=new AllTablesTest(i+1);
}
return result;
}