TestNG groups и Before\After методы

Добрый день.

Есть следующая связка: Jenkins + Maven 3.1.0 + TestNG 6.8.7 + WebDriver 2.35

Есть набор тестов разбитый по классам.

В одном классе несколько тестовых методов:

  • Класс 1 - Базовые проверки (4 метода)
  • Класс 2 - Проверка фильтра Х группы А (1 метод + DataProvider на 5
    параметров = 5 тестов)
  • Класс 3 - Проверка фильтра Y группы A (…)

Есть один общий класс с Before\After методами который является родителем для всех классов тестов:

  • @BeforeClass - запускает браузер
  • @AfterClass - закрывает браузер
  • @BeforeMethod - перед каждым методом открывает нужную страницу для
    теста

Пытаюсь разбить все тесты на группы используя groups от TestNG, но возникают ошибки потому что Before\After методы работают странно.

Использую следующий testng.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="All Tests" verbose="5">
    <test name="BasicCheck">
        <classes>
            <class name="se.work.pages.BasicCheck"></class>
        </classes>
    </test>
    <test name="projectSizeFilter.ProjectClass">
        <classes>
            <class name="se.work.pages.filter.projectsize.CheckProjectClassFilter"></class>
        </classes>
    </test>
    <test name="projectSizeFilter.SalePlan">
        <classes>
            <class name="se.work.pages.filter.projectsize.CheckSalePlanFilter"></class>
        </classes>
    </test>
</suite>

Класс 1 добавлен в (groups = {"basic"})

Класс 2 добавлен в groups = {"projectSizeFilter.projectClass"}

Класс 3 добавлен в (groups = {"projectSizeFilter.salePlan"})

Запускаю Maven c параметром -Dgroups=basic. Тесты не выполняются потому что Before методы не отрабатываются.
Если запускаю просто без параметров то все тесты отрабатываются нормально согласно порядку в testng.xml.

В чем может быть проблема? Возможно кто-то подскажет как можно организовать тесты по альтернативному пути, но не плодить при этом xml файлы и профили? Хотелось бы из Maven запускать задачу с параметром в который бы передавалась группа\набор тестов которые будут выполнятся.
В идеале мне нужно сделать одну работу в Jenkins на каждый класс и по работе на каждую группу классов.

Все верно. (@Before|@After)Class тригается, при запуске тестов классами. Когда вы добавляете -Dgroups=basic, testng начинает работать с группами, а это уже (@Before|@After)Group. Поэтому определитесь как будут запускаться тесты, через группы (@BeforeGrouop), через классы (@BeforeClass), через методы (@BeforeMethod) и т.д.

3 лайка

Спасибо за разъяснение. Но есть ли возможность использовать с группами какие-то еще аннотации кроме (@Before|@After)Groups? Получает что либо использовать полноценные before\after и указывать для каждого набора свой xml или все before методы закладывать в тест-метод изначально.

Коллеги подскажите с проблемой!
При запуске тестов : mvn test или по группе mvn test -Dgroups=SignUp
Получаю ишибку:

"[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.19.1:test (default-test) on project TestPageObject: Exception in provider: NullPointerExcepti
on -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.19.1:test (default-test) on project TestPageO
bject: Exception in provider "

POM.xml:

  <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.19.1</version>
                <configuration>
                    <systemProperties>
                        <property>
                            <name>reporter.debug</name>
                            <value>false</value>
                        </property>
                    </systemProperties>
                    <suiteXmlFiles>
                        <suiteXmlFile>testng.xml</suiteXmlFile>
                    </suiteXmlFiles>
                    <!--<testdroidDevice>${value}</testdroidDevice>-->
                    <forkMode>never</forkMode>
                    <groups>
                        SignUp,
                    </groups>
                </configuration>
            </plugin>
        </plugins>
    </build>"

testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Custom suite" verbose="1">
  <test name="MeWe-PO" >
    <classes>
      <class name="com.appium.test.AppTest"/>
    </classes>

    <groups>
      <define name="all">
        <include name="SignUp"/>
        <include name="Login"/>
      </define>
      <run>
        <include name="all"/>
      </run>
    </groups>
  </test>
</suite>
```

Использовал аннотации @BeforeGroups или  @BeforeSuite

Попробуйте поставить параметр (alwaysRun= true) на всех before и after

а мне казалось, что данные аннотации вложены иерархически друг в друга…

то есть:

  • BeforeClass

    • BeforeTest
      • BeforeGroups
        • BeforeMethod
        • AfterMethod
      • AfterGroups
    • AfterTest
  • AfterClass