Asserts sind nützlich, um Sie über den internen Status des Programms zu informieren . Zum Beispiel, dass Ihre Datenstrukturen einen gültigen Status haben, zum Beispiel, dass eine Time
Datenstruktur nicht den Wert von enthält 25:61:61
. Die von Asserts überprüften Bedingungen sind:
Voraussetzungen, die sicherstellen, dass der Anrufer seinen Vertrag einhält,
Nachbedingungen, die sicherstellen, dass der Angerufene seinen Vertrag einhält, und
Invarianten, die sicherstellen, dass die Datenstruktur nach der Rückkehr der Funktion immer eine Eigenschaft enthält. Eine Invariante ist eine Bedingung, die eine Vorbedingung und eine Nachbedingung ist.
Unit-Tests sind nützlich, um Sie über das externe Verhalten des Moduls zu informieren . Sie Stack
kann einen konsistenten Zustand, nachdem die push()
Methode aufgerufen wird, aber wenn die Größe des Stapels nicht durch drei nicht erhöht , nachdem es dreimal aufgerufen wird, dann ist das ein Fehler ist. (Zum Beispiel der triviale Fall, dass die falsche push()
Implementierung nur die Asserts und Exits überprüft.)
Genau genommen besteht der Hauptunterschied zwischen Zusicherungen und Komponententests darin, dass Komponententests Testdaten enthalten (Werte, mit denen das Programm ausgeführt werden kann), während Zusicherungen dies nicht tun. Das heißt, Sie können Ihre Komponententests automatisch ausführen, während Sie dies für Behauptungen nicht sagen können. Für diese Diskussion habe ich angenommen, dass Sie über das Ausführen des Programms im Kontext von Funktionstests höherer Ordnung sprechen (die das gesamte Programm ausführen und keine Module wie Unit-Tests ansteuern). Wenn Sie nicht über automatisierte Funktionstests als Mittel sprechen, um "echte Eingaben zu sehen", dann liegt der Wert eindeutig in der Automatisierung, und somit würden die Komponententests gewinnen. Wenn Sie im Rahmen von (automatisierten) Funktionstests darüber sprechen, siehe unten.
Es kann zu Überschneidungen bei den getesteten Objekten kommen. Beispielsweise kann Stack
die Nachbedingung von tatsächlich behaupten, dass sich die Stapelgröße um eins erhöht. Was in dieser Behauptung ausgeführt werden kann, ist jedoch begrenzt: Soll auch überprüft werden, ob das oberste Element das ist, was gerade hinzugefügt wurde?
Ziel ist es für beide, die Qualität zu steigern. Bei Unit-Tests geht es darum, Fehler zu finden. Bei Assertions besteht das Ziel darin, das Debuggen zu vereinfachen, indem ungültige Programmzustände sofort nach ihrem Auftreten beobachtet werden.
Beachten Sie, dass keine der Techniken die Richtigkeit überprüft. In der Tat, wenn Sie Unit-Tests durchführen, um sicherzustellen, dass das Programm korrekt ist, werden Sie wahrscheinlich einen uninteressanten Test finden, von dem Sie wissen, dass er funktionieren wird. Es ist ein psychologischer Effekt: Sie werden alles tun, um Ihr Ziel zu erreichen. Wenn es Ihr Ziel ist, Fehler zu finden, werden Ihre Aktivitäten dies widerspiegeln.
Beide sind wichtig und haben ihre eigenen Zwecke.
[Als letzte Anmerkung zu Behauptungen: Um den größtmöglichen Nutzen zu erzielen, müssen Sie sie an allen kritischen Punkten in Ihrem Programm verwenden und nicht an einigen Schlüsselfunktionen. Andernfalls ist die ursprüngliche Ursache des Problems möglicherweise maskiert und ohne stundenlanges Debuggen schwer zu erkennen.]
:-)