如何解析 JUnit 结果 xml 文件并在 java 代码中获取测试用例?

How to parse JUnit result xml file and get testcase in java code?

在 class Test_XyzDymanic 方法 中使用 @TestFactory 实现了 dymanic JUnit5 测试testXyzDymanicallly 和自定义 Suite.xml 添加多个在 运行 时间解析的测试用例。

根据 Suite.xml 中的情况,正在获取两个地图 mapExpectedmapAcutal 进行比较 assertIterableEquals(mapExpected.entrySet(), mapAcutal.entrySet())

Junit 正在使用 Ant 构建并在 result.xml.

中保存输出

执行后一些测试用例失败(当然),Junit 在控制台上只打印一行,这不足以知道原因。 因此,有 ReportGenerator 生成 excel 文件,就像在 junit 的测试用例中一样。

查询: 对于失败的测试用例想运行ReportGenerator但是不知道如何从result.xml中读取失败的测试用例Java 代码。 Junit是否提供任何class和解析方法来读取预定义的PoJo中的result.xml?或者我们可以从 ant 读取和发送参数吗?

蚂蚁目标:

<target name="test-dynamic" depends="test-compile" description="Run JUnit tests">
    <junit printsummary="true" haltonerror="no" haltonfailure="no" dir="${test.bin}" fork="true">
        <sysproperty key="suite" value="${suite.xml}" />
        <classpath refid="junit5.jars" />

        <test name="Test_XyzDymanic" outfile="${result}" failureproperty="test.failed">
            <formatter type="xml" />
            <formatter usefile="false" type="brief" />
        </test>
    </junit>
</target>

<target name="fail-report">
    <echo message="One or more test(s) failed. Generating faliur analysis report..." />
    <java classname="report.ReportGenerator" failonerror="no"/>
</target>

result.xml:

    ...
    <property name="sun.arch.data.model" value="32" />
  </properties>
  <testcase classname=")" name="Case: default case(testXyzDymanicallly" time="10.245">
    <failure message="iterable contents differ at index [75], expected: &lt;PropX.ShortName=NameXyz&gt; but was: &lt;PropX.ShortName=NameAbc&gt;" type="junit.framework.AssertionFailedError">junit.framework.AssertionFailedError: iterable contents differ at index [75], expected: &lt;PropX.ShortName=NameXyz&gt; but was: &lt;PropX.ShortName=NameAbc&gt;
    at Test_XyzDynamic.lambda$null(Test_XyzDynamic.java:41)
    at java.util.Optional.ifPresent(Optional.java:159)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
</failure>
  </testcase>

报告生成器

class ReportGenerator{
    main(String args){}
    generate(){}
  }

试过:

result.xml:

<property name="sun.arch.data.model" value="32" />
  </properties>
  <testcase classname=")" name="testcase1" time="9.596" />
  <testcase classname=")" name="testcase2" time="5.702">
    <failure message="msg1" type="type1">
    desc 11111
</failure>
  </testcase>
  <testcase classname=")" name="testcase3" time="5.656">
    <failure message="msg2" type="type2">
    desc 22222
</failure>
  </testcase>
  <testcase classname="junit.framework.JUnit4TestCaseFacade" name="JUnit Vintage" time="0.003" />

蚂蚁:

<xmlproperty file="result.xml" keeproot="false" />
<target name="main">
    <echo>1. ${testcase}</echo>
    <echo>2. ${testcase(name)}</echo>
    <echo>3. ${testcase.failure}</echo>
    <echo>4. ${testcase.failure(type)}</echo>
    <echo>5. ${testcase.failure(message)}</echo>
</target>

输出:

main:
     [echo] 1. ,
     [echo] 2. testcase1,testcase2,testcase3,JUnit Vintage
     [echo] 3. desc 11111,desc 22222
     [echo] 4. type1,type2
     [echo] 5. msg1,msg2

查询: 在控制台输出中,echo 2 有 testcase1,testcase2,testcase3,JUnit Vintage 但我想要 testcase2,testcase3 因为只有这两个测试用例根据 result.xml.

有失败标签

与其努力在 ant 中读取 xml,不如将文件作为参数发送到主程序 class 并像任何其他 xml 一样解析文件并处理所需的值。