Wenn wir den Rot-, Grün- und Refaktor-Zyklus durchführen, sollten wir immer den Mindestcode schreiben, um den Test zu bestehen. So wurde mir TDD beigebracht und so beschreiben fast alle Bücher den Prozess.
Aber was ist mit der Protokollierung?
Ehrlich gesagt habe ich selten die Protokollierung in einer Anwendung verwendet, es sei denn, es geschah etwas wirklich Kompliziertes. Ich habe jedoch zahlreiche Posts gesehen, die über die Wichtigkeit einer ordnungsgemäßen Protokollierung sprechen.
Abgesehen von der Protokollierung einer Ausnahme konnte ich die tatsächliche Bedeutung der Protokollierung in einer ordnungsgemäß getesteten Anwendung (Einheiten- / Integrations- / Abnahmetests) nicht rechtfertigen.
Meine Fragen sind also:
- Müssen wir uns anmelden, wenn wir TDD machen? Wird ein nicht bestandener Test nicht aufdecken, was mit der Anwendung nicht stimmt?
- Sollten wir für jede Methode in jeder Klasse einen Test für den Protokollierungsprozess hinzufügen?
- Wenn zum Beispiel einige Protokollebenen in der Produktionsumgebung deaktiviert sind, führt dies dann nicht zu einer Abhängigkeit zwischen den Tests und der Umgebung?
- Die Leute reden darüber, wie Protokolle das Debuggen vereinfachen, aber einer der Hauptvorteile von TDD ist, dass ich immer weiß, was aufgrund eines fehlgeschlagenen Tests falsch ist.
Gibt es etwas, das ich dort verpasse?
Antworten:
Dies setzt voraus, dass Sie über alle möglichen Testmöglichkeiten für Ihre Anwendung verfügen, was selten zutrifft. Protokolle helfen Ihnen dabei, Fehler aufzuspüren, für die Sie noch keine Tests geschrieben haben.
Wenn der Logger selbst getestet wird, muss er nicht in jeder Klasse erneut getestet werden, ähnlich wie bei anderen Abhängigkeiten.
Menschen (und Protokollaggregatoren) sind von den Protokollen abhängig, die Tests sollten nicht von ihnen abhängen. In der Regel gibt es mehrere Protokollebenen, einige werden in der Produktion verwendet, und einige zusätzliche Ebenen werden in der Entwicklung verwendet, ähnlich wie:
"Rails Log Level ist Info im Produktionsmodus und Debugging in Entwicklung und Test" - http://guides.rubyonrails.org/debugging_rails_applications.html
Andere Anwendungen verwenden einen ähnlichen Ansatz.
Produktionsfehler haben alle Tests bestanden, daher benötigen Sie möglicherweise einen anderen Verweis, um diese Probleme zu untersuchen.
quelle
Die Protokollierung ist nützlich, um das nicht außergewöhnliche Verhalten einer Anwendung zu erklären :
Unabhängig davon, wie die Anwendung getestet wurde und wie gut Ausnahmen protokolliert werden, können die Benutzer Folgendes fragen:
Sie müssen protokollieren, um die Anwendungskonfiguration, Parameter und andere Laufzeitdetails zu überprüfen und das (nicht außergewöhnliche) Verhalten zu erläutern.
Aus der obigen Perspektive ist die Protokollierung eher auf die Unterstützung als auf die Entwicklung ausgerichtet. Nach dem Start der Anwendung ist es wünschenswert, andere Benutzer mit Fragen zu beauftragen, damit sich die Programmierer auf die weitere Entwicklung konzentrieren können.
Wenn Sie protokollieren, welche Anwendung ausgeführt wird, kann eine andere Person das Programmverhalten verstehen, ohne sich in den Code einzuarbeiten und die Entwickler durch Aufforderungen zur Erläuterung der Vorgänge abzulenken.
quelle
Die meisten Antworten konzentrieren sich hier auf den Aspekt der Korrektheit. Die Protokollierung dient jedoch auch einem anderen Zweck: Mit der Protokollierung können leistungsrelevante Daten erfasst werden. Selbst wenn das System fehlerfrei arbeitet, kann ein Protokoll erkennen, warum es langsam ist. Selbst bei vollständiger Testabdeckung aller Aspekte wird eine Testsuite dies nicht verraten.
Natürlich kann / sollte ein leistungskritisches System einige wichtige Leistungsmetriken für ein operatives Dashboard bereitstellen, aber die "klassische" Protokollierung kann einen anderen Detaillierungsgrad bieten.
quelle
Die kurze Antwort auf Ihre Hauptfrage lautet: In der Regel werden Fehler in Ihrem Code von TDD NICHT aufgedeckt. Einige mögen, idealerweise viele, aber das Fehlen fehlgeschlagener Tests impliziert nicht das Fehlen von Fehlern. Dies ist eine sehr wichtige Maxime beim Testen von Software.
Da Sie nicht wissen können, ob in Ihrem System ein fehlerhaftes Verhalten vorliegt, ist die Protokollierung unter Umständen unter seltenen Umständen ein nützliches Tool, mit dem Sie besser verstehen können, was falsch läuft, wenn unvermeidlich etwas schief geht.
Protokollierung und TDD gehen unterschiedliche Probleme an.
quelle
Wenn Sie nicht über eine 100% ige Testabdeckung verfügen, was normalerweise nicht der Fall ist, können Sie nicht wissen, dass Ihre Software niemals abstürzt (EDIT: und - wie in den Kommentaren erwähnt - auch wenn dies der Fall ist - kann dies zu Problemen führen, die von Ihrer Software unabhängig sind ein Unfall); Es ist das Gleiche wie zu denken, man könne eine Software machen, die absolut keine Fehler aufweist (nicht einmal die NASA kann dies). Zumindest müssen Sie also mögliche Fehler protokollieren, falls Ihr Programm abstürzt, damit Sie wissen, warum.
Die Protokollierung sollte je nach verwendeter Technologie durch eine externe Bibliothek oder ein internes Framework erfolgen. Damit meine ich, dass es etwas sein sollte, das bereits zuvor getestet wurde und dass Sie sich nicht selbst testen müssen. Es ist übertrieben zu testen, dass jede Methode die Dinge protokolliert, die sie haben soll.
Die Protokolle sind nicht für Tests gedacht, es sollte überhaupt keine Abhängigkeit geben. Das heißt, Sie müssen die Protokollierung für Tests nicht deaktivieren, wenn dies für Sie eine Einschränkung darstellt. Die Protokolle sollten jedoch in einer der Umgebung entsprechenden Datei gespeichert werden (für die Test-, Entwicklungs- und Produktionsumgebung sollte eine andere Datei vorhanden sein) zumindest).
Ein Fehler kann sehr unklar sein und es ist nicht immer offensichtlich, was schief gelaufen ist, wenn ein TDD-Test fehlgeschlagen ist. Protokolle sollten genauer sein. Wenn Sie beispielsweise einen Sortieralgorithmus ausführen und der gesamte Testfall fehlschlägt, sollten Sie für jeden einzelnen Test des Algorithmus Protokolle haben, mit denen Sie leichter erkennen können, wo das Problem tatsächlich liegt.
quelle
add(x, y) = 2
(liefert immer 2). Der folgende Test bestanden und bietet eine vollständige Abdeckung:assert(2 == add(1,1))
. 100% Testabdeckung für eine Buggy-Funktion :)Ja, im Allgemeinen müssen Sie protokollieren.
Bei der Protokollierung geht es nicht um das Debuggen. Okay, bei einem Teil der Protokollierung geht es manchmal um das Debuggen. Sie können diesen Teil überspringen, wenn Sie ihn während der Entwicklung nicht benötigen.
Der wichtigere Teil der Protokollierung ist jedoch die Wartbarkeit. Eine gut durchdachte Protokollierung könnte die folgenden Fragen beantworten:
All dies kann durch Protokollierung erreicht werden. Und ja, es sollte geplant und entworfen und getestet werden, vorzugsweise automatisch.
Die Protokollierung verdient genau wie andere Funktionen eine Behandlung.
quelle
TL; DR: Protokollierung und TDD sind orthogonal. Das eine zu haben hat keinen Einfluss darauf, das andere zu brauchen
Im Großen und Ganzen diente die Protokollierung, die ich implementiert habe und die ich implementiert gesehen habe, der Fehlerbehebung im Betrieb, nicht dem Debuggen in der Entwicklung (obwohl dies möglicherweise hilfreich ist). Die primäre Zielgruppe für diese Protokollierung sind die Administratoren und Administratoren, die Ihre Server betreiben, Mitarbeiter, denen Protokolle zur Analyse gesendet wurden, und Kunden, die sich die Protokolle ansehen und herausfinden möchten, was los ist.
Diese Protokolle helfen bei der Behebung von Problemen, die hauptsächlich bei Integrationspunkten auftreten. Dies kann Netzwerkdienste (Datenbank, Seife usw.), lokale Ressourcen (Festplatte, Speicher usw.), fehlerhafte Daten (Eingaben des Kunden, fehlerhafte / beschädigte Datenquellen usw.) usw. betreffen (Einstellungen, Konfigurationen usw.) können bei der Fehlerbehebung hilfreich sein.
Fügen Sie jederzeit Tests hinzu, um die Protokollierung zu testen. Wenn Sie Ad-hoc-Anrufe zum Abmelden von Informationen haben, sollten diese getestet werden. Wenn Sie die Protokollierung und das Testen von Protokollen mithilfe der aspektorientierten Programmierung oder der Metaprogrammierung implementieren, kann dies den Testaufwand verringern.
Wenn Sie Ihren Code mit IoC schreiben und Mocks verwenden, sollten Sie in der Lage sein, Ihre gesamte Protokollierung effektiv zu testen, ohne sich auf eine bestimmte Umgebungseinrichtung verlassen zu müssen.
quelle
TDD hilft im Allgemeinen dabei, Codierungsfehler zu reduzieren. Es hilft viel weniger bei Fehlern mit der Spezifikation oder nur Missverständnissen darüber, wie die Dinge funktionieren.
"Oh? Sie können eine Datennachricht erhalten, bevor Sie die Bestätigung erhalten, dass die Anmeldung erfolgreich war? Ich wusste das nie, nun, das wird nicht funktionieren!" ... So etwas. Die Protokollierung ist sehr nützlich, um Ihnen mitzuteilen, was die Software versucht hat, damit Sie feststellen können, was Sie falsch gemacht haben.
quelle
Meiner Erfahrung nach wird der Anwendung ein hohes Maß an Protokollierung hinzugefügt, wenn TDD nicht ausgeführt wird. Dann wird der Grad der Unsicherheit hoch und wir fügen die Protokollierung hinzu, um zu sehen, was los ist.
Wenn ich TDD mache (oder wenn ich es teste), füge ich viel weniger Log-Anweisungen hinzu. Dies bedeutet wiederum weniger LOC und kann (nicht immer) die Leistung beeinträchtigen.
In meinem Unternehmen fügen wir jedoch in den meisten Fällen, unabhängig von der Entwicklungsmethode, halbautomatisch Ein- und Ausstiegsprotokolle für Funktionen hinzu. Wie ich weiß, wurde dies für die Analyse von Produktionsproblemen als obligatorisch angesehen.
Beispiel könnten Methoden eines EJB-Service-Beans sein, die auf der öffentlichen Schnittstelle vorhanden sind. Ein anderer Fall könnte sein, wenn eine Funktion komplexe Berechnungen durchführt. Es kann sehr hilfreich sein, dass Zahlen in die Methode eingegeben werden (z. B. können Sie einen Komponententest schreiben, um zum allgemeinen Thema zurückzukehren).
quelle