Des unitts Python à Jenkins?
Comment faire pour que Jenkins exécute les unittest cases de python?
Est-il possible de désactiver la sortie XML du paquet unittest
?
6 réponses
essais par sondage:
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 essais avec:
py.test --junitxml results.xml tests.py
des résultats.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 = <tests.SimpleTest testMethod=test_fail>
def test_fail(self):
> 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
exécuter les essais 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 le plugin nose2.plugins.junitxml
. Vous pouvez configurer nose2
avec un fichier de configuration comme vous le feriez normalement, ou avec l'option --plugin
en ligne de commande.
exécuter les essais 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 with 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 essais avec:
python tests.py
bulletins 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>
Je seconderais en utilisant le nez. La déclaration XML de base est maintenant intégrée. Il suffit d'utiliser l'option --with-xunit en ligne de commande et il produira un nosetests.fichier xml. Par exemple:
nosetests --with-xunit
puis Ajouter un" publier le rapport de résultats de test de JUnit "post construire l'action, et remplir le champ" rapport de Test XMLs " avec nosetests.xml (en supposant que vous avez lancé nosetests dans $WORKSPACE).
vous pouvez installer le paquet unittest-xml-reporting pour ajouter un coureur de test qui génère du XML au paquet intégré unittest
.
nous utilisons pytest , dont la sortie XML est intégrée (c'est une option en ligne de commande).
dans tous les cas, l'exécution des tests unitaires peut être effectuée en exécutant une commande shell.
j'ai utilisé des nosetests. Il y a des addons pour la sortie du XML pour Jenkins
lors de l'utilisation de buildout, nous utilisons collective.xmltestreport
pour produire une sortie XML de style JUnit, peut-être que c'est code source ou le module lui-même pourrait être utile.
python -m pytest --junit-xml=pytest_unit.xml source_directory/test/unit || true # tests may fail
exécutez ceci comme shell à partir de jenkins , vous pouvez obtenir le rapport dans pytest_unit.xml comme artefact.