如何解析 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 中的情况,正在获取两个地图 mapExpected 和 mapAcutal 进行比较 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: <PropX.ShortName=NameXyz> but was: <PropX.ShortName=NameAbc>" type="junit.framework.AssertionFailedError">junit.framework.AssertionFailedError: iterable contents differ at index [75], expected: <PropX.ShortName=NameXyz> but was: <PropX.ShortName=NameAbc>
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 一样解析文件并处理所需的值。
在 class Test_XyzDymanic 方法 中使用 @TestFactory 实现了 dymanic JUnit5 测试testXyzDymanicallly 和自定义 Suite.xml 添加多个在 运行 时间解析的测试用例。
根据 Suite.xml 中的情况,正在获取两个地图 mapExpected 和 mapAcutal 进行比较 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: <PropX.ShortName=NameXyz> but was: <PropX.ShortName=NameAbc>" type="junit.framework.AssertionFailedError">junit.framework.AssertionFailedError: iterable contents differ at index [75], expected: <PropX.ShortName=NameXyz> but was: <PropX.ShortName=NameAbc>
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 一样解析文件并处理所需的值。