如何在鼻子中设置self.maxDiff以获取完整的差异输出?


78

在Python 3.3.0中使用鼻子1.2.1时,有时会收到类似于以下内容的错误消息

======================================================================
FAIL: maxdiff2.test_equal
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python3.3/site-packages/nose/case.py", line 198, in runTest
    self.test(*self.arg)
  File "/Users/loic/cmrsj/Calculus_II/scrap/maxdiff2.py", line 32, in test_equal
    assert_equal(str1, str2)
AssertionError: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a
diam lectus.\n [truncated]... != 'Suspendisse lectus leo, consectetur in tempor sit
amet, placerat quis neque.\nE [truncated]...
Diff is 1780 characters long. Set self.maxDiff to None to see it.

----------------------------------------------------------------------
Ran 1 test in 0.064s

FAILED (failures=1)

在许多情况下,要弄清楚错误的真正原因,我需要查看完整的diff输出。但是,我不知道该如何设置self.maxDiff。谷歌搜索鼻子和maxDiff没有帮助。在Python 2.7.1上使用相同版本的鼻子,完整差异显示在屏幕上。

这是一个简单的脚本,使用nosetests-3.3以下命令运行时会产生上述错误:

from nose.tools import assert_equal

def test_equal():
    str1 = """\
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus.
Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec
consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero
egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem
lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non tortor.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean ut gravida
lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor.
Pellentesque auctor nisi id magna consequat sagittis. Curabitur dapibus enim
sit amet elit pharetra tincidunt feugiat nisl imperdiet. Ut convallis libero in
urna ultrices accumsan. Donec sed odio eros. Donec viverra mi quis quam
pulvinar at malesuada arcu rhoncus. Cum sociis natoque penatibus et magnis dis
parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris
vitae nisi at sem facilisis semper ac in est."""

    str2 = """\
Suspendisse lectus leo, consectetur in tempor sit amet, placerat quis neque.
Etiam luctus porttitor lorem, sed suscipit est rutrum non. Curabitur lobortis
nisl a enim congue semper. Aenean commodo ultrices imperdiet. Vestibulum ut
justo vel sapien venenatis tincidunt. Phasellus eget dolor sit amet ipsum
dapibus condimentum vitae quis lectus. Aliquam ut massa in turpis dapibus
convallis. Praesent elit lacus, vestibulum at malesuada et, ornare et est. Ut
augue nunc, sodales ut euismod non, adipiscing vitae orci. Mauris ut placerat
justo. Mauris in ultricies enim. Quisque nec est eleifend nulla ultrices
egestas quis ut quam. Donec sollicitudin lectus a mauris pulvinar id aliquam
urna cursus. Cras quis ligula sem, vel elementum mi. Phasellus non ullamcorper
urna."""

    assert_equal(str1, str2)

Answers:


23

我在Python 3中有同样的问题(从这里阅读其他答案),使用im_class不起作用。下面的代码段在Python 3中有效(请参见如何在Python中找到绑定方法的实例?):

assert_equal.__self__.maxDiff = None

正如@Louis所说,便捷功能Dummy实例上的绑定方法。它们似乎都在同一实例上,因此assert_equal将其更改为例如将更改为其他assert_dict_equal。在Python文档中__self__可从Python 2.6及更高版本获得。


109

您设置maxDiffNone

但是您实际上必须使用aunittest.TestCase进行测试才能起作用。这应该工作。

class MyTest(unittest.TestCase):

    maxDiff = None

    def test_diff(self):
          <your test here>

4
我试过了,但并不能解决问题。其它变体还没有工作(将self.maxDiff = None__init__setUp莫非是鼻子和单元测试之间的不兼容?
。卢瓦克Seguin的-C

一些更多的细节:我在一个包裹测试功能unittest.TestCase类和我代替鼻子的assert_equalself.assertEqual。然后,maxDiff=None如果使用unittest运行测试,则类主体中的设置会给出正确的输出。但是,这在使用鼻子时仍然无法提供解决方案。这是鼻子上的虫子吗?
卢瓦克Seguin的-C。

@LoïcSéguin-C。很好。我建议您将邮件发送到邮件列表(我想他们有一封)并询问。
Lennart Regebro

1
对于正在阅读此主题的其他人,此答案对我有用。我看到作者使用的是nase.tools,而不是直接使用unittest,所以也许这就是为什么它对它们不起作用的原因。
keithhackbarth

1
感觉像是对我的更正确的答案,并且死定了。
Kees Briggs

29

这在python 2.7中有效:

    from unittest import TestCase
    TestCase.maxDiff = None

它将为所有TestCase实例设置默认的maxDiff,包括assert_equals和好友附加到的实例。


4
凉。如果您还想查看在diff之前的AssertionError中的完整字符串,则可以执行以下操作来增加最大长度:import unittest; unittest.util._MAX_LENGTH=1000
jdhildeb 2015年

4

在这里(谷歌告诉我的是):

# http://pdf2djvu.googlecode.com/hg/tests/common.py
try:
    from nose.tools import assert_multi_line_equal
except ImportError:
    assert_multi_line_equal = assert_equal
else:
    assert_multi_line_equal.im_class.maxDiff = None

这对于Python 3不起作用,因为已删除了未绑定方法,因此该im_class属性不存在。
卢瓦克Seguin的-C。

@Loïc您对Python 3的看法是正确的,但我认为它不适用于nose.tools。我正在看nose/tools/trivial.py鼻子1.3.0的文件,并且看到assert_*创建函数的方式是从虚拟类的实例中提取它们(从派生unittest.TestCase)。因此,它们并不是没有约束的。(从git log判断鼻子,至少已经两年了。)
路易(Louis

2

在python 2.7.3,鼻子1.3.0中,执行以下操作对我有用:

assert_equal.im_class.maxDiff = None
assert_equal(huge_thing, other_huge_thing)

0

对于使用基本unittest库的人。到达该maxDiff领域的方式几乎相同:

import unittest

class Test_Something(unittest.TestCase):  
    def test_first_test(self):
        huge_custom_object = CustomObject()
        expected_object = CustomObject(customVars)

        self.assertEqual.__self__.maxDiff = None
        self.assertEqual(huge_custom_object , expected_object )

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

-1

我最近遇到了这个问题....我强迫MS类型的行结尾..

MSstr="""hi\r
there\r"""
expected="""hi
there"""

self.assertEqual(MSsrt, expected) 

崩溃与其他人正在使用的可怕错误。

在PyCharm中,它说文件是相同的!

我删除了\ r-不再崩溃,并且测试现在通过。

希望这可以节省一个人花2个小时的时间。


这一解释为零。与OP的问题没有任何相似之处。我看到您有回车符,但是您没有解释为什么您会以这种方式使用它们,以及为什么期望它是相同的。同样,将其清除也会增加相同的结果。
MattSom
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.