Wie setze ich self.maxDiff in die Nase, um die volle Diff-Ausgabe zu erhalten?

76

Bei Verwendung von Nase 1.2.1 mit Python 3.3.0 wird manchmal eine Fehlermeldung angezeigt, die der folgenden ähnelt

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

In vielen Situationen muss ich die vollständige Diff-Ausgabe sehen, um herauszufinden, was der Fehler wirklich ist. Ich habe jedoch keine Ahnung, wie ich das einstellen soll self.maxDiff. Googeln für Nase und maxDiff hilft nicht. Mit der gleichen Version von Nase unter Python 2.7.1 wird das gesamte Diff auf dem Bildschirm gedruckt.

Hier ist ein einfaches Skript, das den obigen Fehler generiert, wenn es ausgeführt wird mit 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)
Loïc Séguin-C.
quelle

Antworten:

23

Ich hatte das gleiche Problem in Python 3 (nachdem ich die anderen Antworten hier gelesen hatte) und die Verwendung im_classfunktionierte nicht. Das folgende Snippet funktioniert in Python 3 (vgl. Wie finde ich eine Instanz einer gebundenen Methode in Python? ):

assert_equal.__self__.maxDiff = None

Wie @Louis kommentierte die Komfortfunktionen sind gebundene Methoden auf einer DummyInstanz. Sie scheinen sich alle auf derselben Instanz zu befinden. Wenn Sie dies beispielsweise assert_equaländern , ändert sich dies beispielsweise für assert_dict_equalusw. Aus der Python - Dokumentation , __self__ist von Python verfügbar 2.6 und nach vorn.

vicvicvic
quelle
106

Sie setzen maxDiffauf None.

Aber Sie müssen tatsächlich ein unittest.TestCasefür Ihre Tests verwenden, damit dies funktioniert. Das sollte funktionieren.

class MyTest(unittest.TestCase):

    maxDiff = None

    def test_diff(self):
          <your test here>
Lennart Regebro
quelle
4
Ich habe das versucht und es löst das Problem nicht. Weitere Varianten tun auch nicht Arbeit (Putting self.maxDiff = Nonein __init__oder in setUpKönnte das eine Inkompatibilität zwischen Nase und Unittest.?
. Loïc Séguin-C
Einige weitere Details: Ich wickelte die Testfunktion in einer unittest.TestCaseKlasse und ich ersetzt Nase assert_equalmit self.assertEqual. Die Einstellung maxDiff=Noneim Klassenkörper liefert dann die richtige Ausgabe, wenn der Test mit unittest ausgeführt wird. Dies bietet jedoch immer noch keine Lösung bei der Verwendung der Nase. Ist das ein Bug in der Nase?
Loïc Séguin-C.
@ LoïcSéguin-C. Könnte sehr gut sein. Ich würde vorschlagen, dass Sie eine Mail an die Mailingliste senden (ich nehme an, sie haben eine) und fragen.
Lennart Regebro
1
Für alle anderen, die diesen Thread lesen, hat diese Antwort für mich funktioniert. Ich sehe, dass der Autor nase.tools anstelle von unittest direkt verwendet. Vielleicht hat es deshalb bei ihnen nicht funktioniert.
Keithhackbarth
1
Das fühlt sich für mich wie die richtigere Antwort an und war tot auf.
Kees Briggs
28

Dies funktioniert in Python 2.7:

    from unittest import TestCase
    TestCase.maxDiff = None

Es wird der Standardwert für maxDiff für alle TestCase-Instanzen festgelegt, einschließlich derjenigen, an die assert_equals und Freunde angehängt sind.

Dobes Vandermeer
quelle
4
Cool. Wenn Sie auch die vollständigen Zeichenfolgen im AssertionError sehen möchten, der dem Diff vorausgeht, können Sie die maximale Länge erhöhen, indem Sie import unittest; unittest.util._MAX_LENGTH=1000
Folgendes
4

Hier haben Sie es (was Google mir gesagt hat):

# 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
Memke
quelle
Dies funktioniert nicht für Python 3, da ungebundene Methoden entfernt wurden und das im_classAttribut nicht vorhanden ist.
Loïc Séguin-C.
@ Loïc Was Sie über Python 3 sagen, ist richtig, aber ich glaube, es gilt nicht für nose.tools. Ich schaue auf die nose/tools/trivial.pyDatei von Nase 1.3.0 und sehe, dass die assert_*Funktionen so erstellt werden, dass sie aus einer Instanz einer Dummy-Klasse extrahiert werden (abgeleitet von unittest.TestCase). Sie sind also nicht ungebunden. (Nach dem Git Log für die Nase zu urteilen, ist es seit mindestens zwei Jahren so.)
Louis
2

In Python 2.7.3, Nase 1.3.0 funktioniert Folgendes für mich:

assert_equal.im_class.maxDiff = None
assert_equal(huge_thing, other_huge_thing)
Quodlibetor
quelle
0

Ich bin kürzlich auf dieses Problem gestoßen ... Ich habe ein Zeilenende vom Typ MS erzwungen ...

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

self.assertEqual(MSsrt, expected) 

Das stürzte mit den schrecklichen Fehlern ab, die andere verwenden.

In PyCharm hieß es, die Dateien seien identisch !!

Ich habe das \ r entfernt - kein Absturz mehr und Tests bestehen jetzt.

Hoffe das spart jemandem die 2 Stunden die es mich gekostet hat.

Tim Seed
quelle