当@BeforeTest 方法失败时,为什么它没有列在 testng-failed.xml 中?

问题描述

我在 testng 6.14.3 中使用 maven。

这是我的代码结构:

testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<suite name="set-3" parallel="tests" thread-count="10">
    <listeners>
        <listener class-name="org.uncommons.reportng.HTMLReporter" />
    </listeners>

    <test name="Customer Tests">
        <groups>
            <run>
                <include name="abc"/>
            </run>
        </groups>
        <classes>
            <class name="apps.Test1_BeforeTest_Of_Test2"></class>
            <class name="apps.Test2"></class>
        </classes>
    </test>

</suite>

Test1_BeforeTest_Of_Test2.java

public class Test1_BeforeTest_Of_Test2{
@BeforeTest(groups = {"abc"})
    public void test1Method() throws Exception {
}
@AfterTest(groups={"abc"})
public void test1AfterMethod() throws Exception {
    }
}

Test2.java

public class Test2{
 @Test(groups = {"abc"})
    public void test2Method(){
    }
}

在我的运行过程中,Test1_BeforeTest_Of_Test2 类失败了。因此,Test2标记为已跳过。 但是,当我查看运行结束时生成testng-Failed.xml 时,未包含/列出失败的 @BeforeTest 类 (Test1_BeforeTest_Of_Test2):

testng-Failed.xml

<?xml version="1.0" encoding="UTF-8"?>
<suite thread-count="10" name="Failed suite [set-3]" parallel="tests">
  <listeners>
    <listener class-name="org.uncommons.reportng.HTMLReporter"/>
  </listeners>
  <test name="Customer Tests(Failed)">
    <groups>
      <run>
        <include name="abc"/>
      </run>
    </groups>
    <classes>
      <class name="apps.Test2">
        <methods>
          <include name="test2Method"/>
        </methods>
      </class> 
    </classes>
  </test> 
</suite>

这是预期的行为吗?还是 testng-Failed.xml 中的错误/差距?

理想情况下,当我们重新运行失败的测试时,我们希望 @BeforeTest 也能运行,因为它是测试 2 的先决条件。

解决方法

TestNG 目前似乎尊重 testng-failed.xml 中要考虑的配置,如果它是跳过的测试方法的测试类的一部分,即配置(这可能是导致测试被跳过的原因)需要驻留在与 TestNG 跳过的方法相同的 java 类中,以将其包含在内。

在您的示例中,情况并非如此,并且配置方法存在于不同的测试类中(这是完全有效的)。

这在我看来像是 TestNG 中的一个错误。

我已代表您在 TestNG 项目中提交了一个错误,并将在即将发布的版本 (7.5.0) 中修复它。

缺陷:https://github.com/cbeust/testng/issues/2611