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

Ser*_*hko 4 maven maven-surefire-plugin

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

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

proc = subprocess.run(["mvn", "test", "-f", PROJ_PATH])
print(proc.stdout)
Run Code Online (Sandbox Code Playgroud)

输出:

   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] ------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

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

Tun*_*aki 5

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

XML报告

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

内部的每个XML文件(对于每个测试类)都target/surefire-reports被命名为TEST-${testClass}.xmlwhere,其中${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>
Run Code Online (Sandbox Code Playgroud)

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

  • 失败(其中的断言未经验证):里面有一个<failure>元素<testcase>.
  • 错误(抛出了一个异常,并没有预料到):里面有一个<error>元素<testcase>.
  • skip:里面有一个<skipped>元素<testcase>.
  • 成功:里面没有元素<testcase>.

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

日志

如果配置的保命插件与plain reportFormat

<plugin>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.19.1</version>
  <configuration>
    <reportFormat>plain</reportFormat>
  </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用正则表达式查找此文件,从而获得很多乐趣(.*)\((.*)\)\s+(?|(skipped)|Time elapsed:.*<<< (.*)):测试的方法名称在组1中,组2中的完全限定类名称和组3包含结果; 如果组3为空,那么它就是成功的.