【问题标题】:Why @AfterClass called after tests from another classes?为什么@AfterClass 在其他类的测试后调用?
【发布时间】:2012-03-21 16:22:19
【问题描述】:

我尝试按确定的顺序运行测试用例,但没有运气。我看到用 @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

它失败了,因为来自ITCaseTwo 的所有@Test 必须仅在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" 的套件文件,但它对我不起作用。)

提前致谢!

【问题讨论】:

    标签: testng maven-failsafe-plugin


    【解决方案1】:

    我能够重现此行为,这是一个错误。我会调查的。同时,注释掉两个 dependsOnGroups 之一应该可以修复不正确的行为。

    【讨论】:

    • 是的,它只有在我注释掉 both dependsOnGroups 属性时才有效。
    【解决方案2】:

    基本上你有相关的方法要求。如果您将它们保存在单独的类中,那么您可以使您希望第二个执行的第二个类的 @Test 依赖于一个第一个类中的组。 所以如果你保持 @Test(groups = "std-two",dependsOnGroups = "logic-one"),事情应该会按照你想要的方式工作..

    【讨论】:

    • 糟糕。我刚刚修正了我的问题中的错字以澄清我的期望。只有在第一类的所有方法之后,我才需要执行第二类的所有方法。
    • 是的,它有效,谢谢。但它有一些缺点:所有类都应该以这种方式链接,当第一个测试用例中的一个测试失败时,所有其他的都将被跳过。此解决方案还为测试执行添加了严格的顺序,但实际上我不在乎谁会先被调用——ITCaseOneITCaseTwo
    【解决方案3】:

    我找到了另一种方法来使用测试套件和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>
    

    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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2017-02-03
      • 2015-05-08
      相关资源
      最近更新 更多