2012-03-21 2 views
1

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

Configuring TestNG with: [email protected]e9d6 
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() (потому что я использую Селен и тесты от одного случая следует проверить соответствующую страницу) ,

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

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", но это не работает для меня.)

Спасибо заранее!

ответ

1

По существу у вас есть зависимые методы. Если вы храните их в отдельных классах, то вы можете сделать @Test второго класса, который вы хотите выполнить вторым, чтобы зависеть от одной из групп в первом классе. Так что, если вы держите @test (группы = «станд-два», dependsOnGroups = «логико-один»), все должно работать, как и хотите это ..

+0

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

+0

Ответ по-прежнему сохраняется. –

+0

Да, это работает, спасибо. Но это имеет некоторые недостатки: все классы должны быть привязаны таким образом, и когда один из тестов в первом тестовом случае завершится неудачей, все остальные будут пропущены. Кроме того, это решение добавляет строгий порядок выполнения тестов, но на самом деле мне все равно, кто будет называться первым - «ITCaseOne» или «ITCaseTwo». –

2

Я был в состоянии воспроизвести такое поведение, это Жук. Я посмотрю. Тем временем, комментируя одну из двух зависимых групп, следует исправить неправильное поведение.

+0

Да, это работает только тогда, когда я прокомментировал * оба атрибута 'dependOnGroups'. –

1

Я нашел еще один способ, как исправить это с помощью набора тестов и preserve-order="true" (вдохновленный When needing to run tests from 2 classes from testng.xml, why does TestNG pick mehods randomly from classes?).

Создать 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> 

Handle его 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() 
Смежные вопросы