如何使返回多个对象的TestNG @DataProvider只返回一个?

时间:2015-03-17 11:09:28

标签: java selenium testng

我关注@DataProvider

@DataProvider(name = "CredentialsProvider", parallel = true)
public static Object[][] credentialsProvider() {

    ...

    for (int i = 0; i < login.size(); i++) {
        credentials[i] = new Object[] {login.get(i)[0], password.get(i)[0]};
    }
    return credentials;
}

它用于生成以并行模式运行的测试凭据:

@Test(dataProvider = "CredentialsProvider")
public void Login (String login, String password)

但有时候我想在单次运行的测试中使用相同的@DataProvider。我希望在invocationCount方法中使用@Test会有所帮助,但这是错误的。是否有任何解决方案只调用@DataProvider一次,无论提供者返回的对象数量如何,而不更改它的来源?

2 个答案:

答案 0 :(得分:0)

AFAIK您只能在数据提供者方面处理此问题。

@DataProvider(name = "CredentialsProvider", parallel = true)
public static Object[][] credentialsProvider(Method method) { ... }

@DataProvider(name = "CredentialsProvider", parallel = true)
public static Object[][] credentialsProvider(ITestContext context) { ... }

在这两种情况下,您都可以从使用数据提供程序的测试用例的上下文中获取信息。在第一种情况下,例如method.getName();为您提供@Test方法的名称。在第二种情况下,context.getName();为您提供测试套件中测试用例(<test name="TestName">)的名称。

我的意思是这样的:

for (int i = 0; i < login.size(); i++) {
    credentials[i] = new Object[] {login.get(i)[0], password.get(i)[0]};
    if(i > MAX_COUNT && "EXPECTED_TEST_NAME".equals(context.getName())) { break; }
}

答案 1 :(得分:0)

使您的DataProvider接受Method类型的参数,并编写您自己的自定义注释来处理此问题。类似的东西:

@DataProvider(name = "CredentialsProvider", parallel = true)
public static Object[][] credentialsProvider(Method method) {
    //code to extract custom annotation value
    ....
}

@Test(dataProvider = "CredentialsProvider")
@RunCount(1)
public void test(String login, String password) {
....
}