web-dev-qa-db-fra.com

Python) teste l’unité à Jenkins?

Comment obtenez-vous Jenkins pour exécuter python des cas unittest? Est-il possible de produire une sortie XML de style JUnit à partir du paquetage intégré unittest?

127
erikbwork

échantillons de tests:

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 with pytest

lancer les tests avec:

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

resultats.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 le nez

lancer 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 auriez besoin d'utiliser le nose2.plugins.junitxml brancher. Vous pouvez configurer nose2 avec un fichier de configuration comme vous le feriez normalement, ou avec le --plugin option de ligne de commande.

lancer 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 __== '__main__':
    import xmlrunner
    unittest.main(testRunner=xmlrunner.XMLTestRunner(output='test-reports'))

lancer les tests avec:

python tests.py

rapports-de-test/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>
159
dnozay

Je seconde en utilisant le nez. La génération de rapports XML de base est désormais intégrée. Utilisez simplement l'option de ligne de commande --with-xunit pour générer un fichier nosetests.xml. Par exemple:

nosetests --with-xunit

Ajoutez ensuite une action de post-génération "Publier le résultat du test JUnit" et renseignez le champ "Test du fichier XML de rapport" avec nosetests.xml (en supposant que vous avez exécuté des nosetests dans $ WORKSPACE).

20
Joshua D. Boyd

Vous pouvez installer le package nittest-xml-reporting pour ajouter un programme d'exécution de test générant du code XML dans le unittest intégré.

Nous utilisons pytest , qui a une sortie XML intégrée (c'est une option en ligne de commande).

Dans les deux cas, l'exécution des tests unitaires peut être effectuée en exécutant une commande Shell.

11
Dave Bacher

J'ai utilisé des nosetests. Il y a des addons pour sortir le XML pour Jenkins

4
John La Rooy

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

3
Martijn Pieters
python -m pytest --junit-xml=pytest_unit.xml source_directory/test/unit || true # tests may fail

Exécutez ceci en tant que Shell à partir de Jenkins, vous pouvez obtenir le rapport dans pytest_unit.xml en tant qu’artefact.

2
Rajib Mitra