Почему @AfterClass вызывается после тестов из других классов? - PullRequest
1 голос
/ 21 марта 2012

Я пытался запускать тесты в определенном порядке, но безуспешно.Как я вижу, методы, отмеченные @AfterClass, запускаются после методов из другого теста:

Configuring TestNG with: org.apache.maven.surefire.testng.conf.TestNGMapConfigurator@558ee9d6
RUN class com.example.testng.ITCaseOne.beforeClass()
RUN class com.example.testng.ITCaseOne.someCase()
RUN class com.example.testng.ITCaseTwo.beforeClass()
RUN class com.example.testng.ITCaseTwo.someCase()
RUN class com.example.testng.ITCaseOne.anotherCase()
RUN class com.example.testng.ITCaseOne.afterClass()
RUN class com.example.testng.ITCaseTwo.anotherCase()
RUN class com.example.testng.ITCaseTwo.afterClass()
Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.25 sec

И это не удается, потому что все @Test из ITCaseTwo должны вызываться только после ITCaseOne.afterClass() (потому что я использую Seleniumи тесты из одного случая должны проверять соответствующую страницу).

Мои простые классы:

public class ITCaseOne {

    @BeforeClass
    public void beforeClass() {
        System.out.printf("RUN %s.beforeClass()\n", getClass());
    }

    @AfterClass(alwaysRun = true)
    public void afterClass() {
        System.out.printf("RUN %s.afterClass()\n", getClass());
    }

    @Test(groups = "std-one")
    public void someCase() {
        System.out.printf("RUN %s.someCase()\n", getClass());
    }

    @Test(groups = "logic-one", dependsOnGroups = "std-one")
    public void anotherCase() {
        System.out.printf("RUN %s.anotherCase()\n", getClass());
    }

}

и

public class ITCaseTwo {

    @BeforeClass
    public void beforeClass() {
        System.out.printf("RUN %s.beforeClass()\n", getClass());
    }

    @AfterClass(alwaysRun = true)
    public void afterClass() {
        System.out.printf("RUN %s.afterClass()\n", getClass());
    }

    @Test(groups = "std-two")
    public void someCase() {
        System.out.printf("RUN %s.someCase()\n", getClass());
    }

    @Test(groups = "logic-two", dependsOnGroups = "std-two")
    public void anotherCase() {
        System.out.printf("RUN %s.anotherCase()\n", getClass());
    }

}

Если это важно, я использую maven-failsafe-plugin 2.12 иtestng 6.4

(Кстати, я также пытаюсь использовать файл набора с preserve-order="true", но он не работает для меня.)

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 22 марта 2012

Мне удалось воспроизвести это поведение, это ошибка.Я посмотрю на это.В то же время, комментируя одну из этих двухвидарных групповой зависимости, следует исправить некорректное поведение.

1 голос
/ 23 марта 2012

Я нашел еще один способ, как исправить это с помощью набора тестов и preserve-order="true" (вдохновленный Когда нужно запустить тесты из 2 классов из testng.xml, почему TestNG выбирает методы случайным образом из классов? ).

Создать src/test/config/testng.xml со следующим содержанием

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Selenium tests" preserve-order="true">
    <test name="Test #1">
        <classes>
            <class name="com.example.testng.ITCaseOne" />
        </classes>
    </test>
    <test name="Test #2">
        <classes>
            <class name="com.example.testng.ITCaseTwo" />
        </classes>
    </test>
</suite>

Обращайтесь по maven-failsafe-plugin

<plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <version>2.12</version>
        <configuration>
                <suiteXmlFiles>
                            <suiteXmlFile>${basedir}/src/test/config/testng.xml</suiteXmlFile>
                </suiteXmlFiles>
        </configuration>
</plugin>

И теперь все работает как положено:

RUN class com.example.testng.ITCaseOne.beforeClass()
RUN class com.example.testng.ITCaseOne.someCase()
RUN class com.example.testng.ITCaseOne.anotherCase()
RUN class com.example.testng.ITCaseOne.afterClass()
RUN class com.example.testng.ITCaseTwo.beforeClass()
RUN class com.example.testng.ITCaseTwo.someCase()
RUN class com.example.testng.ITCaseTwo.anotherCase()
RUN class com.example.testng.ITCaseTwo.afterClass()
1 голос
/ 22 марта 2012

По существу у вас есть требования к зависимому методу. Если вы храните их в отдельных классах, вы можете сделать так, чтобы @Test второго класса, который вы хотите выполнить вторым, зависел от одной из групп в первом классе . Так что если вы продолжите @Test (groups = "std-two", disabledOnGroups = "logic-one"), все должно работать так, как вы хотите ..

...