当我在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)
稍微深入一下Python source code就可以发现
TestCase
注册了一系列方法来测试不同类型的相等性。您可以看到
unicode
已注册为使用assertMultiLineEqual()
,但str
未注册为任何特殊用途。我不知道为什么str
被遗漏了,但到目前为止,我对以下两种方法都很满意。直接打电话
如果默认情况下8位字符串未注册为使用
assertMultiLineEqual()
,您仍然可以直接调用它。寄存器字符串类型
你也可以自己注册。只需在测试用例的
setUp()
方法中添加一行代码。做一次,所有的测试方法都将使用正确的方法来测试相等性。如果您的项目对于所有测试用例都有一个公共基类,那么这将是放置它的好地方。当字符串比较失败时,这两种方法都将包括突出显示。
相关问题 更多 >
编程相关推荐