【问题标题】:How might I integrate phpunit with Hudson CI?如何将 phpunit 与 Hudson CI 集成?
【发布时间】:2010-10-05 19:23:51
【问题描述】:

我们正在考虑从 phpundercontrol 切换到 Hudson(它看起来有一些非常酷的功能!)但我不知道如何显示 phpunit 日志。

我的 phpunit 在 Hudson 中使用 ant 运行良好,并且 --log-xml 将 phpunit.xml 放在该构建的相应 builds/ 文件夹中。但是我不知道如何让它显示在构建中,以便我们可以看到运行的测试以及失败的测试(如果有的话)。

在我弄清楚之后,接下来就是获取覆盖率、指标和 api 了 :)

对于任何在 HTML 上生成它的东西来说似乎都应该是微不足道的,例如告诉 Hudson “对于这个项目,显示每个构建的‘API’链接和 builds/$BUILDNUM/api/index.html ”。

【问题讨论】:

  • 仅供参考... --log-xml 标志已弃用。请改用 --log-junit。

标签: php hudson phpunit


【解决方案1】:

最后一个答案来自 2009 年,a lot of people migrating from Hudson to Jenkins 现在是 due to Oracle,考虑使用 Jenkins 模板 for PHP,为您的所有配置需求提供免费且方便的模板 PHPQATools,像 pdepend、phpmd、phpcs 和 phpunit 都在一个方便的模板中。

还有IRC channel #jenkins-php on Freenode 支持。

【讨论】:

    【解决方案2】:

    如果您想要关于将 PHP 与 Hudson 集成的完整教程,可以查看此链接:

    Continuous Integration for PHP with Hudson

    【讨论】:

      【解决方案3】:

      我安装了 xUnit 插件,将它指向我的日志文件(来自作业配置),它就像一个魅力。似乎不再需要任何自定义 hack。

      http://wiki.hudson-ci.org/display/HUDSON/xUnit+Plugin

      【讨论】:

      • 谢谢,既然存在这个插件,它确实是正确的解决方案,因为它会为您处理转换。
      【解决方案4】:

      我相信 xslt 可能必须根据使用的 phpunit 版本而有所不同。例如,hoschi 发布的样式表对我来说效果很好,使用 phpunit 版本 3.3.17

      但是 phpunit 完全有可能升级为在新版本中发出不同的格式,或者 sir-vestnik 可能正在运行旧版本。

      【讨论】:

        【解决方案5】:

        上一篇文章中的 XSLT 转换不适用于我。应用此转换后,报表的 DOM 结构不会改变。我已经对其进行了修改以解决问题。我的变种是:

        <?xml version="1.0" encoding="UTF-8"?>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
           <xsl:template match="/">
              <xsl:element name="testsuites">
                 <xsl:for-each select="//testsuite[@file]/testsuite">
                    <xsl:copy-of select="." />
                 </xsl:for-each>
              </xsl:element>
           </xsl:template>
        </xsl:stylesheet>
        

        它对我有用。

        【讨论】:

          【解决方案6】:

          您也可以使用此 xslt 文件将 phpunit xml 转换为 hudson/junit xml:

          <?xml version="1.0" encoding="UTF-8"?>
          <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
          <xsl:template match="/">
              <xsl:element name="testsuites">
                  <xsl:for-each select="//testsuite[@file]">
                       <xsl:copy-of select="." />
                  </xsl:for-each>
              </xsl:element>
          </xsl:template>
          </xsl:stylesheet>
          

          【讨论】:

            【解决方案7】:

            PHPUnit is not (currently) compatible with Hudson 发出的 XML 的格式,因为它与其他类似工具生成的 XML 不太一样。这就是您收到“没有任何测试报告包含任何结果”消息的原因。

            没有修复 PHPUnit 以生成“更好”的 XML 或改进 Hudson 使其在接受的内容方面更灵活,唯一的解决方案是通过消除 元素的嵌套来修复 XML。我已经used sed to alter the PHPUnit XML,所以哈德森可以接受:

            # Tweak the test result XML to make it acceptable to Hudson.
            lines=`wc -l test-results/results.xml|awk '{print $1}'`
            end=`expr $lines - 1`
            sed -i "$end d;3d" test-results/results.xml
            

            【讨论】:

            • 谢谢丹。我回复了您似乎对我不起作用的博客文章,我认为是因为我有超过 2 级的嵌套测试套件标签。还有其他提示吗?希望有人会在某个时候提供一个 phunit 插件。
            【解决方案8】:

            上面的答案是有效的,但更简单,不改变你的构建过程:

            【讨论】:

              【解决方案9】:

              我通常使用 CruiseControl 进行 PHP 测试(使用 CC 的 Phing 支持,而不是 phpundercontrol)。我只与 Hudson 合作过一点点,但已经让 Hudson 使用 phing 的 phpunit 支持成功地记录了 phpunit 测试。

              以下说明假设您将使用 Phing(而不是 Ant)来管理您的 PHP 项目构建,并且您已安装必要的先决条件。它还假设您已经安装了 PHPUnit 3(尽管 PHPUnit 2.x 也应该可以工作)。

              第 1 步:为 Phing/PHPUnit 设置项目

              首先,您需要确保您的项目可以使用 Phing 进行测试。这是一个运行单元测试并创建与 JUnit 兼容的 XML 输出的示例 Phing build.xml。

              <?xml version="1.0" ?>
              <project name="Test Project" default="test">
                  <property name="tests.dir" value="." />
                  <property name="reports.dir" value="${tests.dir}/reports" />
              
                  <target name="test" description="Run PHPUnit tests">
                      <phpunit haltonerror="true" haltonfailure="true" printsummary="true">
                          <batchtest>
                              <fileset dir="${tests.dir}">
                                  <include name="**/*Test.php" />
                              </fileset>
                          </batchtest>
                          <formatter type="plain" usefile="false" />
                          <formatter type="xml" usefile="true" todir="${reports.dir}" outfile="test-results.xml" />
                      </phpunit>
                  </target>
              </project>
              

              第 2 步:设置 Hudson

              1. 为 Hudson 安装 Phing 插件。请注意,您可能需要将 Phing 作为独立包安装(我将其放在 /opt/phing-2.3.3 中)并在 Hudson config 中配置 PHING_HOME 以指向该目录。您还应该能够使用 PEAR 安装的 Phing;但是,我没有对此进行测试。
              2. 配置 Hudson 以使用 Phing 构建您的项目。
              3. 配置 Hudson 以从您的项目中收集 JUnit 测试。我们的结果文件的名称是 test-results.xml。在上面的示例中,您将其配置为从报告/*.xml 收集文件。

              第 3 步:构建!

              应该这样做。立即尝试构建您的项目。希望它会收集结果。

              另请参阅此Phing presentation 或此Phing presentation,了解有关 Phing 和(在较小程度上)PHPUnit 集成的更多信息。

              祝你好运!

              【讨论】:

              • 感谢您的回答!我希望使用 ant 来完成,因为没有安装 phing,但我会试一试并报告。
              • 不幸的是,这不起作用。我让它与 phing 一起工作,它正在输出我期望的 xml 文件,尽管 JUnit 发布者像以前一样抱怨“没有任何测试报告包含任何结果”,即使它指向新目录。有什么想法吗?
              • 嗯……这很奇怪。这绝对对我有用——所有相关产品的最新版本。生成的 XML 文件是否实际上包含(有效的)测试结果?您是否仔细检查了目录路径? Hudson 中的一些路径似乎是相对于工作空间根目录的,一些是相对于项目根目录的。