Antworten auf Ihre Fragen
Gibt es so etwas wie zu viele Unit-Tests?
Sicher ... Sie könnten zum Beispiel mehrere Tests durchführen, die auf den ersten Blick unterschiedlich zu sein scheinen, aber wirklich dasselbe testen (logischerweise von denselben Zeilen "interessanten" zu testenden Anwendungscodes abhängen).
Oder Sie könnten Interna Ihres Codes testen, die niemals nach außen auftauchen (dh nicht Teil eines Schnittstellenvertrags sind), und sich darüber streiten, ob das überhaupt Sinn macht. Zum Beispiel den genauen Wortlaut von internen Logmeldungen oder was auch immer.
Ich wurde beauftragt, Komponententests für eine vorhandene Anwendung zu schreiben. Nachdem ich meine erste Datei fertiggestellt habe, habe ich 717 Zeilen Testcode für 419 Zeilen Originalcode.
Das kommt mir ganz normal vor. Ihre Tests erfordern neben den eigentlichen Tests viele Codezeilen für das Einrichten und Herunterfahren. Das Verhältnis kann sich verbessern oder nicht. Ich selbst bin ziemlich testlastig und investiere oft mehr Zeit und Ort in die Tests als der eigentliche Code.
Wird dieses Verhältnis unüberschaubar, wenn wir die Codeabdeckung erhöhen?
Das Verhältnis berücksichtigt nicht so viel. Es gibt andere Eigenschaften von Tests, die dazu neigen, sie unhandlich zu machen. Wenn Sie regelmäßig eine ganze Reihe von Tests überarbeiten müssen, wenn Sie eher einfache Änderungen an Ihrem Code vornehmen, sollten Sie sich die Gründe genau ansehen. Und das ist nicht, wie viele Zeilen Sie haben, sondern wie Sie sich der Kodierung der Tests nähern.
Mein Verständnis von Unit-Tests bestand darin, jede Methode in der Klasse zu testen, um sicherzustellen, dass jede Methode wie erwartet funktioniert.
Dies gilt im engeren Sinne für "Unit" -Tests. Hier ist "Einheit" so etwas wie eine Methode oder eine Klasse. Der Zweck des "Unit" -Tests besteht darin, nur eine bestimmte Codeeinheit zu testen, nicht das gesamte System. Idealerweise würden Sie den gesamten Rest des Systems entfernen (unter Verwendung von Doubles oder so weiter).
Bei der Pull-Anfrage meinte mein technischer Leiter jedoch, dass ich mich auf Tests auf höherer Ebene konzentrieren sollte.
Dann sind Sie in die Falle gegangen, dass angenommen wurde, dass Menschen Unit-Tests meinten , als sie Unit-Tests sagten . Ich habe viele Programmierer getroffen, die "Unit Test" sagen, aber etwas ganz anderes meinen.
Er schlug vor, 4-5 Anwendungsfälle zu testen, die am häufigsten für die betreffende Klasse verwendet werden, anstatt jede Funktion ausführlich zu testen.
Sicher, nur die Konzentration auf die obersten 80% des wichtigen Codes reduziert auch die Last ... Ich schätze, dass Sie sehr von Ihrem Chef überzeugt sind, aber das scheint mir nicht die optimale Wahl zu sein.
Für mich ist eine 100% ige Testabdeckung ein hohes Ziel, aber selbst wenn wir nur 50% erreichen würden, würden wir wissen, dass 100% dieser 50% abgedeckt sind.
Ich weiß nicht, was "Unit Test Coverage" ist. Ich gehe davon aus, dass Sie "Codeabdeckung" meinen, dh, dass nach dem Ausführen der Testsuite jede Codezeile (= 100%) mindestens einmal ausgeführt wurde.
Dies ist eine nette Ballpark-Metrik, aber bei weitem nicht der beste Standard, nach dem man schießen kann. Nur die Ausführung von Codezeilen ist nicht das ganze Bild; Dies berücksichtigt beispielsweise keine unterschiedlichen Pfade durch komplizierte, verschachtelte Verzweigungen. Es handelt sich eher um eine Metrik, die mit dem Finger auf zu wenig getestete Codeteile zeigt (wenn eine Klasse eine Codeabdeckung von 10% oder 5% aufweist, stimmt etwas nicht). Auf der anderen Seite sagt eine 100% ige Abdeckung nicht aus, ob Sie genug getestet haben oder ob Sie richtig getestet haben.
Integrationstests
Es ärgert mich sehr, wenn heute ständig über Unit- Tests gesprochen wird. Meiner Meinung nach (und meiner Erfahrung nach) eignen sich Unit- Tests hervorragend für Bibliotheken / APIs. In eher geschäftsorientierten Bereichen (wo wir über Anwendungsfälle wie in der vorliegenden Frage sprechen) sind sie nicht unbedingt die beste Option.
Für den allgemeinen Anwendungscode und in einem durchschnittlichen Unternehmen (wo Geld verdienen, Termine einhalten und die Kundenzufriedenheit erfüllen wichtig ist und Sie hauptsächlich Fehler vermeiden möchten, die entweder direkt im Gesicht des Benutzers liegen oder zu echten Katastrophen führen können - das sind wir nicht Hier werden NASA-Raketen gestartet), Integrations- oder Funktionstests sind viel nützlicher.
Diese gehen Hand in Hand mit verhaltensgesteuerter Entwicklung oder funktionsgesteuerter Entwicklung. diese funktionieren per definitionem nicht mit (strengen) Komponententests.
Um es kurz zu machen, wird bei einem Integrations- / Funktionstest der gesamte Anwendungsstapel ausgeführt. In einer webbasierten Anwendung, es ist wie ein Browser klicken durch die Anwendung handeln würde (und nein, natürlich ist es nicht hat , dass simpel zu sein, gibt es sehr leistungsfähigen Frameworks gibt, das zu tun - check out http: // Gurke. io für ein Beispiel).
Oh, um Ihre letzten Fragen zu beantworten: Sie sorgen dafür, dass Ihr gesamtes Team eine hohe Testabdeckung hat, indem Sie sicherstellen, dass ein neues Feature erst programmiert wird, nachdem sein Feature-Test implementiert wurde und fehlgeschlagen ist. Und ja, das bedeutet alles . Dies garantiert Ihnen eine 100% ige (positive) Funktionsabdeckung. Per Definition garantiert es, dass eine Funktion Ihrer Anwendung niemals "verschwindet". Es wird keine 100% ige Codeabdeckung garantiert (wenn Sie beispielsweise negative Funktionen nicht aktiv programmieren, üben Sie Ihre Fehlerbehandlung / Ausnahmebehandlung nicht aus).
Es garantiert Ihnen keine fehlerfreie Anwendung. Natürlich möchten Sie Funktionstests für offensichtliche oder sehr gefährliche Buggysituationen, falsche Benutzereingaben, Hacking (z. B. Umgebungssitzungsverwaltung, Sicherheit usw.) schreiben. Aber selbst die Programmierung der positiven Tests hat einen enormen Vorteil und ist mit modernen, leistungsstarken Frameworks durchaus machbar.
Feature- / Integrationstests haben offensichtlich ihre eigenen Würmer (z. B. Leistung; redundantes Testen von Frameworks von Drittanbietern; da Sie in der Regel keine Doubles verwenden, ist es nach meiner Erfahrung auch schwieriger, sie zu schreiben ...), aber ich d Nehmen Sie eine Anwendung, die zu 100% auf positive Merkmale getestet wurde, über eine Anwendung, die zu 100% auf Code-Coverage-Einheiten getestet wurde (keine Bibliothek!), jeden Tag.