xmlrunner使用unittest为子测试复制打印语句

我正在为 unittest https://github.com/xmlrunner/unittest-xml-reporting使用 xml测试运行程序,以便生成可以传递给 Allure 的XML文件。框架。
在我的功能之一中,我在列表(此处表示为范围)上迭代时使用了子测试功能。
我从命令行运行代码,如下所示: 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文件时,输出如下:

xmlrunner使用unittest为子测试复制打印语句

将为每个子测试打印range(1,10),而不仅仅是子测试本身的编号
我希望XML文件中的每个子测试都只包含相关的打印语句。
谢谢!

ss1stshoo 回答:xmlrunner使用unittest为子测试复制打印语句

在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",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",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",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",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",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",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",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",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",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,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),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,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",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",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",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",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",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",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",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",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",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),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",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",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

本文链接:https://www.f2er.com/3123618.html

大家都在问