Con trăn không đáng tin ở Jenkins?


135

Làm thế nào để bạn có được Jenkins để thực hiện các trường hợp không đáng tin nhất python? Có thể xuất đầu ra XML kiểu JUnit từ unittestgói dựng sẵn không?


1
Tất cả các câu trả lời cho rằng bạn muốn bắt đầu các trường hợp thử nghiệm từ dòng lệnh. Nhưng nếu bạn muốn chạy thử nghiệm theo chương trình, hãy thử điều này:import nose ; nose.runmodule() # aka nose.run(defaultTest=__name__)
MarkHu

1
IMHO gợi ý đơn giản 'py.test --junitxml results.xml test.txt' trả lời câu hỏi tốt nhất. 'yum cài đặt pytest' để cài đặt py.test. Sau đó, bạn có thể chạy bất kỳ tập lệnh python nào nhất và nhận kết quả
jUnit

1
@gaoithe trả lời phần jenkins, nhưng không đáp ứng yêu cầu sử dụng mô-đun unittest dựng sẵn. Trong dự án đó là một yêu cầu nhất định.
erikbwork

@ erikb85 Khi tôi nói "chạy bất kỳ tập lệnh python nào nhất" tôi có nghĩa là một tập lệnh sử dụng mô-đun không đáng tin cậy nhất.
gaoithe

Câu trả lời:


173

xét nghiệm mẫu:

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 với pytest

chạy thử nghiệm với:

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 với mũi

chạy thử nghiệm với:

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 với mũi2

Bạn sẽ cần phải sử dụng nose2.plugins.junitxmlplugin. Bạn có thể định cấu hình nose2với tệp cấu hình như bạn thường làm hoặc với --plugintùy chọn dòng lệnh.

chạy thử nghiệm với:

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

mũi2-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 với báo cáo unittest-xml

Nối các mục sau vào tests.py

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

chạy thử nghiệm với:

python tests.py

kiểm tra báo cáo / 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
+1 cho đề xuất 'py.test --junitxml results.txt' đơn giản. 'yum cài đặt pytest' để cài đặt py.test. Sau đó, bạn có thể chạy bất kỳ tập lệnh python không đáng tin cậy nào và nhận kết quả jUnit xml.
gaoithe

1
Nếu bạn muốn sử dụng báo cáo unmlest-xml và hưởng lợi từ tính năng Khám phá thử nghiệm , bạn có thể đặt unittest.main(module=None, testRunner=xmlrunner.XMLTestRunner(output='test-reports')).
Rosberg Linhares

@RosbergLinhares tại sao bạn cần module=Nonesử dụng Test Discovery? Nó hoạt động chính xác như được mô tả trong câu trả lời unittest.main(testRunner=xmlrunner.XMLTestRunner(output='test-reports')).
acm

@RosbergLinhares, trong quá trình khám phá thử nghiệm, các mô-đun chỉ được nhập nhưng không được thực thi. Vì vậy, làm thế nào là bất kỳ giải pháp nào được cho là làm việc với khám phá? Tôi chỉ thử nó, không có cái nào hoạt động. Hay tôi đang thiếu một cái gì đó?
Konstantin

20

Tôi sẽ sử dụng mũi thứ hai. Báo cáo XML cơ bản hiện đã được tích hợp sẵn. Chỉ cần sử dụng tùy chọn dòng lệnh --with-xunit và nó sẽ tạo ra tệp nosetests.xml. Ví dụ:

nosetests - với-xunit

Sau đó, thêm hành động xây dựng bài đăng "Báo cáo kết quả kiểm tra JUnit" và điền vào trường "XML báo cáo thử nghiệm" với nosetests.xml (giả sử rằng bạn đã chạy nosetests trong $ WORKSPACE).


11

Bạn có thể cài đặt gói báo cáo unittest-xml để thêm trình chạy thử nghiệm tạo XML vào tích hợp unittest.

Chúng tôi sử dụng pytest , có đầu ra XML tích hợp (đó là tùy chọn dòng lệnh).

Dù bằng cách nào, việc thực hiện các bài kiểm tra đơn vị có thể được thực hiện bằng cách chạy lệnh shell.


4

Tôi đã sử dụng nosetests. Có các addon để xuất XML cho Jenkins



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

Chạy cái này dưới dạng shell từ jenkins, bạn có thể lấy báo cáo trong pytest_unit.xml dưới dạng artifact.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.