2016-09-05 15 views
0

Я хотел бы знать, если есть способ, чтобы упаковать все параметры метода @Test в один класс Name и обеспечить Name[] как @DataProvider?Пользовательские массивы класса как @DataProvider в TestNG

public class FirstTestClass { 

    @Test (dataProvider = "getNames") 
    public void test01(Name name) { 
    System.out.println(name.name + " " + name.id); 
    } 
    @DataProvider 
    public Name[] getNames() { 
     Name[] result = new Name[2]; 
     result[0] = new Name("john", 5); 
     result[1] = new Name("doe", 4); 
     return result; 
    } 
} 

class Name { 
    public String name; 
    public Integer id; 
    public Name(String name, Integer id) { 
     this.name = name; 
     this.id = id; 
    } 
} 

тест становится пропускаются, и я получаю сообщение о том, must return either Object[][] or Iterator<>[]. Это своего рода ограниченное право? Любое обходное решение для этого?

ответ

0

Изменить его

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

на мой взгляд это очень ограниченный ... JUnit имеет параметризованные методы, которые принимают настраиваемые массивы классов в качестве поставщиков данных ... позволяет сказать, что я хочу проверить автоматическое заполнение формы из БД ... возвращенная строка таблицы будет иметь так многие поля ... подпись метода не может содержать все переменные вправо? TestNG очень ограничен в этом аспекте .... –

+0

@ChandrachudNanduri f вам нравится 'JUnit' вы должны использовать его. Но здесь у вас есть один и тот же пользовательский класс, только завернутый внутри массива. Я не думаю, что это большое дело. – talex

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 } 
    } 
    } 
} 
+0

, на мой взгляд, это очень ограниченный ... JUnit имеет параметризованные методы, которые принимают пользовательские массивы классов в качестве поставщиков данных ... позволяет сказать, что хочу проверить автоматическое заполнение формы из БД ... в возвращаемой строке таблицы будет так много полей ... подпись метода не может содержать все переменные вправо? TestNG очень ограничен в этом аспекте .... –

+0

Я не понимаю вашу точку зрения. Не могли бы вы поделиться своим junit способом сделать это? – juherr

+0

'@RunWith (параметризованный.класс) public class FirstTest { \t private LoginCredentials loginData; \t \t общественный FirstTest (LoginCredentials testData) { \t \t loginData = testData; \t} \t @ Parameterized.Parameters \t общественное статическое LoginCredentials [] generateTestData() { \t \t возврат ReadingExcelSheets.generateTestData(); \t} ' @Julien –

0

В JUnit 4.x, следующим является способ достижения вышеуказанного сценария.

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

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

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

Я надеялся на что-то подобное в TestNG, что мне сказали, что является более гибким и мощным, чем JUnit. Оказывается, мы возвращаем объект Object [] [] в методе @DataProvider.

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[] как действительный re превратить тип из коробки.

Вы можете предложить патч на http://github.com/cbeust/testng Помощь всегда приветствуется :)

+0

Я только что открыл смежный вопрос о проекте: https://github.com/cbeust/testng/issues/1139 – juherr

0

Почему вы не в состоянии сделать то же самое, используя двумерный массив только с 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; 
} 

Я проверил ваш код с изменением. Я предлагаю, что все работает отлично.

+0

Ока ... это обходной путь, но его не идеальное решение ... Я чувствую, что если JUnit 4.x поддерживает Object [], то так же должен TestNG, который является передовой и более гибкой средой :) –

Смежные вопросы