Nehmen wir an, ich möchte testen, ob eine Funktion zwei Zahlen zurückgibt und die erste kleiner ist als die zweite:
def test_length():
result = my_function()
assert len(result) == 2
def test_order()
a, b = my_function()
assert a < b
Wenn dies test_length
fehlschlägt, test_order
wird dies auch fehlschlagen. Ist es eine bewährte Methode, zu schreiben test_length
oder zu überspringen?
BEARBEITEN: Beachten Sie, dass in dieser Situation beide Tests größtenteils unabhängig voneinander sind, jeder einzeln ausgeführt werden kann oder in umgekehrter Reihenfolge ausgeführt werden kann, dies spielt keine Rolle. Also keine dieser früheren Fragen
- Wie soll ich die Funktionalität einer Funktion testen, die andere Funktionen verwendet?
- Benötige ich einen Komponententest, wenn ich bereits einen Integrationstest habe?
- Wie strukturiere ich Tests, bei denen ein Test der Aufbau eines anderen Tests ist?
- So verwalten Sie die Erfolgsabhängigkeit zwischen Komponententests
ist ein Duplikat des obigen.
unit-testing
Mihai
quelle
quelle
A
AufrufeB
und das gleiche Ergebnis zurückgeben, sollten Sie beideA
und testenB
". Hier geht es eher um die Überlappung der Tests als um die zu testenden Funktionen. (Obwohl es verwirrend ist, wie sie derzeit benannt sind).lambda: type('', (), {'__len__': lambda self: 2})()
übergibt die erste, aber nicht die zweite.Antworten:
Es kann einen Wert geben, aber das ist ein bisschen ein Geruch. Entweder sind Ihre Tests nicht gut isoliert (da
test_order
wirklich zwei Dinge getestet werden) oder Sie sind zu dogmatisch in Ihren Tests (zwei Tests testen das gleiche logische Ding).Im Beispiel würde ich die beiden Tests zusammenführen. Ja, es bedeutet, dass Sie mehrere Asserts haben. Schade. Sie testen immer noch eine einzige Sache - das Ergebnis der Funktion. In der realen Welt bedeutet das manchmal, zwei Prüfungen durchzuführen.
quelle
my_function
schlägt der zweite Test ebenfalls fehl, wenn nicht genau zwei Werte ohne Assert zurückgegeben werden - da die Zuweisung zu einer Ausnahme führt. Es ist also nicht erforderlich, mehrere Asserts und zwei Prüfungen zu verwenden, um dasselbe zu testen.Ihre Tests sollten explizit sein. Es lässt sich nicht vollständig ableiten, dass test_order fehlschlägt, wenn text_length fehlschlägt.
Ich bin mir nicht sicher, wie es in Python
len(result)
läuft, das du gepostet hast, aber wenn 3 ist, wird das erste scheitern, aber das zweite wird vergehen (und wenn nicht in Python, dann sicher in Sprachen wie JavaScript).Wie Sie bereits sagten, möchten Sie testen, ob die Funktion zwei Zahlen zurückgibt und ob diese in Ordnung sind. Es sind zwei Tests.
quelle
It's not completely inferred that if text_length fails test_order fails
- In Python gibt es eine Ausnahme.test_length
implizierttest_order
. Die Tatsache, dass sich ein ähnliches Testpaar, das in Javascript geschrieben wurde, nicht so verhält wie diese beiden Python-Tests, ist irrelevant.Der einzige Wert von
test_length
hier ist, dass, wenn alles bestanden ist, das Vorhandensein anzeigt, dass "Länge" getestet wurde.Es ist also wirklich unnötig, beide Tests durchzuführen. Nur beibehalten,
test_order
aber eventuell umbenennentest_length_and_order
.Übrigens finde ich die Verwendung von Namen, die
test
etwas ungeschickt beginnen. Ich bin ein starker Verfechter von Testnamen, die den von Ihnen behaupteten Zustand beschreiben.quelle
test
Warze ist für Pythons Test-Framework von Bedeutung. Was sich natürlich nicht ändern muss, ob Sie ein Fan davon sind, aber es ändert sich das Gewicht der Argumente, die erforderlich sind, um jemanden davon abzuhalten, es zu benutzen ;-)test_that_
, wietest_that_return_values_are_in_order
und so weiter zu beginnen. Vielleicht wird eine zukünftige Version des Test-Frameworks diese Anforderung irgendwie umgehen.Ich würde diese Tests getrennt lassen, wenn sie sich so entwickelt haben. Ja
test_order
wird wahrscheinlich immer scheiterntest_length
, aber Sie wissen definitiv warum.Ich würde auch zustimmen, dass, wenn das
test_order
zuerst erschien und Sie einen testbaren Fehler fanden, das Ergebnis möglicherweise nicht zwei Werte waren, diese Prüfung als hinzufügenassert
und den Test umbenennen, umtest_length_and_order
Sinn zu machen.Wenn Sie auch überprüfen müssten, ob es sich bei den zurückgegebenen Werten um Ganzzahlen handelt, würde ich dies in diesen "Omnibus" -Ergebnis-Test einbeziehen.
Beachten Sie jedoch, dass Sie jetzt eine Reihe von Tests für das Ergebnis von haben
my_function()
. Wenn mehrere Kontexte (oder wahrscheinlicher mehrere Parameter) zu testen sind, kann dies jetzt eine Unterroutine sein, mit der alle Ergebnisse getestet werden könnenmy_function()
.Wenn ich Unit-Tests schreibe, teste ich normalerweise die Edge- und Bad-Cases getrennt von der guten Eingabe und der normalen Ausgabe (teilweise, weil die meisten meiner "Unit" -Tests häufig Mini-Integrationstests sind) und häufig mit mehreren Asserts, die nur fehlerhaft sind in separate Tests, wenn sie in einer Weise fehlschlagen, in der ich finde, dass ich mehr Informationen möchte, ohne Fehler zu beheben.
Also habe ich wahrscheinlich mit Ihrem separaten Tests und erweitern beginnen würde
test_length
zutest_length_and_types
und verlassen zutest_order
trennen, wird die letztere Annahme gesehen „normale Verarbeitung“ zu sein.quelle