每个类都有3个或更多的测试方法。
每种测试方法都可能通过或失败。
零,一个或多个方法可能失败。
要求遍历测试方法结果,当发现失败的方法(第一个匹配)时,获取"消息"的属性值并打印它。
如果没有一个方法失败,则打印空白。
我怎样才能做到这一点?
Input.xml
<testng-results>
<suite>
<test>
<class name="activities.ActivitiesListTest">
<test-method status="PASS" started-at="2019-02-07T18:24:47Z" name="initTest">
<reporter-output>
</reporter-output>
</test-method>
<test-method status="FAIL" started-at="2019-02-07T18:24:47Z" name="ActListsForContactShowsContactRelatedTasksTest">
<exception class="org.openqa.selenium.NoSuchElementException">
<message>
<![CDATA[Element with locator 123 not present']]>
</message>
</exception>
<reporter-output>
</reporter-output>
</test-method>
<test-method status="FAIL" started-at="2019-02-07T18:24:47Z" name="afterClass">
<exception class="org.openqa.selenium.NoSuchElementException">
<message>
<![CDATA[Message 3]]>
</message>
</exception>
<reporter-output>
</reporter-output>
</test-method>
</class>
</test>
</suite>
</testng-results>
预期结果:
<Suite>
<test failed_reason=" <![CDATA[Element with locator 123 not
present']]>"/>
</Suite>
尝试(XSL):
<Suite>
<xsl:for-each select="/class">
<test>
<xsl:attribute name="failed_reason">
<xsl:choose>
<xsl:when test="*[@status='FAIL']">test-method[position() = current()]/exception/@message</xsl:when>
</xsl:choose>
</xsl:attribute>
</test>
</xsl:for-each>
</Suite>
异常消息的绝对路径示例:
suite/test/class[@name='ActivitiesListForContactShowsContactRelatedTasksTest']/test-method[@name='ActListsTest']/exception/message
但是,没用。
如何达到预期结果?
编辑:尝试迈克尔的解决方案。
这就是我的XSL当前的样子:
<xsl:template match="/">
<Suite>
<xsl:for-each select="testng-results/suite/test/class">
<test>
<xsl:attribute name="start-time">
<xsl:value-of select="test-method[1]/@started-at"/>
</xsl:attribute>
<xsl:attribute name="failed_reason">
{normalize-space(test-method[@status='FAIL'][1]/exception/message)}
</xsl:attribute>
</test>
</xsl:for-each>
</Suite>
</xsl:template>
我猜(!)你想做这样的事情:
<xsl:template match="/*">
<Suite>
<xsl:for-each select="class">
<test failed_reason="{normalize-space(test-method[@status='FAIL'][1]/exception/message)}"/>
</xsl:for-each>
</Suite>
</xsl:template>
注:
<xsl:for-each select="/class">
将不会选择任何内容,除非CCD_ 1是根元素。但是如果class
是根元素,那么只有一个类,所以使用xsl:for-each
没有意义。