我正在编写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合并。
答案 0 :(得分:5)
有多种解决方案,但没有直接解决方案......它们都涉及一些解析(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
和
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组为空,则表示成功。