web-dev-qa-db-ja.com

完全なdiff出力を得るために、鼻にself.maxDiffを設定する方法は?

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)

多くの場合、エラーが実際に何であるかを把握するには、完全なdiff出力を確認する必要があります。ただし、self.maxDiffを設定する方法がわかりません。鼻とmaxDiffのグーグルは役に立ちません。同じバージョンのnose on 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)
57

私は同じ問題をPython 3(他の回答をここから読んで))とim_class 動作しませんでした。以下のスニペットはPython 3で動作します(cf. Pythonでバインドされたメソッドのインスタンスを見つける方法? ):

assert_equal.__self__.maxDiff = None

@Louisがコメントしたように、便利な関数Dummyインスタンスのメソッドにバインドされています。それらはすべて同じインスタンス上にあるように見えるので、たとえばassert_equalassert_dict_equalなど。 Pythonドキュメント__self__はPython 2.6以降で利用可能です。

20
vicvicvic

maxDiffNoneに設定します。

ただし、実際には unittest.TestCase 動作するためのテストのため。これは動作するはずです。

class MyTest(unittest.TestCase):

    maxDiff = None

    def test_diff(self):
          <your test here>
82
Lennart Regebro

これはpython 2.7で動作します:

    from unittest import TestCase
    TestCase.maxDiff = None

Assert_equalsやfriendsがアタッチされているものを含む、すべてのTestCaseインスタンスにデフォルトのmaxDiffを設定します。

26

ここにそれがあります(グーグルが私に言ったこと):

# 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
4
Memke

python 2.7.3、nose 1.3.0では、次のことを行うことは私のために働いています:

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