2012-06-28 4 views
103

Как вы получаете Jenkins для выполнения python unittest случаев? Возможно ли создание JUnit-файла XML из встроенного пакета unittest?Python unittests в Дженкинсе?

+1

Все ответы предполагают, что вы хотите инициировать тестовые примеры из командной строки. Но если вы хотите программно запускать тесты, попробуйте следующее: «импортировать нос; nose.runmodule() # aka nose.run (defaultTest = __ name __) ' – MarkHu

+1

IMHO простое предложение« py.test --junitxml results.xml test.py »лучше всего отвечает на вопрос. 'yum install pytest', чтобы установить py.test. Затем вы можете запустить любой скрипт python unittest и получить jUnit xml results – gaoithe

+0

@gaoithe, который отвечает на часть jenkins, но не соответствует требованию использовать встроенный модуль unittest. В этом проекте это было заданное требование. – erikbwork

ответ

134

испытания образцов:

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 with pytest

запустить тесты с:

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> 

JUnit with nose

запустить тесты с:

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 with nose2

Вы должны были бы использовать nose2.plugins.junitxml плагин. Вы можете настроить nose2 с конфигурационным файлом, как обычно, или с параметром командной строки --plugin.

запустить тесты с:

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 with unittest-xml-reporting

Append следующее tests.py

if __name__ == '__main__': 
    import xmlrunner 
    unittest.main(testRunner=xmlrunner.XMLTestRunner(output='test-reports')) 

запустить тесты с:

python tests.py 

тест-отчетов/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> 
+2

+1 для простого «py.test --junitxml results.xml test.py». 'yum install pytest', чтобы установить py.test. Затем вы можете запустить любой скрипт python unittest и получить jUnit xml results. – gaoithe

+0

Если вы хотите использовать _unittest-xml-reporting_ и воспользоваться функцией [Test Discovery] (https://docs.python.org/3/library/unittest.html#unittest-test-discovery), вы можете поместить ' unittest.main (module = None, testRunner = xmlrunner.XMLTestRunner (output = 'test-reports')) '. –

+0

@ RosbergLinhares зачем вам 'module = None' использовать Test Discovery? Он работает точно так, как описано в ответе 'unittest.main (testRunner = xmlrunner.XMLTestRunner (output = 'test-reports'))'. – acm

5

Я использовал носеты. Есть аддоны для вывода XML для Jenkins

3

При использовании buildout мы используем collective.xmltestreport для создания XML-вывода в стиле JUnit, возможно, это source code, или сам модуль может помочь.

8

Вы можете установить пакет unittest-xml-reporting, чтобы добавить тестовый бегун, который генерирует XML для встроенного unittest.

Мы используем pytest, который имеет встроенный XML-выход (это опция командной строки).

В любом случае выполнение модульных тестов может быть выполнено путем запуска команды оболочки.

19

Я бы второй использовал нос. В настоящее время встроена базовая XML-отчетность. Просто используйте параметр командной строки -with-xunit, и она создаст файл nosetests.xml. Например:

nosetests --with-XUnit

Затем добавить "Публикация отчета о результатах тест JUnit" действие после сборки и заполнения в "Test XMLs отчета" поле с nosetests.xml (предполагая, что вы запустили nosetests в $ WORKSPACE).

1
python -m pytest --junit-xml=pytest_unit.xml source_directory/test/unit || true # tests may fail 

Выполнить это как оболочки из Дженкинс, вы можете получить отчет в pytest_unit.xml как артефакт.

Смежные вопросы