我正在对unittest https://github.com/xmlrunner/unittest-xml-reporting使用xml测试运行程序,以便生成可以为Allure框架传递的XML文件。在我的功能之一中,我在列表(此处表示为范围)上迭代时使用了子测试功能。我从command line运行代码,如下所示:py test.py我试图在每个子测试中打印要在输出中捕获并传递到XML文件的特定语句,但是由于某些原因,为每个子测试打印的输出是entire测试用例输出。这是代码结构:
import sys
import datetime
import unittest
import xmlrunner
class TestSomeFunc(unittest.TestCase):
def test_some_func(self):
for i in range(0,10):
with self.subTest(i):
result = False
print(i)
self.assertTrue(result, msg="Failure")
if __name__ == '__main__':
currentTime = str(datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
scriptName = sys.argv[0].split('.')[0]
testResultsName = scriptName + '_' + currentTime
unittest.main(
testRunner=xmlrunner.XMLTestRunner(output='testResults/' + testResultsName),
failfast=False, buffer=True, catchbreak=False, exit=False)
当我打开XML文件时,输出如下:将为每个子测试打印range(1,10),而不是仅打印子测试本身的编号我希望XML文件中的每个子测试仅包含相关的打印语句。谢谢!
在xmltestRunner的源代码中,他们已经将(系统输出)和(系统错误)的整个输出格式化为dom元素。因此,这就是您在整个系统执行的所有测试用例中争夺整个系统输出的原因。
xmltestrunner中的源代码
def _report_output(test_runner, xml_testsuite, xml_document):
"""
Appends the system-out and system-err sections to the XML document.
"""
systemout = xml_document.createElement('system-out')
xml_testsuite.appendChild(systemout)
systemout_text = xml_document.createCDATASection(sys.stdout.getvalue())
systemout.appendChild(systemout_text)
systemerr = xml_document.createElement('system-err')
xml_testsuite.appendChild(systemerr)
systemerr_text = xml_document.createCDATASection(sys.stderr.getvalue())
systemerr.appendChild(systemerr_text)
来源:https://github.com/pycontribs/xmlrunner/blob/master/xmlrunner/xmlrunner.py
例如,如果您执行下面的代码段
import sys
import datetime
import unittest
import xmlrunner
import random
class TestSomeFunc(unittest.TestCase):
def setUp(self):
self.seq = list(range(10))
def testCase(self,value):
with self.subTest(value=value):
result = False
print("Input")
print(value)
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
def test_some_func(self):
for i in random.sample(self.seq, 10):
self.testCase(i)
if __name__ == '__main__':
currentTime = str(datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
scriptName = sys.argv[0].split('.')[0]
testResultsName = scriptName + '_' + currentTime
unittest.main(
testRunner=xmlrunner.XMLTestRunner(output='testResults/' + testResultsName),
failfast=False, buffer=True, catchbreak=False, exit=False)
您的xml看起来类似于以下内容
<?xml version="1.0" encoding="UTF-8"?>
<testsuite errors="1" failures="10" file=".py" name="TestSomeFunc-20191118181814" skipped="0" tests="11" time="0.044" timestamp="2019-11-18T18:18:14">
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="18" name="test_some_func (value=1)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 1" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 16, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 1
]]> </failure>
<system-out>
<![CDATA[Input
1
Input
0
Input
7
Input
6
Input
2
Input
8
Input
4
Input
3
Input
9
Input
5
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="18" name="test_some_func (value=0)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 0" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 16, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 0
]]> </failure>
<system-out>
<![CDATA[Input
1
Input
0
Input
7
Input
6
Input
2
Input
8
Input
4
Input
3
Input
9
Input
5
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="18" name="test_some_func (value=7)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 7" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 16, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 7
]]> </failure>
<system-out>
<![CDATA[Input
1
Input
0
Input
7
Input
6
Input
2
Input
8
Input
4
Input
3
Input
9
Input
5
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="18" name="test_some_func (value=6)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 6" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 16, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 6
]]> </failure>
<system-out>
<![CDATA[Input
1
Input
0
Input
7
Input
6
Input
2
Input
8
Input
4
Input
3
Input
9
Input
5
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="18" name="test_some_func (value=2)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 2" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 16, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 2
]]> </failure>
<system-out>
<![CDATA[Input
1
Input
0
Input
7
Input
6
Input
2
Input
8
Input
4
Input
3
Input
9
Input
5
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="18" name="test_some_func (value=8)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 8" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 16, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 8
]]> </failure>
<system-out>
<![CDATA[Input
1
Input
0
Input
7
Input
6
Input
2
Input
8
Input
4
Input
3
Input
9
Input
5
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="18" name="test_some_func (value=4)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 4" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 16, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 4
]]> </failure>
<system-out>
<![CDATA[Input
1
Input
0
Input
7
Input
6
Input
2
Input
8
Input
4
Input
3
Input
9
Input
5
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="18" name="test_some_func (value=3)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 3" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 16, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 3
]]> </failure>
<system-out>
<![CDATA[Input
1
Input
0
Input
7
Input
6
Input
2
Input
8
Input
4
Input
3
Input
9
Input
5
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="18" name="test_some_func (value=9)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 9" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 16, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 9
]]> </failure>
<system-out>
<![CDATA[Input
1
Input
0
Input
7
Input
6
Input
2
Input
8
Input
4
Input
3
Input
9
Input
5
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="18" name="test_some_func (value=5)" time="0.037" timestamp="2019-11-18T18:18:14">
<failure message="False is not true : Test failed for the case :: 5" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 16, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 5
]]> </failure>
<system-out>
<![CDATA[Input
1
Input
0
Input
7
Input
6
Input
2
Input
8
Input
4
Input
3
Input
9
Input
5
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="11" name="testCase" time="0.007" timestamp="2019-11-18T18:18:14">
<error message="testCase() missing 1 required positional argument: 'value'" type="TypeError">
<![CDATA[TypeError: testCase() missing 1 required positional argument: 'value'
]]> </error>
<system-out>
<![CDATA[]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
</testsuite>
如果您确实需要失败的值,可以在assetTrue中使用“ msg”参数,类似这样:>
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
为了更加清楚,如果您将print语句添加到测试用例之外,那么您也可以在每个测试用例中获取该语句,下面是显示相同内容的代码段。
import sys import datetime import unittest import xmlrunner import random class TestSomeFunc(unittest.TestCase): def setUp(self): self.seq = list(range(10)) def testCase(self,value): with self.subTest(value=value): result = False self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value)) def test_some_func(self): for i in random.sample(self.seq, 10): self.testCase(i) print("Input") if __name__ == '__main__': currentTime = str(datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S')) scriptName = sys.argv[0].split('.')[0] testResultsName = scriptName + '_' + currentTime unittest.main( testRunner=xmlrunner.XMLTestRunner(output='testResults/' + testResultsName), failfast=False, buffer=True, catchbreak=False, exit=False)
以上的XML输出。
<?xml version="1.0" encoding="UTF-8"?>
<testsuite errors="1" failures="10" file=".py" name="TestSomeFunc-20191118182556" skipped="0" tests="11" time="0.014" timestamp="2019-11-18T18:25:56">
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="16" name="test_some_func (value=7)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 7" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 14, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 7
]]> </failure>
<system-out>
<![CDATA[Input
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="16" name="test_some_func (value=6)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 6" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 14, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 6
]]> </failure>
<system-out>
<![CDATA[Input
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="16" name="test_some_func (value=4)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 4" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 14, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 4
]]> </failure>
<system-out>
<![CDATA[Input
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="16" name="test_some_func (value=2)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 2" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 14, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 2
]]> </failure>
<system-out>
<![CDATA[Input
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="16" name="test_some_func (value=0)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 0" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 14, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 0
]]> </failure>
<system-out>
<![CDATA[Input
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="16" name="test_some_func (value=8)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 8" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 14, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 8
]]> </failure>
<system-out>
<![CDATA[Input
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="16" name="test_some_func (value=1)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 1" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 14, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 1
]]> </failure>
<system-out>
<![CDATA[Input
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="16" name="test_some_func (value=9)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 9" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 14, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 9
]]> </failure>
<system-out>
<![CDATA[Input
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="16" name="test_some_func (value=5)" time="0.000" timestamp="0001-01-01T00:00:00">
<failure message="False is not true : Test failed for the case :: 5" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 14, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 5
]]> </failure>
<system-out>
<![CDATA[Input
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="16" name="test_some_func (value=3)" time="0.007" timestamp="2019-11-18T18:25:56">
<failure message="False is not true : Test failed for the case :: 3" type="AssertionError">
<![CDATA[Traceback (most recent call last):
File "sampleInstancetest.py", line 14, in testCase
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(value))
AssertionError: False is not true : Test failed for the case :: 3
]]> </failure>
<system-out>
<![CDATA[Input
]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
<testcase classname="TestSomeFunc" file="sampleInstancetest.py" line="11" name="testCase" time="0.007" timestamp="2019-11-18T18:25:56">
<error message="testCase() missing 1 required positional argument: 'value'" type="TypeError">
<![CDATA[TypeError: testCase() missing 1 required positional argument: 'value'
]]> </error>
<system-out>
<![CDATA[]]> </system-out>
<system-err>
<![CDATA[]]> </system-err>
</testcase>
</testsuite>