测试TestNG监听器

时间:2016-01-11 09:46:06

标签: java unit-testing testng

我有一个测试A,它以编程方式运行另一个测试B,测试A仅在测试B失败时通过。我希望构建只有在测试A通过时才能成功。

准确地说,我实现了TestNG监听器(MyListener)。我需要验证它是否正确处理测试失败的结果。测试它的唯一方法似乎是测试A(testListener)运行另一个测试B(AlwaysFailingTestprogrammatically并检查结果。

@Test
public void testListener() {
    System.setProperty("knownBugs", "execute");
    tla = new TestListenerAdapter();
    TestNG testng = new TestNG();
    testng.setTestClasses(new Class[]{AlwaysFailingTest.class});
    testng.addListener(tla);
    testng.addListener(new MyListener());
    testng.run();
    assertThat(tla.getSkippedTests().size(), equalTo(0));
    assertThat(tla.getFailedTests().size(), equalTo(1));
    assertThat(tla.getPassedTests().size(), equalTo(0));
}

但是,我不希望故意失败的测试影响我的库的测试结果。目前,mvn clean test就是这样:

 
Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.407 sec <<< FAILURE!
shouldAlwaysFail(com.testing.listeners.MyListenerTest$AlwaysFailingTest)  Time elapsed: 0.01 sec  <<< FAILURE!
java.lang.AssertionError: Failing as always
        at org.testng.Assert.fail(Assert.java:94)
        at com.testing.listeners.MyListenerTest$AlwaysFailingTest.shouldAlwaysFail(MyListenerTest.java:99)

testListener()方法正在传递,这很好,但为什么AlwaysFailingTest的结果出现在库测试结果中,我不明白。我怎么能避免这种情况?

我列出了MyListenerMyListenerTest here的完整代码。

2 个答案:

答案 0 :(得分:1)

shouldAlwaysFail正在执行两次:一次由主测试套件执行,一次由testListener测试以编程方式执行。由于总是失败,主测试套件结果将包含失败。要解决此问题,您可以从主测试套件中排除shouldAlwaysFail测试,以便它只能通过testListener测试以编程方式运行。

您可以配置Maven Surefire以排除测试:

<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.19.1</version>
        <configuration>
          <excludes>
            <exclude>**/AlwaysFailingTest.java</exclude>
          </excludes>
        </configuration>
      </plugin>
    </plugins>
  </build>
  [...]
</project>

或者配置TestNG以排除您的测试:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="SuiteName" verbose="1">
    <test name="TestName">
        <packages>
            <package name="com.testing.listeners"/>
        </packages>
        <classes>
            <class name="com.testing.listeners.AlwaysFailingTest">
                <methods>
                    <exclude name="shouldAlwaysFail"/>
                </methods>
            </class>
        </classes>
    </test>
</suite>

有关详细信息,请参阅Maven Surefire Plugin – Inclusions and Exclusions of Tests和/或TestNG Documentation - 3 - testng.xml

答案 1 :(得分:0)

为什么不使用@Test注释的“expectedExceptions”属性,以便测试期望它始终为FAIL并且不会停止执行。

@Test(expectedExceptions=AssertionError.class)
    public void test(){
        Assert.fail();
    }