每次使用不同的DP参数重复使用DataProvider进行测试多次

时间:2019-02-06 12:42:42

标签: java selenium testng-dataprovider

我有20张或更多张桌子。表的数量可以不同。要确定表数,我使用driver.findElements(By.xpath(...))。size()功能。

对于一个表,我创建了DataProvider方法,该方法返回一个对象:

@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;
}

在这种情况下,我的第一个表具有fileName =“ file name 1”。

我使用此对象断言可以通过Web搜索功能在数据库中找到表的每个值。对于搜索,我仅使用entry.getKey值,但在范围报告中使用fileName和entry.getValue来显示该值的位置。

我在这里将fileName硬编码,仅检查具有此fileName的表的值。

我想重复DataProvider和Test方法的“表数”次,每次使用从01开始的下一个表数。 我可以用不同的方式说:例如,我有20张桌子。我应该使用20个具有20个不同文件名的DataProvider,并且还应该使用不同的表名运行@Test(dataProvider =“ tableValues”)20次。我在一个大型DataProvider中无法获得20个表集。我可以这样做,但我不应该这样做,因为表的值可能会在10-20分钟后发生变化,并且可能会更改测试结果。我得到有限的行数并快速检查它们。然后我转到另一个获取值,声明值等的表。

@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
    }
}

1 个答案:

答案 0 :(得分:0)

我在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;
    }