我使用的是ant 1.8.2。让我们假设一个测试因stackoverflow错误而失败。
import junit.framework.TestCase;
/**a failing test */
public class FailingTest extends TestCase
{
public void testFail() {
testFail();// gives stackoverflow- result xml is now a large document
}
}
运行junitport将失败,出现以下错误
[junistreport]罐子:file://lib/ant-junit.jar/org/apache/tools/ant/taskdefs/optional/junit/xl/junit-frames.xsl:65:57:致命错误!java.lang.StackOverflow错误原因:java.lang.StackOverflow错误
原因似乎是测试结果XML文件中有大量文本内容。
<testcase classname="chs.FailingTest" name="testFail" time="0.012">
<error type="java.lang.StackOverflowError">java.lang.StackOverflowError
at chs.FailingTest.testFail(FailingTest.java:14)
at chs.FailingTest.testFail(FailingTest.java:14)
at chs.FailingTest.testFail(FailingTest.java:14) ....
我想xslt需要修剪并跳过较大的错误消息。可能的解决方案是什么?
//临时修复:从结果html中跳过如此大的文本在junit xslt文件中需要编辑
<xsl:template name="br-replace">
<xsl:param name="word"/>
<xsl:if test="string-length($word) < 31024 "> //very large size here causes stackoverflow
<xsl:choose>
<xsl:when test="contains($word, '
')">
<xsl:value-of select="substring-before($word, '
')"/>
<br/>
<xsl:call-template name="br-replace">
<xsl:with-param name="word" select="substring-after($word, '
')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$word"/>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>
最终修复:在看到下面的答案后,我查看了蚂蚁开发网站。SVN具有新xslt:http://svn.apache.org/viewvc/ant/core/trunk/src/etc/junit-frames-xalan1.xsl?view=co&content-type=text%2Flain,它将模板更新为如下
<xsl:template name="br-replace">
<xsl:param name="word"/>
<xsl:param name="br"><br/></xsl:param>
<xsl:value-of select='stringutils:replace(string($word),"
",$br)'/>
</xsl:template>
将代码转换为XSLT2.0:
<xsl:template name="br-replace">
<xsl:param name="word"/>
<xsl:for-each select="tokenize($word, '
')">
<xsl:if test="position() != 1"><br/></xsl:if>
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>
或者,使用Saxon作为XSLT处理器运行现有代码。Saxon实现了尾调用优化,它将这个递归模板变成了一个普通的循环。
public void testFail() {
testFail();// gives stackoverflow- result xml is now a large document
}
此方法正在调用自己。。。。没有出口点