Was ist eigentlich ein Unit Test? Und gibt es hier wirklich eine so große Zweiteilung?
Wir arbeiten in einem Bereich, in dem das Lesen eines Buchstabens nach dem Ende eines Puffers ein Programm zum Absturz bringen oder zu einem völlig ungenauen Ergebnis führen kann offen, ohne dass ein direkter Beweis für den Fehler erbracht wird.
Es ist unmöglich, die gesamte Komplexität dieser Systeme zu beseitigen. Unsere Aufgabe ist es jedoch, diese Komplexität so gering wie möglich zu halten und zu verwalten.
Ist ein Komponententest ein Test, der bestätigt, dass beispielsweise eine Reservierung erfolgreich in drei verschiedenen Systemen gebucht wurde, ein Protokolleintrag erstellt und eine E-Mail-Bestätigung gesendet wurde?
Ich werde nein sagen . Das ist ein Integrationstest . Und diese haben definitiv ihren Platz, aber sie sind auch ein anderes Thema.
Ein Integrationstest bestätigt die Gesamtfunktion eines gesamten "Merkmals". Der Code hinter dieser Funktion sollte jedoch in einfache, testbare Bausteine unterteilt werden, die auch als "Einheiten" bezeichnet werden.
Ein Komponententest sollte daher einen sehr begrenzten Umfang haben.
Dies bedeutet, dass der durch den Komponententest getestete Code einen sehr begrenzten Umfang haben sollte.
Dies bedeutet auch, dass eine der Säulen eines guten Designs darin besteht, Ihr komplexes Problem (soweit möglich) in kleinere Einzweckteile zu zerlegen, die relativ isoliert voneinander getestet werden können.
Am Ende steht ein System aus zuverlässigen Basiskomponenten, und Sie wissen, ob eine dieser grundlegenden Codeeinheiten kaputt geht, weil Sie einfache, kleine Tests mit begrenztem Umfang geschrieben haben, um genau das zu verdeutlichen.
In vielen Fällen sollten Sie wahrscheinlich auch mehrere Tests pro Einheit durchführen. Die Tests selbst sollten einfach sein und so weit wie möglich nur ein einziges Verhalten testen.
Die Vorstellung eines "Komponententests", bei dem nicht-triviale, ausgefeilte und komplexe Logik getestet wird, ist meiner Meinung nach ein Oxymoron.
Wenn es also zu einer solchen vorsätzlichen Zerlegung des Designs gekommen ist, wie in aller Welt könnte ein Unit-Test plötzlich zu Fehlalarmen führen, es sei denn, die Grundfunktion der getesteten Code-Unit hat sich geändert? Und wenn das passiert ist, sollten Sie besser glauben, dass es einige nicht offensichtliche Welleneffekte im Spiel gibt. Ihr fehlerhafter Test, der scheinbar ein falsches positives Ergebnis liefert, warnt Sie tatsächlich davor, dass durch eine Änderung ein größerer Kreis von Abhängigkeiten in der Codebasis aufgebrochen wurde. Er muss überprüft und behoben werden.
Einige dieser Einheiten (viele von ihnen) müssen möglicherweise mithilfe von Scheinobjekten getestet werden. Dies bedeutet jedoch nicht, dass Sie komplexere oder aufwändigere Tests schreiben müssen.
Zu meinem konstruiertes Beispiel eines Reservierungssystemes, kann man wirklich nicht sein Senden von Anforderungen aus , um eine Live - Reservierungsdatenbank oder Dritt-Service (oder sogar eine „dev“ Instanz davon) jedes Mal , wenn Sie geht zurück Einheit Test Code.
Sie verwenden also Mocks, die denselben Schnittstellenvertrag aufweisen. Die Tests können dann das Verhalten eines relativ kleinen, deterministischen Codeblocks validieren. Grün auf dem ganzen Brett sagt Ihnen dann, dass die Blöcke , aus denen sich Ihr Fundament zusammensetzt, nicht gebrochen sind.
Die Logik der einzelnen Unit-Tests selbst bleibt jedoch so einfach wie möglich.