2017-07-17 5 views
1

Sag mal, schreibe ich Unit-Tests für zwei wie weiter unten erklärt Funktionen:Wie können wir alle möglichen Kombinationen von Eingabeparametern validieren?

void target_func_1(int param1, int param2); 
void target_func_2(int param1, int param2, int param3, int param4, int param5, int param6); 

Für zwei oben genannten Funktionen werden alle Eingabeparameter erwartet entweder -1 oder positiv zu sein. < -1 & & param2> = -1 // gescheitert

  • param1> = -1 & & param2 sind im Folgenden aufgeführt

    • param1

      Alle möglichen Testfälle Eingabeparameter von target_func_1 für die Validierung < - 1 // fehlgeschlagen

    • param1 < -1 & & param2 < -1 // fehlgeschlagen
    • param1> = -1 & & param2> = -1 // gelang

    Das sieht einfach. Aber was ist mit target_func_2? Es kann eine extreme Anzahl möglicher Kombinationen von sechs Eingabeparametern geben. Muss ich all diese Testfälle für target_func_2 schreiben?

  • +0

    Es gibt sicher andere. Aber ich habe vor kurzem eine Präsentation über tdd gehalten, und mir wurde klar, dass ich hier kein Antwortabzeichen für den TDD-Tag habe. Also habe ich dieses Tag zu meiner Liste von Tags hinzugefügt; und ja, ich komme regelmäßig vorbei ;-) – GhostCat

    Antwort

    3

    Die einfache Antwort lautet: Sie schreiben keine Methode, die 6 Parameter benötigt.

    Mit anderen Worten: Wenn Sie sauberen Code lesen (zum Beispiel durch das ausgezeichnete Buch mit diesem Namen von Robert Martin studieren und anderen) Sie werden feststellen, dass eine so hohe Anzahl von Parametern absolut ist entmutigt.

    Und bitte verstehen: nicht nur, weil man so viele Permutationen Test - aber darüber hinaus: Diese Parameter sind wahrscheinlich alle in Ihrem Produktionscode verwendet.

    In diesem Sinne ist die wirkliche Antwort nicht, wie man solche Methoden vernünftig prüft. Es ist: Sie können solche Methoden nicht vernünftig testen; Sie können sie nicht vernünftig implementieren, also sollten Sie sie nicht schreiben.

    (Bitte beachten Sie: Dieses über Methoden, die Entscheidungen auf der Grundlage der Parameter vornehmen müssen, wenn Sie sagen, sie nur zum Beispiel drucken Sie es eine etwas andere Geschichte sein würde)

    Wie auf wie viele, Lassen Sie uns das oben genannte Buch zitieren:

    Die ideale Anzahl von Argumenten für eine Funktion ist Null (Niladic). Als nächstes kommt eins (monadisch), dicht gefolgt von zwei (dyadisch). Drei Argumente (triadisch) sollten nach Möglichkeit vermieden werden. Mehr als drei (polyadic) erfordern eine ganz spezielle Begründung - und sollten dann nicht verwendet werden.

    Und bitte beachten: Dies ist unabhängig der zugrunde liegenden Programmiersprache!

    Für ältere Code, empfehle ich eine zwei gefaltete Ansatz. Zuerst konzentrieren Sie sich auf den öffentlichen Vertrag dieser Methode. Bedeutung: Sie versuchen zu verstehen, "was reingeht" und "was ausgeht". Dann könnten Sie einige Überdeckungsmessungen durchführen und möglicherweise weitere Tests hinzufügen (zugeschnitten auf bestimmte Pfade innerhalb dieser Methode). Aber für den Rekord: Sie schreiben Tests, um Ihnen Refaktor solche Legacy-Code zu ermöglichen.

    Darüber hinaus: ein anderer Ansatz könnte in Tests auf der Idee QuickCheck Basis zu suchen sein. Bedeutung: Sie geben Eigenschaften Ihrer Methode an, und dann erstellt das Framework zufällige Parameter für Sie und versucht, Situationen zu finden, die zu Fehlern führen (in Bezug auf diese Eigenschaften).

    +0

    Dann kannst du mir bitte sagen, für C++, wie viele Parameter wären maximal für eine Funktion? Und was ist mit Legacy-Code? –

    +0

    Und ich fügte einen weiteren Absatz hinzu. Nicht sicher, ob Quickcheck dort das richtige Tool ist, aber das sollte definitiv eine C++ Implementierung dafür sein! – GhostCat

    Verwandte Themen