Seite 1 von 1

Vergleich/ Diff zwischen zwei Textfiles in einem Unittest

Verfasst: Dienstag 27. November 2018, 11:22
von frentmeister
Hallo,

für einen Unittest muss ich 2 Textfiles vergleichen, am Ende des Test. Es handelt sich dabei um die Ausgabe einer Sysinfo.

Sobald es also einen Unterschied gibt zwischen File a und b soll eine Assertion entsprechend ein Fail schreiben für den Unittest.

Beispiel für einen Vergleich im File:

MAC-ADDRESS: 00A05736D0E3
VERSION: 3.32.0026 / 14.11.2018

Ich nutzte Python 3.7 und diverse Pakete:

Paramiko
Pyserial
Tftpy

Wie würdet ihr dies Umsetzen?

Ich habe mir schon einige Beispiele angeschaut, aber meiner Ansicht nach zu Komplex dafür.

Siehe hier:

https://stackoverflow.com/questions/323 ... m-txt-file
https://stackoverflow.com/questions/342 ... ifferences

Re: Vergleich/ Diff zwischen zwei Textfiles in einem Unittest

Verfasst: Dienstag 27. November 2018, 12:06
von __blackjack__
@frentmeister: Mir ist nicht so ganz klar was für Dich Unterschiede sind. Wenn die wirklich exakt gleich sein müssen, dann lies sie einfach ein und vergleiche sie mit ``==`` oder ``!=``. Ansonsten wird es halt etwas komplizierter und Du müsstest mehr ins Detail gehen.

Wenn Du dem Benutzer einen schöneren „diff“ zeigen möchtest, statt einfach nur ein “failed”, dann schau Dir mal `difflib` aus der Standardbibliothek an. Oder ob py.test schon automatisch was schöneres macht. :-)

Re: Vergleich/ Diff zwischen zwei Textfiles in einem Unittest

Verfasst: Dienstag 27. November 2018, 12:47
von MagBen
frentmeister hat geschrieben: Dienstag 27. November 2018, 11:22Wie würdet ihr dies Umsetzen?
Für den Anfang:

Code: Alles auswählen

assert open(filenameA).read() == open(filenameB).read(), "'%s'!='%s'" % (filenameA, filenameB)

Re: Vergleich/ Diff zwischen zwei Textfiles in einem Unittest

Verfasst: Dienstag 27. November 2018, 14:32
von frentmeister
Hallo und vielen Dank, dass hat mir geholfen!

Re: Vergleich/ Diff zwischen zwei Textfiles in einem Unittest

Verfasst: Montag 2. März 2020, 00:40
von __blackjack__
Das ganze mal auf Python 3.6+ angepasst:

Code: Alles auswählen

from pathlib import Path


def test_something():
    ...
    assert (
        Path(filename_a).read_bytes() == Path(filename_b).read_bytes()
    ), f"{filename_a!r} != {filename_b!r}"
Bei `pytest` würde ich die Zeichenkette weglassen denn das liefert in diesem Fall ja schon selbst detailliertere Ausgaben zu den beteiligten Werten wenn so ein Test fehl schlägt