Don*_*kby 5 python unicode unit-testing
当我在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()
Run Code Online (Sandbox Code Playgroud)
该测试的结果显示了差异:
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)
Run Code Online (Sandbox Code Playgroud)
在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
Run Code Online (Sandbox Code Playgroud)
您可以看到unicode已注册使用assertMultiLineEqual(),但未str注册任何特殊内容.我不知道为什么str被遗漏,但到目前为止,我对以下两种方法中的任何一种都很满意.
如果assertMultiLineEqual()默认情况下未注册使用8位字符串,您仍可以直接调用它.
def testString(self):
a = 'xax\nzzz'
b = 'xbx\nzzz'
self.assertMultiLineEqual(a, b)
Run Code Online (Sandbox Code Playgroud)
您也可以自己注册.只需在测试用例的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)
Run Code Online (Sandbox Code Playgroud)
这些方法中的任何一个都将包括在字符串比较失败时突出显示.
| 归档时间: |
|
| 查看次数: |
6259 次 |
| 最近记录: |