Ich dachte, ich würde vier weitere Fälle hinzufügen, in denen Debug.Assert die richtige Wahl sein kann.
1) Was ich hier nicht erwähnt habe, ist die zusätzliche konzeptionelle Abdeckung, die Asserts während automatisierter Tests bieten können . Als einfaches Beispiel:
Wenn ein übergeordneter Anrufer von einem Autor geändert wird, der glaubt, den Umfang des Codes erweitert zu haben, um zusätzliche Szenarien zu behandeln, schreiben sie im Idealfall (!) Komponententests, um diese neue Bedingung abzudecken. Es kann dann sein, dass der vollständig integrierte Code gut zu funktionieren scheint.
Tatsächlich wurde jedoch ein subtiler Fehler eingeführt, der jedoch in den Testergebnissen nicht festgestellt wurde. Der Angerufene hat sich nicht deterministisch in diesem Fall und nur geschieht das erwartete Ergebnis zu liefern. Oder vielleicht hat es einen Rundungsfehler ergeben, der unbemerkt blieb. Oder verursachte einen Fehler, der an anderer Stelle gleichermaßen ausgeglichen wurde. Oder nicht nur den angeforderten Zugriff gewährt, sondern auch zusätzliche Berechtigungen, die nicht gewährt werden sollten. Etc.
Zu diesem Zeitpunkt können die im Angerufenen enthaltenen Debug.Assert () - Anweisungen in Verbindung mit dem neuen Fall (oder Randfall), der durch Komponententests ausgelöst wurde, während des Tests eine unschätzbare Benachrichtigung darüber liefern, dass die Annahmen des ursprünglichen Autors ungültig gemacht wurden, und der Code sollte dies nicht tun ohne zusätzliche Überprüfung veröffentlicht werden. Behauptungen mit Unit-Tests sind die perfekten Partner.
2) Darüber hinaus sind einige Tests einfach zu schreiben, jedoch teuer und angesichts der anfänglichen Annahmen unnötig . Beispielsweise:
Wenn auf ein Objekt nur von einem bestimmten gesicherten Einstiegspunkt aus zugegriffen werden kann, sollte von jeder Objektmethode eine zusätzliche Abfrage an eine Netzwerkrechtsdatenbank erfolgen, um sicherzustellen, dass der Anrufer über Berechtigungen verfügt? Sicher nicht. Möglicherweise umfasst die ideale Lösung das Zwischenspeichern oder eine andere Erweiterung von Funktionen, aber das Design erfordert dies nicht. Ein Debug.Assert () zeigt sofort an, wenn das Objekt an einen unsicheren Einstiegspunkt angehängt wurde.
3) In einigen Fällen verfügt Ihr Produkt möglicherweise nicht über eine hilfreiche diagnostische Interaktion für alle oder einen Teil seiner Vorgänge, wenn es im Release-Modus bereitgestellt wird . Beispielsweise:
Angenommen, es handelt sich um ein eingebettetes Echtzeitgerät. Das Auslösen von Ausnahmen und der Neustart, wenn ein fehlerhaftes Paket auftritt, ist kontraproduktiv. Stattdessen kann das Gerät von einem bestmöglichen Betrieb profitieren, bis es Rauschen in seiner Ausgabe erzeugt. Es verfügt möglicherweise auch nicht über eine Benutzeroberfläche, ein Protokollierungsgerät oder ist für Benutzer im Release-Modus überhaupt nicht physisch zugänglich. Die Erkennung von Fehlern erfolgt am besten durch die Bewertung derselben Ausgabe. In diesem Fall sind liberale Behauptungen und gründliche Tests vor der Veröffentlichung wertvoller als Ausnahmen.
4) Schließlich sind einige Tests nur deshalb nicht erforderlich, weil der Angerufene als äußerst zuverlässig wahrgenommen wird . In den meisten Fällen wurden je mehr wiederverwendbarer Code verwendet wird, desto mehr Anstrengungen unternommen, um ihn zuverlässig zu machen. Daher ist es üblich, Ausnahmen für unerwartete Parameter von Anrufern zu verwenden, aber für unerwartete Ergebnisse von Anrufern zu bestätigen. Beispielsweise:
Wenn eine Kernoperation String.Find
angibt, dass sie a zurückgibt, -1
wenn die Suchkriterien nicht gefunden werden, können Sie möglicherweise eine Operation sicher ausführen, anstatt drei. Wenn es jedoch tatsächlich zurückgegeben wird -2
, haben Sie möglicherweise keine vernünftige Vorgehensweise. Es wäre nicht hilfreich, die einfachere Berechnung durch eine zu ersetzen, die separat auf einen -1
Wert prüft und in den meisten Release-Umgebungen nicht zumutbar ist, um Ihren Code mit Tests zu verunreinigen, die sicherstellen, dass die Kernbibliotheken wie erwartet funktionieren. In diesem Fall sind Asserts ideal.