2012-03-21 27 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 

它失败,因为从ITCaseTwo所有@Test必须被调用后,才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(组=“STD-二”,dependsOnGroups =“逻辑1”),事情应该工作,U希望的方式..

+0

哎呀。我刚刚在我的问题中解决了错误,以澄清我期望的内容。我只需要在第一课的所有方法之后执行第二课的所有方法。 – 2012-03-22 14:23:32

+0

答案仍然成立。 – 2012-03-22 14:35:52

+0

是的,它的工作原理,谢谢。但它有一些缺点:所有类都应该用这种方式链接,当第一个测试用例中的一个测试失败时,所有其他类都将被跳过。此解决方案也为测试执行添加了严格的顺序,但实际上我并不在乎谁会首先被调用 - “ITCaseOne”或“ITCaseTwo”。 – 2012-03-23 12:29:57

2

我能重现此问题,这是一个错误。我会研究它。与此同时,评论出两个dependsOnGroups之一应该修复不正确的行为。

+0

是的,它只有在*注释*'dependsOnGroups'属性时才有效。 – 2012-03-23 12:22:54

1

我发现又一种方式如何解决它与测试套件和preserve-order="true"(启发When needing to run tests from 2 classes from testng.xml, why does TestNG pick mehods randomly from classes?)。

通过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> 

与以下内容

<!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> 

处理它创建src/test/config/testng.xml而现在它按预期工作:

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() 
相关问题