当前位置: 首页 > 面试题库 >

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

戚兴思
2023-03-14
问题内容

当我在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源代码的一点点挖掘表明,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)

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



 类似资料:
  • 这是我在Python中的第一个项目,我刚刚学习了框架。测试模块运行良好,当我做,但当我想执行某个类或方法,如留档中所说,使用: 我得到以下错误: 我运行命令的目录包含(我还尝试将名称更改为),带有和方法都以开头,这里是我在终端上运行的命令: 我在任何地方都找不到类似的问题,知道错误背后的原因以及如何在模块或方法内部运行某个类将是非常好的

  • 问题内容: 我注意到我正在编写的Python脚本表现得很松散,并将其追溯到无限循环,其中循环条件为。在调试器中运行它,结果发现那条线实际上是。当我将其更改为!=’‘而不是时,它工作正常。 另外,即使比较或值,通常还是最好还是默认使用吗?我一直喜欢使用,因为我发现它在美学上更令人愉悦和pythonic(这就是我陷入这个陷阱的方式…),但是我想知道是否打算仅在你关心找到两个对象时才保留它?具有相同ID

  • 问题内容: 有没有一种简单的方法来测试Python字符串“ xxxxABCDyyyy”,以查看其中是否包含“ ABCD”? 问题答案: if “ABCD” in “xxxxABCDyyyy”: # whatever

  • 问题内容: 您如何让Jenkins执行python unittest案例?是否可以从内置包中输出JUnit样式的XML ? 问题答案: tests.py: [带有pytest的JUnit](http://pytest.org/latest/usage.html#creating-junitxml- format-files) 使用以下命令运行测试: results.xml: 带nose的JUnit

  • 问题内容: 我试图弄清楚如何将字符串中的字符与字符串中的下一个字符进行比较。例如,如果我有一个字符串: 我希望能够将第一个字符与第二个字符进行比较,如果第二个字符大于或等于第一个字符(按字母顺序,a e,y = y等),我想将1加到另一个变量(基本上是一个计数器)。如果不是,我想将计数器重置为0。基本上重复整个过程以获取字符串的长度。如果计数器变得大于maxlen变量,则将一个加到maxlen(或

  • 请给出您的想法如何单元测试这样的场景?我正在使用mockito进行单元测试。我是新的mockito和单元测试,请指导。提前道谢。