Jenkins Python birim testleri?


135

Jenkins'in python unittest vakalarını yürütmesini nasıl sağlıyorsunuz? Yerleşik unittestpaketten JUnit stili XML çıktısı almak mümkün müdür ?


1
Tüm yanıtlar, test senaryolarını komut satırından başlatmak istediğinizi varsayar. Ancak testleri programlı olarak çalıştırmak istiyorsanız, şunu deneyin:import nose ; nose.runmodule() # aka nose.run(defaultTest=__name__)
MarkHu

1
IMHO basit 'py.test --junitxml results.xml test.py' önerisi soruyu en iyi şekilde yanıtlar. py.test'in kurulu olması için 'yum install pytest'. Sonra herhangi bir unittest python betiği çalıştırabilir ve jUnit xml sonuçları alabilirsiniz
gaoithe

1
@gaoithe jenkins bölümünü yanıtlar, ancak yerleşik unittest modülünü kullanma gereksinimini karşılamaz. Bu projede verilen bir gereklilikti.
erikbwork

@ erikb85 "Herhangi bir unittest python betiğini çalıştır" dediğimde, unittest modülünü kullanan bir betiği kastediyorum.
gaoithe

Yanıtlar:


173

örnek testler:

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)

Pytest ile JUnit

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 = &lt;tests.SimpleTest testMethod=test_fail&gt;

    def test_fail(self):
&gt;       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>

Burun ile JUnit

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>

Burun ile JUnit2

nose2.plugins.junitxmlEklentiyi kullanmanız gerekir . Sen yapılandırabilir nose2normalde ya yapacağını gibi bir yapılandırma dosyası ile --pluginkomut 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>

Unittest-xml-raporlama ile JUnit

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>

4
Basit 'py.test --junitxml results.xml test.py' önerisi için +1. py.test'in kurulu olması için 'yum install pytest'. Sonra herhangi bir unittest python komut dosyasını çalıştırabilir ve jUnit xml sonuçları alabilirsiniz.
gaoithe

1
Kullanmak isterseniz unittest-xml-raporlama gelen ve fayda Testi Keşif özelliği , sen koyabilirsiniz unittest.main(module=None, testRunner=xmlrunner.XMLTestRunner(output='test-reports')).
Rosberg Linhares

@RosbergLinhares module=NoneTest Keşfini neden kullanmanız gerekiyor ? Tam olarak cevapta açıklandığı gibi çalışır unittest.main(testRunner=xmlrunner.XMLTestRunner(output='test-reports')).
acm

@RosbergLinhares, test keşfi sırasında modüller sadece içe aktarılır ancak çalıştırılmaz. Peki, bu çözümlerden herhangi birinin nasıl keşifle çalışması gerekiyor? Sadece denedim, hiçbiri işe yaramıyor. Yoksa bir şey mi kaçırıyorum?
Konstantin

20

İ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).


11

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.


4

Burun kanaması kullandım. Jenkins için XML çıktısı eklentileri var



2
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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.