Python单元测试中多行字符串的比较

发布于 2021-01-29 14:11:02

当我在Python单元测试中比较两个Unicode字符串时,它会给出一个不错的失败消息,突出显示哪些行和字符不同。但是,比较两个8位字符串只会显示两个字符串而不会突出显示。

如何获得Unicode和8位字符串的突出显示?

这是一个显示两个比较的示例单元测试:

import unittest

class TestAssertEqual(unittest.TestCase):
    def testString(self):
        a = 'xax\nzzz'
        b = 'xbx\nzzz'
        self.assertEqual(a, b)

    def testUnicode(self):
        a = u'xax\nzzz'
        b = u'xbx\nzzz'
        self.assertEqual(a, b)

if __name__ == '__main__':
    unittest.main()

该测试的结果显示出差异:

FF
======================================================================
FAIL: testString (__main__.TestAssertEqual)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/mnt/data/don/workspace/scratch/scratch.py", line 7, in testString
    self.assertEqual(a, b)
AssertionError: 'xax\nzzz' != 'xbx\nzzz'

======================================================================
FAIL: testUnicode (__main__.TestAssertEqual)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/mnt/data/don/workspace/scratch/scratch.py", line 12, in testUnicode
    self.assertEqual(a, b)
AssertionError: u'xax\nzzz' != u'xbx\nzzz'
- xax
?  ^
+ xbx
?  ^
  zzz

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=2)
关注者
0
被浏览
141
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    Python源代码的一点点挖掘表明,TestCase注册了许多方法来测试不同类型的相等性。

    self.addTypeEqualityFunc(dict, 'assertDictEqual')
    self.addTypeEqualityFunc(list, 'assertListEqual')
    self.addTypeEqualityFunc(tuple, 'assertTupleEqual')
    self.addTypeEqualityFunc(set, 'assertSetEqual')
    self.addTypeEqualityFunc(frozenset, 'assertSetEqual')
    try:
        self.addTypeEqualityFunc(unicode, 'assertMultiLineEqual')
    except NameError:
        # No unicode support in this build
        pass
    

    您可以看到unicode已注册使用assertMultiLineEqual(),但未str注册任何特殊功能。我不知道为什么会str被遗漏,但是到目前为止,我对以下两种方法中的任何一种都感到满意。

    直接致电

    如果assertMultiLineEqual()默认未注册使用8位字符串,则仍然可以直接调用它。

    def testString(self):
        a = 'xax\nzzz'
        b = 'xbx\nzzz'
        self.assertMultiLineEqual(a, b)
    

    寄存器字符串类型

    您也可以自己注册。只需在测试用例的setUp()方法中添加一行即可。只需执行一次,您的所有测试方法都将使用正确的方法测试相等性。如果您的项目在所有测试用例中都有一个通用的基类,那将是放置它的好地方。

    class TestAssertEqual(unittest.TestCase):
        def setUp(self):
            super(TestAssertEqual, self).setUp()
            self.addTypeEqualityFunc(str, self.assertMultiLineEqual)
    
        def testString(self):
            a = 'xax\nzzz'
            b = 'xbx\nzzz'
            self.assertEqual(a, b)
    
        def testUnicode(self):
            a = u'xax\nzzz'
            b = u'xbx\nzzz'
            self.assertEqual(a, b)
    

    这些方法中的任何一种都将在字符串比较失败时突出显示。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看