从命令行获取其名称的传递和失败测试的数量

时间:2016-10-12 16:15:32

标签: maven maven-surefire-plugin

我正在编写Python脚本,它将在不同的文件夹上运行mvn test,我希望从脚本中获取通过的测试和失败的测试及其名称的数量。

现在我已经设法运行进程并获得输出

proc = subprocess.run(["mvn", "test", "-f", PROJ_PATH])
print(proc.stdout)

输出:

   Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.715 s
[INFO] Finished at: 2016-10-12T18:59:11+03:00
[INFO] Final Memory: 10M/212M
[INFO] ------------------------------------------------------------------------

我知道我可以使用regexp并尝试解析输出,但可能有一些更合适的方法可以与Python或Bash中的Maven合并。

1 个答案:

答案 0 :(得分:5)

有多种解决方案,但没有直接解决方案......它们都涉及一些解析(XML或文本文件)。

XML报告

这可能是最安全和最简单的途径。 Surefire默认生成target/surefire-reports内的XML报告。每个测试类都有一个XML文件,该文件包含该类中测试执行的结果。此XML遵循a pre-defined XSD并保证稳定的输出。

target/surefire-reports内的每个XML文件(对于每个测试类)都命名为TEST-${testClass}.xml,其中${testClass}将替换为测试类的完全限定名称。其my.test.MyTest测试类的相关内容为:

<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="my.test.MyTest" tests="4" errors="1" skipped="1" failures="1">
  <properties> <!-- omitted, contains system properties for the test --> </properties>
  <testcase name="test" classname="my.test.MyTest" time="0.096">
    <failure></failure>
  </testcase>
  <testcase name="test2" classname="my.test.MyTest" time="0.001">
    <error></error>
  </testcase>
  <testcase name="test3" classname="my.test.MyTest" time="0.002"/>
  <testcase name="test4" classname="my.test.MyTest" time="0">
    <skipped/>
  </testcase>
</testsuite>

(还有其他属性,但它们在这里不相关)。基本上,<testsuite>表示有4个测试,导致1的错误,1的失败和1的跳过;所以剩下的1个是成功的。更确切地说,每个<testcase>表示通过name属性的测试方法,而内部元素表示其结果。关于测试的4种可能结果,可以非常简单地解析这个问题:

  • 失败(其中的断言未经验证):<failure>内有<testcase>个元素。
  • 错误(抛出异常,并未预料到):<error>内有<testcase>个元素。
  • 跳过:<skipped>内有<testcase>个元素。
  • 成功:<testcase>内没有元素。

如果需要测试方法的完全限定名称,请将classname属性(这是测试类的限定名称)附加到name属性(这是测试的名称)法)。

日志

如果您使用{/ 1}} reportFormat

配置Surefire插件
plain

日志将包含所需的所有信息:

<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.19.1</version>
  <configuration>
    <reportFormat>plain</reportFormat>
  </configuration>
</plugin>

然后,您可以通过查找Running my.test.MyTest Tests run: 4, Failures: 1, Errors: 1, Skipped: 1, Time elapsed: 0.169 sec <<< FAILURE! - in my.test.MyTest test(my.test.MyTest) Time elapsed: 0.112 sec <<< FAILURE! java.lang.AssertionError at my.test.MyTest.test(my.test.MyTest.java:16) test2(my.test.MyTest) Time elapsed: 0.001 sec <<< ERROR! java.lang.IllegalArgumentException: Exception at my.test.MyTest.test2(my.test.MyTest.java:21) test3(my.test.MyTest) Time elapsed: 0.002 sec test4(my.test.MyTest) skipped 的正则表达式来使用此文件获得很多乐趣:测试的方法名称在组1中,组2中的完全限定类名称和组3包含结果;如果第3组为空,则表示成功。