使用 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;
    }