0

我正在努力理解我老板分配给我的一些 Java TestNG 代码的执行流程。可惜原作者已经不在我公司了,只能靠我自己了。我已经阅读了一些 TestNG 教程(尤其是这个),但仍有疑问。

这是代码的测试类,它从外部文件了解要运行的测试,运行测试,然后关闭所有内容:

public class MyTestDriver {

    public Object[][] data = null;

    @BeforeSuite
    public void beforeSuite() {
        // open external info file
    }

    @DataProvider(name = "GetConfigData")
    public Object[][] GetSyncConfigData() throws IOException {
        try {
            // Using external file, gather info about individual tests
            // load that info into Object[][] data, I think
        } catch (Exception e) {
            // log errors
        }
        return data;
    }
}

测试可能是异步测试或同步测试,因此这些情况由每个子类处理。这是异步的子类:

public class AsyncAPITest extends MyTestDriver {

    @Test(dataProvider = "GetConfigData")
    public void asyncTestExecution(String RUN, String TYPE, String ENVIRONMENT, String TESTNAME) throws Exception {
        try {
            // run tests
        } catch (Exception e) {
            // log errors
        }
    }
}

熟悉 Java TestNG 的编码人员会发现这些注释。

现在,假设我运行代码并且外部文件指定只应运行一个异步测试。在那种情况下,我确定代码的执行顺序是:

@BeforeSuite
MyTestDriver.beforeSuite()

@DataProvider(name = "GetConfigData")
MyTestDriver.GetSyncConfigData()

@Test(dataProvider = "GetConfigData")
AsyncAPITest.asyncTestExecution()

但这是我不明白的:信息如何从MyTestDriver.GetSyncConfigData()to传递AsyncAPITest.asyncTestExecution()?如果您查看 method asyncTestExecution(),该方法实际上接受了很多参数:

public void asyncTestExecution(String RUN, String TYPE, String ENVIRONMENT, String TESTNAME) throws Exception

是什么提供了这些论点?如果我查看 的代码MyTestDriver.GetSyncConfigData(),我不应该在某处看到这样的东西:

// data initialized as Object[][]
// data = AsyncAPITest.asyncTestExecution(RUN, TYPE, ENVIRONMENT, TESTNAME);
return data;

我只是不明白如何AsyncAPITest.asyncTestExecution()调用,或者是什么提供了这些论点。我主要是因为我想发送更多参数以供以后修改。提前感谢您的任何建议或意见。

4

2 回答 2

1

数据没有意义。@Test 方法的参数由@DataProvider 提供。Dataprovider 的返回类型是 Object[x][y]。x 表示参数集。y 表示参数。

在您的情况下,数据提供者必须为一组 {String RUN, String TYPE, String ENVIRONMENT, String TESTNAME} 返回多个值。TestNG 读取这些集合并提供@Test,每组参数将运行 x 次。

如何?如果您有兴趣,您应该阅读 testng 代码中的实现,但简单地说,TestNG 使用反射 API 搜索注释,在运行时 x 次使用 y 参数创建多个方法并调用它们。

如果您必须添加一个参数,那么您需要向 y 添加一些东西 - 所以您需要让您的数据提供者返回它并且您的测试方法接受它。

于 2021-12-17T02:54:56.350 回答
1

由于您在测试方法的注释中提到了数据提供者的名称,testNG 将扫描任何匹配的数据提供者方法。因此GetSyncConfigData调用了数据提供者方法。现在,数据提供者返回的二维数组中的每个一维数组都代表一个测试用例。因此,如果您的数据大小Object[3][4]为 3,则有 3 个测试用例,每个测试用例为您的测试方法提供 4 个参数。

如果找不到匹配的数据提供者或参数的数量/类型不匹配,则会引发异常。

更多信息

于 2021-12-17T03:05:10.833 回答