如何在nose中设置self.maxDiff以获取完整的diff输出?

105 投票
7 回答
58678 浏览
提问于 2025-04-17 13:29

在使用nose 1.2.1和Python 3.3.0的时候,我有时会遇到类似下面的错误信息

======================================================================
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)

在很多情况下,为了弄清楚错误到底是什么,我需要看到完整的差异输出。不过,我不知道怎么设置这个 self.maxDiff。在网上搜索nose和maxDiff也没有找到有用的信息。而在Python 2.7.1上使用同样版本的nose时,完整的差异信息会直接显示在屏幕上。

下面是一个简单的脚本,当用 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)

7 个回答

38

在Python 2.7中,这样写是可以的:

    from unittest import TestCase
    TestCase.maxDiff = None

这段代码会为所有的TestCase实例设置一个默认的最大差异值,包括那些和assert_equals等函数关联的实例。

141

你把 maxDiff 设置成了 None

不过,要让这个设置生效,你实际上需要使用 unittest.TestCase 来进行测试。这样就可以正常工作了。

class MyTest(unittest.TestCase):

    maxDiff = None

    def test_diff(self):
          <your test here>
29

我在使用Python 3时也遇到了同样的问题(从这里的其他回答中了解到),而且使用im_class并没有解决问题。下面的代码片段在Python 3中可以正常工作(参考如何找到Python中绑定方法的实例?):

assert_equal.__self__.maxDiff = None

正如@Louis所评论的,方便函数实际上是Dummy实例上的绑定方法。它们似乎都在同一个实例上,所以如果你改变了比如assert_equal,那么assert_dict_equal等也会跟着改变。从Python文档来看,__self__在Python 2.6及以后的版本中都可以使用。

撰写回答