Bagaimana Anda membuat Jenkins menjalankan kasus unittest python? Apakah mungkin untuk keluaran XML gaya JUnit dari unittest
paket bawaan ?
Bagaimana Anda membuat Jenkins menjalankan kasus unittest python? Apakah mungkin untuk keluaran XML gaya JUnit dari unittest
paket bawaan ?
Jawaban:
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)
jalankan tes dengan:
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>
jalankan tes dengan:
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>
Anda perlu menggunakan nose2.plugins.junitxml
plugin. Anda dapat mengonfigurasi nose2
dengan file konfigurasi seperti yang biasa Anda lakukan, atau dengan --plugin
opsi baris perintah.
jalankan tes dengan:
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>
Tambahkan yang berikut ini ke tests.py
if __name__ == '__main__':
import xmlrunner
unittest.main(testRunner=xmlrunner.XMLTestRunner(output='test-reports'))
jalankan tes dengan:
python tests.py
laporan-pengujian / 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
menggunakan Test Discovery? Ini bekerja persis seperti yang dijelaskan dalam jawaban unittest.main(testRunner=xmlrunner.XMLTestRunner(output='test-reports'))
.
Saya akan menggunakan hidung kedua. Pelaporan XML dasar sekarang sudah terpasang. Cukup gunakan opsi baris perintah --with-xunit dan ini akan menghasilkan file nosetests.xml. Sebagai contoh:
nosetests --dengan-xunit
Kemudian tambahkan tindakan post build "Publikasikan laporan hasil pengujian JUnit", dan isi kolom "Test report XMLs" dengan nosetests.xml (dengan asumsi Anda menjalankan nosetests di $ WORKSPACE).
Anda dapat menginstal paket unittest-xml-reporting untuk menambahkan runner pengujian yang menghasilkan XML ke built-in unittest
.
Kami menggunakan pytest , yang memiliki keluaran XML bawaan (ini adalah opsi baris perintah).
Apa pun itu, menjalankan pengujian unit dapat dilakukan dengan menjalankan perintah shell.
Saya menggunakan nosetests. Ada tambahan untuk mengeluarkan XML untuk Jenkins
Saat menggunakan buildout yang kami gunakan collective.xmltestreport
untuk menghasilkan output XML gaya JUnit, mungkin itu kode sumber atau modulnya sendiri yang bisa membantu.
python -m pytest --junit-xml=pytest_unit.xml source_directory/test/unit || true # tests may fail
Jalankan ini sebagai shell dari jenkins, Anda bisa mendapatkan laporannya di pytest_unit.xml sebagai artefak.
import nose ; nose.runmodule() # aka nose.run(defaultTest=__name__)