2009-11-29 13 views
26

Ich frage mich, wie geht es euch in CakePHP Unit-Test? Wie integrieren Sie Tests in Projekte? Welche Teile eines Projekts testen Sie? Wie entscheiden Sie, welche Teile einer Stückprüfung unterzogen werden? Kannst du den Job noch vor Ablauf der Frist erledigen?Komponententest in CakePHP?

Antwort

39

Ich frage mich, wie geht es euch Unit-Test in CakePHP? Wie integrieren Sie Tests in Projekte?

Ich verwende normalerweise die einfachste Konfiguration, die vom Cake Core verwendet wird. Ich habe eine Testdatei für jeden Controller und jedes Modell erstellt. Ich teste generell die Ausgabe von Helfern/Komponenten/Verhalten, wenn der Code komplexe Optionen hat oder der Helfer eine weitgehend variable Ausgabe hat. Ich finde, dass meine Abdeckung bei 65-75% liegt und dass bei einem so niedrigen Grad an Code-Abdeckung mit meinen Tests (65% einer begrenzten Teilmenge von Dateien ist ziemlich schwach) ich mehr Bugs durch Tests entdecke oder behebe, als ich gefunden habe und ohne richtig behoben.

Was Teile eines Projekts testen Sie? Wie entscheiden Sie, welche Teile Unit-getestet werden?

Ich teste immer alle Model Funktionen. Benutzerdefinierte Suchen, paginierte Ergebnismengen usw. Ich teste sie für Folgendes. Korrekte Anzahl von Ergebnissen (aus einer Suche auf Fixture-Daten), korrekte Resultsets (aus einer Suche nach Fixture-Daten), Korrektheit der zurückgegebenen Felder, Anzahl der zurückgegebenen Ergebnisse und ein korrektes Dataset für jeden benutzerdefinierten Suchtyp. Korrigiere die Paginierung, wenn ich paginierte Sets für benutzerdefinierte oder andere Funde verwende.

Ich teste immer Controller-Funktionen, die nicht dazu führen, dass eine Ansicht gerendert wird.Als Angewohnheit tendiere ich dazu, alle Logik, die nicht für Einstellungen Ansicht vars oder die Auswahl einer Ansicht zu privaten/geschützten Funktionen in der Steuerung zu rendern oder zu modellieren Funktionsaufrufe gewidmet bewegen. Damit kann ich die übrig gebliebenen Controller-Aktionen (solche mit View-Output) direkt testen. Wenn ich eine Ansicht überhaupt rendere, dann verhalten sich diese Funktionen wahrscheinlich gut mit allen Problemen mit , die gerendert wird, weiter oben der Aufruf-Stapel gerendert wird.

Ich testen Helfer für ihre Ausgabe mit bestimmten Optionen eingestellt. Ich behandle nicht immer alle Permutationen des Optionsarrays, aber wenn zwei verschiedene Schlüssel zu einem sich gegenseitig ausschließenden Verhalten führen, kann ich nach prädikierbaren Attributen suchen, die in meinem Markup enthalten sind - ich teste für diese Szenarien.

Wenn eine Komponente Daten von irgendwo nimmt und manipuliert, überprüfe ich das Format oder gebe Daten über die Komponentenfunktionen zurück. Gleiches für Verhaltensweisen.

Wenn ich irgendwo eine statische Klasse verwende, werde ich die Funktionen in dieser Klasse auf korrekte Ergebnisse überprüfen und einige erzwungene Fehler oder absichtliche Fehlerbedingungen erzeugen. Insbesondere, wenn ein Fehler zu einer Umleitung führt oder Daten in irgendeiner Form durch die Pipe gesendet werden. Wenn ein Fehler still ist oder einen Standardwert zurückgibt, überprüfe ich auch, ob dies tatsächlich geschieht.

Kommst du immer noch zu den Job vor Ablauf der Frist zu beenden?

Der erste Stichtag ist hier immer leicht "weich", um Tests und Probleme zu berücksichtigen. Ich finde, wenn man einen einfachen alten Bleistift und etwas Millimeterpapier oder ein Whiteboard benutzt, kann man leicht eine Reihe von Tests herausfinden, bevor man überhaupt einen Code schreibt. Mit diesem Ansatz können Sie ein Projekt 25% mehr Zeit im Voraus nehmen, aber über den gesamten Lebenszyklus der App werden Sie leicht sparen die 25%, die Sie im Voraus ausgegeben, indem Sie nicht so viele Probleme weiter unten in der Pipeline.


