TestNG:DataProvider针对特定测试方法的特定数据

时间:2018-04-09 12:45:16

标签: java selenium-webdriver testng testng-dataprovider

是否可以为每个测试方法指定DataProvider的数据。我做了类似的事。

@DataProvider(name = "loginData")
public Object[][] getData(Method m) {
    if (m.getName().equalsIgnoreCase("testValidLogin")) {
        return new Object[][]{
                {"aaa", "qwe123!"}
        };
    }
    if (m.getName().equalsIgnoreCase("testSendMail")){
            return new Object[][]{
                    {"Test@test", "Test", "Hi there!"}
            };
    } else {
        return new Object[][]{
                {"12312312","123qwe"},
        };
   }
}`

有更好的方法吗?我可以为两种测试方法指定一个数据集吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

如果您的测试数据与测试方法相关,则最好将其保留在测试方法中或创建单独的数据提供者。

附加选项是使用测试上下文并通过它从方法到测试方法之前传递所需的参数。

或者你可以建立类似的东西:

public class DataProviderPerMethod {

    @DataProvider(name = "provider")
    public Object[][] provider(Method method) {
        List<TestData> options = Arrays.asList(method.getAnnotation(TestDataOptions.class).value());
        int optionsSize = options.size();
        int optionLength = Objects.requireNonNull(options.get(0)).value().length;
        Object[][] result = new Object[optionsSize][optionLength];
        IntStream.range(0, optionsSize).forEach(i -> result[i] = options.get(i).value());
        return result;
    }

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    @Repeatable(TestDataOptions.class)
    public @interface TestData {
        String[] value();
    }

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface TestDataOptions {
        TestData[] value();
    }


    @TestDataOptions({
            @TestData({"1", "string"}),
            @TestData({"2", "else one string"})
    })
    @Test(dataProvider = "provider")
    public void verifyTestData(String first, String second) {
        System.out.println(first);
        System.out.println(second);
    }

}