Jenkins'in python unittest vakalarını yürütmesini nasıl sağlıyorsunuz? Yerleşik unittest
paketten JUnit stili XML çıktısı almak mümkün müdür ?
Jenkins'in python unittest vakalarını yürütmesini nasıl sağlıyorsunuz? Yerleşik unittest
paketten JUnit stili XML çıktısı almak mümkün müdür ?
Yanıtlar:
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)
testleri şu şekilde yapın:
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>
testleri şu şekilde yapın:
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>
nose2.plugins.junitxml
Eklentiyi kullanmanız gerekir . Sen yapılandırabilir nose2
normalde ya yapacağını gibi bir yapılandırma dosyası ile --plugin
komut satırı seçeneği.
testleri şu şekilde yapın:
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>
Aşağıdakilere şunu ekleyin: tests.py
if __name__ == '__main__':
import xmlrunner
unittest.main(testRunner=xmlrunner.XMLTestRunner(output='test-reports'))
testleri şu şekilde yapın:
python tests.py
Test-raporları / 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
Test Keşfini neden kullanmanız gerekiyor ? Tam olarak cevapta açıklandığı gibi çalışır unittest.main(testRunner=xmlrunner.XMLTestRunner(output='test-reports'))
.
İkinci olarak burun kullanırım. Temel XML raporlaması artık yerleşiktir. Sadece --with-xunit komut satırı seçeneğini kullanın ve bir nosetests.xml dosyası oluşturur. Örneğin:
nosetestler - xunit ile
Ardından, bir "JUnit test sonucu raporu yayınla" yayın oluşturma eylemi ekleyin ve "Rapor XML'lerini test et" alanını nosetests.xml ile doldurun (nosetest'leri $ WORKSPACE içinde çalıştırdığınız varsayılarak).
Yerleşik XML üreten bir test çalıştırıcısı eklemek için unittest-xml raporlama paketini kurabilirsiniz unittest
.
XML çıkışı yerleşik olan pytest kullanıyoruz (bu bir komut satırı seçeneğidir).
Her iki durumda da, birim testlerinin yürütülmesi bir kabuk komutu çalıştırılarak yapılabilir.
Burun kanaması kullandım. Jenkins için XML çıktısı eklentileri var
collective.xmltestreport
JUnit tarzı XML çıktısı oluşturmak için kullandığımız derleme kullanırken , belki de kaynak kodu veya modülün kendisi yardımcı olabilir.
python -m pytest --junit-xml=pytest_unit.xml source_directory/test/unit || true # tests may fail
Bunu jenkinlerden kabuk olarak çalıştırın, raporu pytest_unit.xml dosyasında eser olarak alabilirsiniz.
import nose ; nose.runmodule() # aka nose.run(defaultTest=__name__)