2012-06-28 4 views
103

젠킨스가 파이썬 단위 테스트 케이스를 어떻게 실행 시키나요? 내장형 unittest 패키지의 JUnit 스타일 XML 출력이 가능합니까?젠킨스에서 Python unittests?

+1

모든 대답은 명령 줄에서 테스트 사례를 시작하려고한다고 가정합니다. 하지만 프로그래밍 방식으로 테스트를 실행하려면 다음과 같이 해보십시오 :'import nose; nose.runmodule() # 일명 nose.run (defaultTest = __ 이름 __)' – MarkHu

+1

IMHO 간단한 'py.test - junitxml results.xml test.py'제안이 질문에 가장 잘 답변합니다. py.test를 설치하려면 'yum install pytest'를 입력하십시오. 그런 다음 unittest 파이썬 스크립트를 실행하고 jUnit xml 결과를 얻을 수 있습니다. – gaoithe

+0

@ gaoithe는 jenkins 부분에 응답하지만 내장 unittest 모듈을 사용하기위한 요구 사항을 충족하지는 않습니다. 그 프로젝트에서 그것은 주어진 요구 사항이었다. – erikbwork

답변

134

샘플 테스트 :

tests.py :

py.test --junitxml results.xml tests.py 

은 Results.xml :

012,354,065,666,172,324,146

# 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

과 함께 테스트를 실행

nosetests --with-xunit 

nosetests.xml :

JUnit with nose

함께 테스트를 실행

<?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 플러그인을 사용해야합니다. 평소처럼 config 파일을 사용하여 nose2을 구성하거나 --plugin 명령 줄 옵션을 사용하여 구성 할 수 있습니다.

nose2 --plugin nose2.plugins.junitxml --junit-xml tests 

nose2-의 JUnit :

함께 테스트를 실행합니다.XML :

python tests.py 

테스트 보고서/TEST-SimpleTest - 20131001140629.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

tests.py

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

에 다음과 같은 추가는 함께 테스트를 실행 :

<?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'제안. py.test를 설치하려면 'yum install pytest'를 입력하십시오. 그런 다음 unittest 파이썬 스크립트를 실행하고 jUnit xml 결과를 얻을 수 있습니다. – gaoithe

+0

_unittest-xml-reporting_을 사용하고 [테스트 검색 기능] (https://docs.python.org/3/library/unittest.html#unittest-test-discovery)의 이점을 활용하려면 ' unittest.main (module = None, testRunner = xmlrunner.XMLTestRunner (출력 = '테스트 보고서'))'. –

+0

@RosbergLinhares 왜 Test Discovery를 사용하려면'module = None'이 필요합니까? 이는'unittest.main (testRunner = xmlrunner.XMLTestRunner (output = 'test-reports'))'답변에 설명 된 것과 똑같이 작동합니다. – acm

5

nosetests를 사용했습니다. Jenkins 용 XML을 출력하는 추가 기능이 있습니다

3

buildout을 사용하는 경우 collective.xmltestreport을 사용하여 JUnit 스타일 XML 출력을 생성합니다 (아마도 source code이거나 모듈 자체가 도움이 될 수 있습니다).

8

unittest-xml-reporting 패키지를 설치하여 XML을 생성하는 테스트 러너를 내장 된 unittest에 추가 할 수 있습니다.

XML 출력이 내장 된 pytest을 사용합니다 (명령 행 옵션).

어느 쪽이든, 단위 테스트를 실행하는 것은 쉘 명령을 실행하여 수행 할 수 있습니다.

19

코를 두 번째로 사용합니다. 기본 XML보고가 내장되어 있습니다. --with-xunit 명령 줄 옵션을 사용하면 nosetests.xml 파일이 생성됩니다.

그런 다음 nosetests.xml와 "테스트 보고서 XMLS"필드에 "JUnit 테스트 결과 보고서를 게시"포스트 빌드 작업을 추가하고, 입력 --with-xUnit의

nosetests (예를 들면 : $ WORKSPACE에서 nosetests를 실행했다고 가정).

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

실행이 젠킨스에서 쉘, 당신은 유물로 pytest_unit.xml에서 보고서를 얻을 수 있습니다.