Jak zmusić Jenkinsa do wykonywania przypadków Python Unittest? Czy możliwe jest wyjście XML w stylu JUnit z wbudowanego unittest
pakietu?
Jak zmusić Jenkinsa do wykonywania przypadków Python Unittest? Czy możliwe jest wyjście XML w stylu JUnit z wbudowanego unittest
pakietu?
Odpowiedzi:
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)
uruchom testy z:
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>
uruchom testy z:
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>
Musisz użyć nose2.plugins.junitxml
wtyczki. Możesz skonfigurować nose2
za pomocą pliku konfiguracyjnego, tak jak zwykle, lub za pomocą --plugin
opcji wiersza poleceń.
uruchom testy z:
nose2 --plugin nose2.plugins.junitxml --junit-xml tests
nos2-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>
Dołącz następujące elementy do tests.py
if __name__ == '__main__':
import xmlrunner
unittest.main(testRunner=xmlrunner.XMLTestRunner(output='test-reports'))
uruchom testy z:
python tests.py
raporty-testowe / 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>
unittest.main(module=None, testRunner=xmlrunner.XMLTestRunner(output='test-reports'))
.
module=None
używać Test Discovery? Działa dokładnie tak, jak opisano w odpowiedzi unittest.main(testRunner=xmlrunner.XMLTestRunner(output='test-reports'))
.
Po drugie, użyłbym nosa. Podstawowe raportowanie XML jest teraz wbudowane. Po prostu użyj opcji wiersza poleceń --with-xunit, a utworzy plik nosetests.xml. Na przykład:
nosetests --with-xunit
Następnie dodaj akcję „Publikuj raport wyników testu JUnit” po kompilacji i wypełnij pole „Pliki XML raportu testowego” kodem nosetests.xml (zakładając, że wykonałeś testy nosetests w $ WORKSPACE).
Możesz zainstalować pakiet unittest-xml-report, aby dodać moduł uruchamiający testy, który generuje XML do wbudowanego unittest
.
Używamy pytest , który ma wbudowane wyjście XML (jest to opcja linii poleceń).
Tak czy inaczej, wykonanie testów jednostkowych można wykonać, uruchamiając polecenie powłoki.
Użyłem nosetestów. Istnieją dodatki do wyprowadzania XML dla Jenkinsa
Podczas korzystania z buildout używamy collective.xmltestreport
do tworzenia wyjścia XML w stylu JUnit, być może jego kod źródłowy lub sam moduł może być pomocny.
python -m pytest --junit-xml=pytest_unit.xml source_directory/test/unit || true # tests may fail
Uruchom to jako powłokę z jenkins, możesz pobrać raport w pytest_unit.xml jako artefakt.
import nose ; nose.runmodule() # aka nose.run(defaultTest=__name__)