gpt4 book ai didi

maven - 从命令行获取通过和失败测试的数量及其名称

转载 作者:行者123 更新时间:2023-12-03 16:26:04 26 4
gpt4 key购买 nike

我正在编写将运行的 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] ------------------------------------------------------------------------

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

最佳答案

有多种解决方案,但没有直接的解决方案……它们都涉及一些解析(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属性(这是测试方法的名称)。

    日志

    如果您使用 plain 配置 Surefire 插件 reportFormat
    <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

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

    关于maven - 从命令行获取通过和失败测试的数量及其名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40003460/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com