2014-09-10 2 views
1

Я пытаюсь запустить класс с несколькими тестами в двух разных условиях. В основном у меня есть куча тестов, связанных с поиском. Я добавляю новые функции новой стратегии поиска и тем временем хочу запускать уже написанные тесты в обеих конфигурациях. Поскольку у нас есть несколько классов, каждый из которых имеет несколько тестов, я хочу как можно больше оптимизировать этот процесс. В идеале было бы здорово сделать настройку в @BeforeClass с поставщиком данных, чтобы все тесты в классе в основном выполнялись дважды под разными конфигурациями, но не похоже, что это возможно.TestNG dataproviders с @BeforeClass

Прямо сейчас у меня есть:

public class SearchTest1 { 
    @Test(dataProvider = "SearchType") 
    public void test1(SearchType searchType) { 
     setSearchType(searchType); 
     //Do the test1 logic 
    } 

    @Test(dataProvider = "SearchType") 
    public void test2(SearchType searchType) { 
     setSearchType(searchType); 
     //Do the test2 logic 
    } 

    @DataProvider(name = "SearchType") 
    public Object[][] createData() { 
     return new Object[][]{ 
      new Object[] {SearchType.scheme1, SearchType.scheme2} 
     } 
    } 
} 

Есть ли лучший способ сделать это?

+0

Это выглядит как довольно хороший способ для меня. Кроме того, что я переместил бы поставщика данных в свой собственный класс, так что каждый может ссылаться на один и тот же. – biziclop

+0

Вот как это устроено. Я написал это так, чтобы было легче читать здесь. Я должен упомянуть, что есть ~ 20 классов, в общей сложности 268 тестов. Я бы не хотел писать эти строки во всех 268 этих местах. – Clayton

ответ

1

Если вы хотите избежать комментирования каждого метода поставщиком данных, вместо этого вы можете использовать Factory.

public class SearchTest1 { 
    private final SearchType searchType; 

    public SearchTest1(SearchType searchType) { 
     this.searchType = searchType; 
    } 

    @Test 
    public void test2() { 
     //Do the test2 logic 
    } 
    ... 
} 

И ваш класс завод будет:

public class SearchTestFactory { 
    @Factory 
    public Object [] createInstances() { 
     return new Object[] { new SeartchTest1(SearchType.ONE), new SearchTest1(SearchType.TWO) }; 
    } 
} 

Подробнее об этом here.

Тогда у вас может быть одна фабрика, которая перечисляет каждый испытательный класс или отдельную фабрику для каждого, первая, очевидно, менее гибкая, вторая означает немного больше кода.

+0

Итак, это действительно означает создание конструктора для каждого из этих классов и переход в тип. Это работает, я думаю. Также я нашел это [http://stackoverflow.com/questions/520328/can-you-find-all-classes-in-a-package-using-reflection], что указывает на способ перечисления всех классов в этом пакете чтобы сохранить минимальный код. – Clayton

+0

Да, это приятное дополнение, хотя я бы, вероятно, объединил сканирование пакетов с помощью сканера «MethodAnnotationsScanner» из библиотеки Reflections, чтобы возвращать только классы, содержащие методы, аннотированные с помощью '@ Test'. – biziclop

+0

Но это вернет набор методов. Будет ли это означать переход через каждый метод и добавление их класса в список для создания экземпляра? Или есть способ фильтровать это с помощью отражений? – Clayton

0

Вы можете использовать параметры в @BeforeClass. Просто используйте (с некоторой очистки)

context.getCurrentXmlTest() getParameters.()

@SuppressWarnings("deprecation") 
    @BeforeClass 
    public void setUp(ITestContext context) { 
    System.out.println(context.getCurrentXmlTest().getParameters());  

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