python - xmlrunner 使用 unittest 复制子测试的打印语句
问题描述
我正在为unittest https://github.com/xmlrunner/unittest-xml-reporting使用xml 测试运行程序,以便生成可以传递给Allure框架的 XML 文件。
在我的一个函数中,我在迭代列表(此处表示为范围)时使用子测试功能。
我正在从命令行运行代码,如下所示:py test.py
我试图在每个子测试中打印要在输出中捕获并传递给 XML 文件的特定语句,但由于某种原因正在打印的输出每个子测试是整个测试用例的输出。这是代码结构:
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 文件时,输出如下:
正在为每个子测试打印范围(1,10),而不是只打印子测试本身的数量,
我希望 XML 文件中的每个子测试仅包含相关的印刷报表。
谢谢!
解决方案
在 xmltestRunner 的源代码中,他们将 (system out) 和 (system error) 的整个输出格式化为 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))
为了更清楚,如果您在测试用例之外添加打印语句,您也可以获得每个测试用例中的语句,下面是显示相同的片段。
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>
在控制台中打印必要消息的小解决方法如下
import sys
import datetime
import unittest
import xmlrunner
import random
import sys,string
import traceback
import time
class TestSomeFunc(unittest.TestCase):
def setUp(self):
self.seq = list(range(10))
def test_some_func(self):
for index in random.sample(self.seq, 3):
try:
with self.subTest(index=index):
result = False
messsage = "stdout :: Test failed at index :: "+str(index)
print(messsage, file=sys.__stdout__)
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(index))
except AssertionError:
print("Exception")
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)
控制台输出:
Running tests...
----------------------------------------------------------------------
stdout :: Test failed at index :: 4
stdout :: Test failed at index :: 0
stdout :: Test failed at index :: 5
F
======================================================================
FAIL [0.000s]: test_some_func (__main__.TestSomeFunc) (index=4)
----------------------------------------------------------------------
Traceback (most recent call last):
File "sampleInstancetest.py", line 21, in test_some_func
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(index))
AssertionError: False is not true : Test failed for the case :: 4
======================================================================
FAIL [0.000s]: test_some_func (__main__.TestSomeFunc) (index=0)
----------------------------------------------------------------------
Traceback (most recent call last):
File "sampleInstancetest.py", line 21, in test_some_func
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(index))
AssertionError: False is not true : Test failed for the case :: 0
======================================================================
FAIL [0.014s]: test_some_func (__main__.TestSomeFunc) (index=5)
----------------------------------------------------------------------
Traceback (most recent call last):
File "sampleInstancetest.py", line 21, in test_some_func
self.assertTrue(result, msg='Test failed for the case :: {0}'.format(index))
AssertionError: False is not true : Test failed for the case :: 5
----------------------------------------------------------------------
Ran 1 test in 0.014s
FAILED (failures=3)
Generating XML reports...
来源: https ://github.com/xmlrunner/unittest-xml-reporting/issues/156 https://github.com/xmlrunner/unittest-xml-reporting/pull/166
推荐阅读
- excel - VBA 调整表大小会导致整个工作簿中的数据验证副本
- python-3.x - python中的FIFO缓冲区
- asp.net-core - 对象属性上缺少 ASP .NET Core 生成的 Swagger 描述
- java - Java DatagramChannel - 在一次“读取”调用中读取所有可用的数据报
- typescript - Typescript:如何引用数组定义的子类型?
- c# - 从 SQL Server 在 C# 中查询 JSON
- git - 如何在不丢失更改的情况下重做cherrypick的合并冲突解决方案(提交后)?
- sql-server - 是否可以在 VBS 中取消本地化 MSSQL 结果?
- reactjs - 如何在反应路由器路由转换之间有一个加载图标?
- javascript - 我不能将动态创建的元素的背景颜色更改超过 2 次