2016-11-15 2 views
-1

Если у меня есть метод beforeMethod с группой, и я запускаю другую группу, но внутри этой группы существует тест, в котором есть как группа, как и группа с методом beforeMethod, я хочу, чтобы этот тест выполнял его перед этим. Так, например:Запуск аннотации @BeforeMethodNN, когда метод * содержит * группу

@BeforeMethod(groups = "a") 
public void setupForGroupA() { 
... 
} 

@Test(groups = {"supplemental", "a"}) 
public void test() { 
... 
} 

, когда я бегу TestNG с группами = ДОПОЛНИТЕЛЬНЫХ, я все еще хочу, чтобы beforeMethod бежать перед испытанием, но потому, что группа является дополнительным вместо «а», это не будет.

Это кажется мне настолько очевидной особенностью, что я чувствую, что должен неправильно использовать группы, поэтому я также хотел бы объяснить свой рабочий процесс, если это моя проблема.

Я использую группы для определения различных уровней тестов, а также нужно ли им создавать свою собственную учетную запись или использовать прокси-сервер для доступа к их данным и т. Д. Я буду иметь группы дыма , дополнительные и регрессионные, а также группы uniqueAccount, прокси и т. д. Мне не нужна определенная настройка для первых групп, но это группы, в которые я перехожу, чтобы работать в maven. Мне нужны конкретные настройки для последних групп, но я никогда не хочу запускать тесты, требующие прокси, или требовать уникальную учетную запись.

ответ

1

Конфигурация групп не оценивается во время выполнения. test метод не активирует setupForGroupA способ.

Эта функция используется для поиска методов, которые вы хотите запустить. Согласно следующему примеру:

@BeforeMethod(groups = "a") 
public void setupForGroupA() { 
... 
} 

@Test(groups = {"supplemental", "a"}) 
public void test() { 
... 
} 

@Test(groups = {"supplemental"}) 
public void test2() { 
... 
} 

Если запустить этот класс с группой «а» он будет работать setupForGroupA и test методы, потому что они помечены группы «в».

Если вы запустите этот класс с группой «дополнительная», он будет запускать test и test2 методов, потому что они отмечены группой «дополнительная».

По-видимому, у вас разные методы поведения для некоторых методов, поэтому хороший подход заключается в разделении методов в разных классах и выборе тестов по классу вместо выборочных тестов по группам.

public class A { 
    @BeforeMethod 
    public void setupForGroupA() { 
    ... 
    } 

    @Test 
    public void test() { 
    ... 
    } 
} 

и

public class Supplemental { 
    @Test 
    public void test2() { 
    ... 
    } 
} 

Запуск класса А будет работать setupForGroupA и test только. Запуск класса Дополнительный будет работать только test2. Запуск обоих классов запустит все.

В случае, если вы хотите запустить оба класса и фильтр от чего-то еще, вы можете реализовать свою собственную логику a method interceptor:

@MyCustomAnnotation(tags = "a", "supplemental") 
public class A { 
    ... 
} 

@MyCustomAnnotation(tags = "supplemental") 
public class Supplemental { 
    ... 
} 

public class MyInterceptor implements IMethodInterceptor { 

    public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) { 
    // for each method, if its class contains the expected tag, then add it to the list 
    // expect tag can be passed by a system property or in a parameter from the suite file (available from ITestContext) 
    } 
} 
1

Если я исправлю это, вы хотите каждый раз запускать свой метод. В этом случае, вы можете установить alwaysRun = True для перед методом, как this-

@BeforeMethod(alwaysRun = true, groups = "a") 
public void setupForGroupA() { 
... 
} 

Это одно из решений, которые вы хотите.

+0

Так, чтобы расширить пример немного, я мог бы добавить еще один метод «test2» с группой дополнительная, но не группа «а».В этом случае я бы хотел, чтобы метод before выполнялся до «test», но не раньше «test2». – RankWeis

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