test - ¿Pruebas unitarias de Python en Jenkins?
pruebas unitarias en python (6)
¿Cómo haces para que Jenkins ejecute los casos de python unittest? ¿Es posible JUnit salida XML de estilo desde el paquete interno unittest
?
pruebas de muestra:
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 con Pytest
ejecuta las pruebas con:
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 = <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 con nariz
ejecuta las pruebas con:
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 con nose2
nose2.plugins.junitxml
usar el complemento nose2.plugins.junitxml
. Puede configurar nose2
con un archivo config como lo haría normalmente, o con la --plugin
línea de comando.
ejecuta las pruebas con:
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 con unittest-xml-reporting
Añada lo siguiente a tests.py
if __name__ == ''__main__'':
import xmlrunner
unittest.main(testRunner=xmlrunner.XMLTestRunner(output=''test-reports''))
ejecuta las pruebas con:
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>
Al usar buildout usamos collective.xmltestreport
para producir salida XML estilo JUnit, tal vez su código fuente o el módulo en sí mismo podría ser de ayuda.
Puede instalar el paquete unittest-xml-reporting para agregar un corrector de prueba que genere XML a la prueba unittest
incorporada.
Usamos pytest , que tiene una salida XML incorporada (es una opción de línea de comando).
De cualquier forma, la ejecución de las pruebas unitarias se puede realizar ejecutando un comando de shell.
Usé nosetests. Hay complementos para generar el XML para Jenkins
Yo usaría la nariz en segundo lugar. Los informes XML básicos ahora están incorporados. Simplemente use la opción de línea de comandos --with-xunit y generará un archivo nosetests.xml. Por ejemplo:
nosetests --with-xunit
A continuación, agregue una acción de creación de publicación "Publicar informe de resultados de prueba JUnit" y complete el campo "Probar XML de informes" con nosetests.xml (suponiendo que ejecutó nosetest en $ WORKSPACE).
python -m pytest --junit-xml=pytest_unit.xml source_directory/test/unit || true # tests may fail
Ejecuta esto como shell de jenkins, puedes obtener el informe en pytest_unit.xml como artefacto.