ich bearbeitet diese in einigen Links hinzufügen an für beide tatsächlichen Testtechniken zu suchen und als eine Möglichkeit, einen visuellen Eindruck davon zu bekommen, wie sie zusammenkommen.

  1. http://bakery.cakephp.org/articles/view/testing-models-with-cakephp-1-2-test-suite
  2. http://book.cakephp.org/view/160/Testing
  3. http://debuggable.com/posts/unit-testing-in-cakephp-part-1---introduction-to-unit-testing:48102610-c5d0-4398-a010-76974834cda3
  4. http://mark-story.com/nodes/view/testing-cakephp-controllers-the-hard-way

Auch muss ich mit den Kuchen Devs auf das Schreiben von Tests zustimmen und widersprechen. Es ist eine sehr gute Idee, alles zu testen, die Sie wiederverwenden wollen - sei es eine einzelne Komponente Datei oder ein komplexes Plugin - da Sie es verteilen werden und die Tests zeigen beide Arbeitscode und sind gute Beispiele dafür, was getan werden kann ein Stück Code.

Wie nicht Controller zu testen, weil Sie Mock-Objekte verwenden müssen - das ist nur eine schwache Ausrede, nicht ein wenig knifflige Arbeit zu tun, die Sie jedes Mal, wenn Sie es tun und es tun wirklich, wirklich reduziert die Fehlerrate und gibt Ihnen eine riesige Erhöhung in Ihrem eigenen Verständnis Ihres eigenen Codes.

+1

Vielen Dank für die tolle Antwort :) – user133127

+1

Ihre Begrüßung - ich hätte nicht erwartet, dass dieser Beitrag populär wird. –

4

Sie können einen Blick auf this werfen.

Ich bin nicht vertraut mit CakePHP, aber ich benutze im Allgemeinen PHPUnit. Ich benutze Netbeans, die PHPUnit ziemlich gut integrieren (ich weiß nicht, ob das eine Option für dich ist). Es ist möglich, Komponententests unabhängig davon auszuführen, welches Web-Framework Sie verwenden.

Ich teste generell alle Datenquellenverbindungen (die gesamte Datenzugriffsebene) und stelle sicher, dass die Persistenz wie erwartet funktioniert. Wenn Sie eine Geschäftslogik in Ihrer Anwendung haben, testen Sie sie auch , damit Sie wissen, dass es tatsächlich funktioniert. Ich habe keine lange Erfahrung im Testen, aber ich nehme an, dass andere vorschlagen würden, dass Sie Ihre Ansichten testen. Persönlich verwende ich F5 im Browser dafür, hehe :). Wenn es um AJAX-Funktionalität geht, teste ich jedes einzelne Bit davon (dass die Anfrage ihre Sache macht und/oder das gewünschte Ergebnis abruft).

In Bezug auf Zeit/Fristen ist die eine Sache, die sicher ist, dass Ihr Projekt vom Testen profitieren wird. Die Wahrscheinlichkeit, dass die Frist überschritten wird, ist viel größer, wenn Sie keine Form von Tests verwenden, um sicherzustellen, dass die Bausteine ​​Ihrer Anwendung so funktionieren, wie Sie es möchten. Angenommen, Ihre Anwendung wird größer (was in den meisten Fällen der Fall ist), Sie haben keine Komponententests und Ihre Anwendung schlägt fehl. Woher weißt du, wo zu debuggen ist, und wie viel mehr Zeit würdest du verwenden, um nach dem Problem zu suchen? Die wichtigste Sache zu verstehen ist, dass es sehr wichtig ist sicherzustellen, dass kleine Code-Teile funktionieren, wenn man viele dieser kleinen Teile bekommt.

Der Zeitaufwand für das Schreiben von Tests mag unproduktiv erscheinen, da es nicht direkt zur Funktionalität führt, aber es spielt im Laufe der Zeit eine sehr wichtige Rolle. Betrachten Sie es als eine Form der Versicherung.