自定义类数组为TestNG中的@DataProvider

时间:2016-09-05 13:52:41

标签: java selenium testng

我想知道是否有办法将@Test方法的所有参数打包成一个类Name并提供Name []作为@DataProvider? public class FirstTestClass {   @Test(dataProvider =" getNames")   public void test01(名称){     System.out.println(name.name +"" + name.id);   }   @dataProvider   public Name [] getNames(){       名称[] result = new Name [2];       result [0] =新名称(" john",5);       结果[1] =新名称(" doe",4);       返回结果;   } } 班级名称 {     public String name;     public Integer id;     public Name(String name,Integer id){         this.name = name;         this.id = id;    } } 测试被跳过,我收到一条消息,说必须返回Object [] []或Iterator<> []。这有限吗?有什么解决方法吗?

5 个答案:

答案 0 :(得分:1)

为什么使用仅有1列的二维数组无法做同样的事情。你有什么具体要求吗?像这样的东西

@Test(dataProvider = "getNames")
public void test01(Name name) {
    System.out.println(name.name + " " + name.id);
}

@DataProvider
public Object[][] getNames() {
    Name[][] result = new Name[2][1];
    result[0][0] = new Name("john", 5);
    result[1][0] = new Name("doe", 4);
    return result;
}

我测试了你的代码,我建议它的工作正常。

答案 1 :(得分:0)

将其更改为

@DataProvider
public Name[][] getNames() {
   Name[][] result = new Name[2][];
   result[0] = {new Name("john", 5)};
   result[1] = {new Name("doe", 4)};
   return result;
}

答案 2 :(得分:0)

我不知道为什么你使用一个专门的类来保存所有属性,但你应该考虑这样的事情:

public class FirstTestClass {

  @Test(dataProvider = "getNames")
  public void test01(String name, Integer id) {
    System.out.println(name + " " + id);
  }

  @DataProvider
  public Object[][] getNames() {
    return new Object[][] {
      new Object[] { "john", 5 },
      new Object[] { "doe", 4 }
    }
  }
}

答案 3 :(得分:0)

在JUnit 4.x中,以下是实现上述方案的方法。

status=$(curl -I https://example.com/health_check.jsp 2> /dev/null | head -n 1 | cut -d ' ' -f 2)
if [[ $status = "200" ]]; then
    echo 0
else
    echo 1
fi

我希望在TestNG中有类似的东西,我被告知它比JUnit更灵活,更强大。事实证明,我们只返回@DataProvider方法中的Object [] []。

答案 4 :(得分:0)

我现在理解你的问题,你想要一个TestNG翻译:

@RunWith(Parameterized.class)
public class FirstTest {
    private LoginCredentials loginData;

    public FirstTest(LoginCredentials testData) {
        loginData = testData;
    }

    @Parameterized.Parameters
    public static LoginCredentials[] generateTestData() {
        return ReadingExcelSheets.generateTestData();
    }
}

解决方案可能是:

public class FirstTest {

    private final LoginCredentials loginData;

    @Factory(dataprovider = "generateTestData")
    public FirstTest(LoginCredentials testData) {
        loginData = testData;
    }

    @Test
    public void test01() {
        System.out.println(loginData);
    }

    @DataProvider
    public static Object[][] generateTestData() {
        return convert(ReadingExcelSheets.generateTestData());
    }

    public static Object[][] convert(LoginCredentials[] values) {
        Object[][] result = new Object[values.length];
        for (int i=0; i<result.length; i++) {
            result[i] = new Object[]{ values[i] };
        }
        return result;
    }
}

或者

public class FirstTest {

    @Test(dataprovider = "generateTestData")
    public void test01(LoginCredentials loginData) {
        System.out.println(loginData);
    }

    @DataProvider
    public static Object[][] generateTestData() {
        return convert(ReadingExcelSheets.generateTestData());
    }

    public static Object[][] convert(LoginCredentials[] values) {
        Object[][] result = new Object[values.length];
        for (int i=0; i<result.length; i++) {
            result[i] = new Object[]{ values[i] };
        }
        return result;
    }
}

但是好的,TestNG可以提供convert方法本身和/或管理Object[]作为开箱即用的有效返回类型。

随意在http://github.com/cbeust/testng上提出补丁 随时欢迎帮助:)