How might I integrate phpunit with Hudson CI?

2020-02-02 04:50发布

问题:

We are looking at switching from phpundercontrol to Hudson (it looks to have some really cool features!) but I can't figure out how to get phpunit logs to show up.

I have phpunit running fine in Hudson with ant, and --log-xml is putting a phpunit.xml in the appropriate builds/ folder for that build. But I can't figure out how to get that to show up for the build, so that we can see the tests the ran and which failed, if any.

After I figure that out, getting coverage, metrics, and api will be next :)

It seems like it should be trivial for anything which generates its on HTML, to tell Hudson for example "For this project show a link to 'API' for each build and link to builds/$BUILDNUM/api/index.html".

回答1:

I installed the xUnit plugin, pointed it at my log file (from job config), and it works like a charm. It appears there is no longer a need for any custom hacks.

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



回答2:

With the last answer being from 2009 and a lot of people migrating from Hudson to Jenkins now due to Oracle, consider using the Jenkins Template for PHP, offering a free and convenient template for all your configuration needs of PHPQATools, like pdepend, phpmd, phpcs and phpunit in one convenient template.

  • http://jenkins-php.org/
  • http://edorian.posterous.com/setting-up-jenkins-for-php-projects

There is also the IRC channel #jenkins-php on Freenode for support.



回答3:

you can also use this xslt file to convert phpunit xml to 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>


回答4:

I typically work with CruiseControl for PHP testing (using CC's Phing support, not phpundercontrol). I have only worked with Hudson a little, but have gotten Hudson to successfully record phpunit tests using phing's phpunit support.

The following instructions assume that you will be using Phing (not Ant) to manage your PHP project builds and that you have the necessary prereqs installed. It also assumes you have PHPUnit 3 installed (though PHPUnit 2.x should work too).

Step 1: Setup Project for Phing/PHPUnit

First you need to make sure that your project is testable using Phing. Here's a sample Phing build.xml that runs unit tests and creates a JUnit-compatible XML output.

<?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>

Step 2: Setup Hudson

  1. Install the Phing plugin for Hudson. Note that you may need to install Phing as a standalone pacakge (I put it in /opt/phing-2.3.3) and configure PHING_HOME in Hudson config to point to that directory. You should also be able to use the PEAR-installed Phing; however, I have not tested that.
  2. Configure Hudson to build your project using Phing.
  3. Configure Hudson to collect JUnit tests from your project. The name of our results file will be test-results.xml. In the example above you'd configure it to collect files from reports/*.xml.

Step 3: Build!

That should do it. Try building your project now. Hopefully it will collect the results.

Also see this Phing presentation, or this Phing presentation for more on Phing and (to a lesser extent) PHPUnit integration.

Good luck!



回答5:

The format of the XML emitted by PHPUnit is not (currently) compatible with Hudson because it is not quite the same as the XML generated by other similar tools. That's why you get the "None of the test reports contained any result" message.

Short of fixing PHPUnit to generate "better" XML or improving Hudson to be more flexible in what it accepts, the only solution is to fix the XML by eliminating the nesting of <testuite> elements. I've used sed to alter the PHPUnit XML so that it is acceptable to Hudson:

# 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


回答6:

The XSLT transformation from the previous post doesn't works for me. After applying this transformation DOM structure of the report is not changed. I've modified it to fix the problem. My variant is:

<?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>

it works for me.



回答7:

If you would like a complete tutorial on integrating PHP with Hudson you can check out this link:

Continuous Integration for PHP with Hudson



回答8:

The answer above is valid but more simply, without changing your build process :

  • Configure your project
  • Check the box public JUnit report (see http://thinkvitamin.com/images/articles/hudson/hudson_setup.png ), and fill the location of "phpunit.xml in the appropriate builds/ folder"
  • hopefully on the next build will contain a trend and more detailed informations about your tests, like here https://hudson.dev.java.net/screenshots/5.png


回答9:

I believe the xslt might have to be varied depending upon the phpunit version one is using. For instance, the style sheet posted by hoschi worked well for me, using phpunit version 3.3.17

But it's entirely possible that phpunit was upgraded to emit a different format in newer versions, or sir-vestnik could be running an older version.