2015-05-08 10 views
5

Ich schreibe einige Python Unit Tests mit dem "unittest" Framework und führe sie in PyCharm aus. Einige der Tests vergleichen eine lange generierte Zeichenfolge mit einem Referenzwert, der aus einer Datei gelesen wird. Wenn dieser Vergleich fehlschlägt, möchte ich das Diff der beiden verglichenen Strings mit PyCharms diff viewer sehen.PyCharm zeigt vollen Unterschied, wenn Unittest für mehrzeilige Zeichenfolge fehlschlägt?

So ist der der Code wie folgt aus:

actual = open("actual.csv").read() 
    expected = pkg_resources.resource_string('my_package', 'expected.csv').decode('utf8') 
    self.assertMultiLineEqual(actual, expected) 

Und PyCharm identifiziert schön den Test als gescheitert und stellt einen Link im Fenster Ergebnisse klicken, die den Diff-Viewer öffnet. Jedoch darauf zurückzuführen, wie Unittest die Ergebnisse verkürzt, ich Ergebnisse zu erzielen, wie dies in dem Diff-Viewer:

Linke Seite:

‚time [57 Zeichen] ercent 0; 1; 1; 1; 1; 1; 1; 1 0; 2; 1; 3; 4; 2; 3; 1 0; 3; [110 Zeichen] 32 '

Rechte Seite:

' time [57 Zeichen] ercen 0; 1; 1; 1; 1; 1; 1; 1 0; 2; 1; 3; 4; 2; 3; 1 0; 3; 2 [109 Zeichen] 32 '

Jetzt möchte ich alle [X Zeichen] Teile loswerden und nur die ganze Datei (en) und das tatsächliche Diff sehen, vollständig visualisiert von PyCharm.

Ich habe versucht, in Unittest-Code zu suchen, konnte jedoch keine Konfigurationsoption zum Drucken voller Ergebnisse finden. Es gibt einige Variablen wie maxDiff und _diffThreshold, aber sie haben keinen Einfluss auf diesen Ausdruck.

Auch habe ich versucht, dies in py.test auszuführen, aber dort war die Unterstützung in PyCharm noch weniger (keine Links sogar zu fehlgeschlagenen Test).

Gibt es einen Trick mit dem Difflib mit Unittest oder vielleicht ein paar andere Tricks mit einem anderen Python-Test-Framework, um dies zu tun?

+0

Dies ist nicht auf PyCharm bezogen, noch py.test.Die gleichen Dinge passieren, wenn Python3.4-Unittests von der Kommandozeile aus ausgeführt werden, mit dem einfachen alten "python -m unittest" –

+0

. Weder ist es mit assertMultiLineEqual verwandt - ich sehe das gleiche Verhalten für plain alten assertEqual. –

+0

Die abgekürzten (fehlenden) Teile jedes Strings sind nicht garantiert in beiden Strings gleich (wenn dies der Fall wäre, wäre dieses Verhalten meist gutartig). Aber das oben in der Frage gezeigte Beispiel zeigt, dass die erste Zeichenfolge [110 Zeichen] weggelassen wurde, wobei die zweite Zeichenfolge [109 Zeichen] weggelassen wurde. Daher können die ausgelassenen Strings möglicherweise nicht gleich sein. Warum abkürzen, wenn der fehlende Teil einen Teil des Diffs enthält !? –

Antwort

3

Nun, ich habe es geschafft, mich für meine Testzwecke darum zu kümmern. Anstatt die assertEqual-Methode von unittest zu verwenden, habe ich meine eigene geschrieben und verwende sie innerhalb der Unittest-Testfälle. Bei Fehlschlag gibt es mir die Volltexte und der PyCharm-Diff-Viewer zeigt auch den vollen Diff korrekt an.

Meine assert-Anweisung ist in einem Modul der eigenen (t_assert.py) und sieht wie folgt aus

def equal(expected, actual): 
    msg = "'"+actual+"' != '"+expected+"'" 
    assert expected == actual, msg 

In meinem Test Ich nenne es dann so

def test_example(self): 
     actual = open("actual.csv").read() 
     expected = pkg_resources.resource_string('my_package', 'expected.csv').decode('utf8') 
     t_assert.equal(expected, actual) 
     #self.assertEqual(expected, actual) 

scheint zu funktionieren so weit ..

3

Die TestCase.maxDiff=None Antworten, die an vielen Stellen gegeben werden, stellen nur sicher, dass der Unterschied, der im unittest Ausgang gezeigt wird, von der vollen Länge ist. Um auch den vollen Unterschied in der < zu erhalten, klicken Sie hier, um zu sehen, Unterschied > Link müssen Sie MAX_LENGTH setzen.

import unittest 

# Show full diff in unittest 
unittest.util._MAX_LENGTH=2000 

Quelle: https://stackoverflow.com/a/23617918/1878199

+0

Funktioniert auch, wenn Sie es in die 'def setUp (self):' wenn Sie keinen Code außerhalb Ihrer Testklasse wollen. – luckydonald

Verwandte Themen