如何从PHPUnit testdox获取详细的测试信息

时间:2011-01-19 10:09:31

标签: php testing phpunit

使用testdox-html生成日志文件时,显示的结果只是测试方法的名称,如果失败则通过文本进行,如果通过则为正常。我想要的是testdox文件生成错误信息,就像命令行输出一样。这有可能吗?

1 个答案:

答案 0 :(得分:8)

创建HTML的代码位于PHPUnit/Util/TestDox/ResultPrinter/HTML.php,遗憾的是我不知道如何扩展它。你可以改变它,但是你必须为每一个可能令人讨厌的更新重复这一点。

由于输出相当小,我会走另一条道路:

我使用.xml文件phpunit输出(例如phpunit --log-junit foo.xml DemoTest.php)并使用xslt或dom解析器将输出转换为html。它不应该太多工作​​,你可以很快地定制它。

我用xslt编写了一个小例子来转换输出。

测试

<?php

class DemoTest extends PHPUnit_Framework_TestCase {

    public function testPass() {
        $this->assertTrue(true);
    }

    public function testFail() {
        $this->assertTrue(false);
    }

}

创建xml输出

phpunit --log-junit foo.xml DemoTest.php

xslt模板

<?xml version="1.0"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
  <body>
    <h1>Tests</h1>
      <xsl:for-each select="testsuites/testsuite">
        <h2><xsl:value-of select="@name"/></h2>
        <ul>
        <xsl:for-each select="testcase">
          <li>
            <xsl:value-of select="@name"/>
            <xsl:if test="failure">
                <b>Failed !</b>
                <i><xsl:value-of select="*"/></i>
            </xsl:if>
          </li>
        </xsl:for-each>
        </ul>
      </xsl:for-each>
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

转换输出

xsltproc foo.xsl foo.xml > output.html

它看起来像什么

<html>
<body>
  <h1>Tests</h1>
    <h2>DemoTest</h2>
      <ul>
        <li>testPass</li>
        <li>testFail<b>Failed !</b>
          <i>DemoTest::testFail
          Failed asserting that &lt;boolean:false&gt; is true.
          /home/edo/DemoTest.php:10
          </i>
       </li>
      </ul>
</body>
</html>

它应该很容易调整,因为你可以使用xml文件中的所有值,比如每个测试的运行时等等。

替代

您可以使用DomParser,只需修改PHPUnit类或者其他人有更快的想法:)