150 votes

Python unittests dans Jenkins ?

Comment faire pour que Jenkins exécute les cas de python unittest ? Est-il possible d'obtenir une sortie XML de style JUnit à partir de l'outil intégré unittest paquet ?

187voto

dnozay Points 3672

Des tests d'échantillonnage :

tests.py :

# tests.py

import random
try:
    import unittest2 as unittest
except ImportError:
    import unittest

class SimpleTest(unittest.TestCase):
    @unittest.skip("demonstrating skipping")
    def test_skipped(self):
        self.fail("shouldn't happen")

    def test_pass(self):
        self.assertEqual(10, 7 + 3)

    def test_fail(self):
        self.assertEqual(11, 7 + 3)

JUnit avec pytest

exécuter les tests avec :

py.test --junitxml results.xml tests.py

results.xml :

<?xml version="1.0" encoding="utf-8"?>
<testsuite errors="0" failures="1" name="pytest" skips="1" tests="2" time="0.097">
    <testcase classname="tests.SimpleTest" name="test_fail" time="0.000301837921143">
        <failure message="test failure">self = &lt;tests.SimpleTest testMethod=test_fail&gt;

    def test_fail(self):
&gt;       self.assertEqual(11, 7 + 3)
E       AssertionError: 11 != 10

tests.py:16: AssertionError</failure>
    </testcase>
    <testcase classname="tests.SimpleTest" name="test_pass" time="0.000109910964966"/>
    <testcase classname="tests.SimpleTest" name="test_skipped" time="0.000164031982422">
        <skipped message="demonstrating skipping" type="pytest.skip">/home/damien/test-env/lib/python2.6/site-packages/_pytest/unittest.py:119: Skipped: demonstrating skipping</skipped>
    </testcase>
</testsuite>

JUnit avec nose

exécuter les tests avec :

nosetests --with-xunit

nosetests.xml :

<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="nosetests" tests="3" errors="0" failures="1" skip="1">
    <testcase classname="tests.SimpleTest" name="test_fail" time="0.000">
        <failure type="exceptions.AssertionError" message="11 != 10">
            <![CDATA[Traceback (most recent call last):
File "/opt/python-2.6.1/lib/python2.6/site-packages/unittest2-0.5.1-py2.6.egg/unittest2/case.py", line 340, in run
testMethod()
File "/home/damien/tests.py", line 16, in test_fail
self.assertEqual(11, 7 + 3)
File "/opt/python-2.6.1/lib/python2.6/site-packages/unittest2-0.5.1-py2.6.egg/unittest2/case.py", line 521, in assertEqual
assertion_func(first, second, msg=msg)
File "/opt/python-2.6.1/lib/python2.6/site-packages/unittest2-0.5.1-py2.6.egg/unittest2/case.py", line 514, in _baseAssertEqual
raise self.failureException(msg)
AssertionError: 11 != 10
]]>
        </failure>
    </testcase>
    <testcase classname="tests.SimpleTest" name="test_pass" time="0.000"></testcase>
    <testcase classname="tests.SimpleTest" name="test_skipped" time="0.000">
        <skipped type="nose.plugins.skip.SkipTest" message="demonstrating skipping">
            <![CDATA[SkipTest: demonstrating skipping
]]>
        </skipped>
    </testcase>
</testsuite>

JUnit avec nose2

Vous devez utiliser la fonction nose2.plugins.junitxml plugin. Vous pouvez configurer nose2 à l'aide d'un fichier de configuration comme vous le feriez normalement, ou à l'aide de l'option --plugin option de ligne de commande.

exécuter les tests avec :

nose2 --plugin nose2.plugins.junitxml --junit-xml tests

nose2-junit.xml :

<testsuite errors="0" failures="1" name="nose2-junit" skips="1" tests="3" time="0.001">
  <testcase classname="tests.SimpleTest" name="test_fail" time="0.000126">
    <failure message="test failure">Traceback (most recent call last):
  File "/Users/damien/Work/test2/tests.py", line 18, in test_fail
    self.assertEqual(11, 7 + 3)
AssertionError: 11 != 10
</failure>
  </testcase>
  <testcase classname="tests.SimpleTest" name="test_pass" time="0.000095" />
  <testcase classname="tests.SimpleTest" name="test_skipped" time="0.000058">
    <skipped />
  </testcase>
</testsuite>

JUnit avec unittest-xml-reporting

Ajouter ce qui suit à tests.py

if __name__ == '__main__':
    import xmlrunner
    unittest.main(testRunner=xmlrunner.XMLTestRunner(output='test-reports'))

exécuter les tests avec :

python tests.py

test-reports/TEST-SimpleTest-20131001140629.xml:

<?xml version="1.0" ?>
<testsuite errors="1" failures="0" name="SimpleTest-20131001140629" tests="3" time="0.000">
    <testcase classname="SimpleTest" name="test_pass" time="0.000"/>
    <testcase classname="SimpleTest" name="test_fail" time="0.000">
        <error message="11 != 10" type="AssertionError">
<![CDATA[Traceback (most recent call last):
  File "tests.py", line 16, in test_fail
    self.assertEqual(11, 7 + 3)
AssertionError: 11 != 10
]]>     </error>
    </testcase>
    <testcase classname="SimpleTest" name="test_skipped" time="0.000">
        <skipped message="demonstrating skipping" type="skip"/>
    </testcase>
    <system-out>
<![CDATA[]]>    </system-out>
    <system-err>
<![CDATA[]]>    </system-err>
</testsuite>

20voto

Joshua D. Boyd Points 1876

Je suis d'accord avec l'utilisation du nez. Les rapports XML de base sont maintenant intégrés. Il suffit d'utiliser l'option de ligne de commande --with-xunit pour obtenir un fichier nosetests.xml. Par exemple, il suffit d'utiliser l'option --with-xunit :

nosetests --with-xunit

Ajoutez ensuite une action post-construction "Publish JUnit test result report", et remplissez le champ "Test report XMLs" avec nosetests.xml (en supposant que vous avez exécuté nosetests dans $WORKSPACE).

12voto

Dave Bacher Points 7237

Vous pouvez installer le unittest-xml-reporting pour ajouter un programme d'exécution de tests qui génère du XML au programme intégré unittest .

Nous utilisons pytest qui dispose d'une sortie XML intégrée (il s'agit d'une option de ligne de commande).

Quoi qu'il en soit, l'exécution des tests unitaires peut se faire en lançant une commande shell.

4voto

gnibbler Points 103484

J'ai utilisé nosetests. Il existe des addons pour produire le XML pour Jenkins

3voto

Martijn Pieters Points 271458

Lors de l'utilisation de buildout, nous utilisons collective.xmltestreport pour produire une sortie XML de type JUnit, il est peut-être code source ou le module lui-même pourrait être utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X