Wie zitiere ich einen Job bei PHPUnit?

9

Ich mache seit 15 Jahren Website-Programmierung und seit ungefähr 5 Jahren PHP. Ich habe immer soliden Code geschrieben. Ich habe jedoch einen Kunden, der darauf besteht, dass 80% des Codes Unit-getestet werden. Da der Client IMMER RECHT ist, plane ich, PHP_CodeSniffer zu verwenden, um sicherzustellen, dass mein Code richtig aussieht, und PHPUnit, um meine Unit-Tests durchzuführen. Ich hoffe, durch diese Erfahrung etwas zu lernen.

Sind dies die richtigen Werkzeuge? Wie viel Zeit ist für das Einrichten von PHPUnit und das Schreiben des zusätzlichen Codes erforderlich? Ich sollte ungefähr 8 Wochen brauchen, um die Webseiten zu schreiben und mich selbst zu testen, wie ich es in der Vergangenheit getan habe. Wenn ich 4 Tage zusätzlich (10%) für Unit-Tests (PHPUnit) hinzufüge, ist das genug? Gedanken? Vorschläge? Vielen Dank.

Gemeinschaft
quelle
2
Unit-Tests können die Entwicklungszeit verdoppeln.
Sie haben mit PHP 2.0 gearbeitet? Nett! Meine Eingabe qualifiziert sich nicht für eine Antwort, kurz gesagt: Bei der Auswahl der Tools sind Sie imho genau richtig. Siehe meine Sicht auf PHP-Test-Frameworks und für PHPCs kenne ich nicht einmal eine Alternative. Für die Zeit zum Hinzufügen: Nachdem ich TDD für einige Zeit gemacht habe, bin ich normalerweise langsamer ohne es, aber als ich anfing, bestimmte Dinge zu lange zu warten (+ 50%). Wenn Sie ein Framework verwenden, das das Testen erschwert (viele statische Elemente), fügen Sie noch mehr hinzu.
edorian
1
Dies erhöht die anfängliche Vorabentwicklung, aber in einem 8-wöchigen Projekt werden Sie feststellen, dass es weniger Unterschied macht, da die Komponententests Ihnen helfen, Fehler früher und einfacher zu entdecken.
Fenton
1
@Dragon, irgendwie, aber Unit-Tests beschleunigen auch die Entwicklung [es gibt viel weniger Bereitstellungs- / Test- /
Such-

Antworten:

7

In einer Zeile: Es kommt darauf an, wie Sie arbeiten. Ich denke ehrlich, dass 10% viel zu wenig sind. Sie sollte mindestens 25% betragen, wenn nicht 40%, wenn nicht 60%, wenn nicht mehr.

Erstens stimme ich Ihrem Kunden dort sehr zu. Unit-Tests sind ein wesentlicher Bestandteil eines robusten, leicht zu wartenden und leicht zu debuggenden Produkts.

Ich werde von dem sprechen, was ich weiß. Ich verwende TDD (Test-Driven Development) für die meisten Projekte. Mit TDD schreiben Sie die Tests grundsätzlich vor dem eigentlichen Code. Sie legen eine Reihe von Akzeptanzkriterien fest, die das Endprodukt erfüllen muss. Normalerweise verbringen Sie 50% bis 70% Ihrer Zeit damit, Tests zu schreiben, und den Rest, um Code zu implementieren, damit sie bestehen.

Es mag absurd und / oder enorm klingen, aber ich kann Ihnen versichern, dass dies nicht der Fall ist. Hier ist der Grund:

  • Sie können herausfinden, welche Architekturmuster beim Schreiben der Tests am besten geeignet sind. Auf diese Weise ändert sich die Anwendungsarchitektur beim Starten der Codierung nur minimal (da wir alle wissen, wie teuer es ist, eine Anwendungsarchitektur zu wiederholen).
  • Sie codieren nur, um die Tests zu bestehen (wodurch das Endprodukt akzeptabel wird). Sie werden keine Zeit damit verbringen, nutzlose Funktionen außerhalb des Anwendungsbereichs zu programmieren.
  • Durch weniger Code (dh nur Code, den Sie tatsächlich benötigen) ist dieser weniger fehleranfällig. (Weniger Code = weniger Fehler).
  • Wenn Sie einen Fehler machen, und Sie werden es tun, wird es viel weniger Zeit brauchen, um herauszufinden, warum es ein Problem gibt und wo das Problem liegt. Wenn die Tests richtig geschrieben sind, bedeutet dies, dass ein einzelner Fehler einen einzelnen Fehler und keine Kettenreaktion verursacht. Auf diese Weise können Sie die Ursache des Problems in wenigen Minuten, wenn nicht in Sekunden, leicht lokalisieren.
  • Die Implementierung des eigentlichen Codes mit Unit-Tests dauert viel weniger lange. Sobald ein Test fehlschlägt, wissen Sie, dass etwas nicht stimmt. Sie müssen nicht mit dem Client hin und her gehen, um Fehler zu beheben.
  • Sie müssen eventuell mit dem Client hin und her gehen, um Fehler zu beheben, da nichts 100% der Fehler abfangen kann. Sie können jedoch leicht 95% fangen, wenn nicht mehr.

PHPUnit ist so ziemlich das De-facto-Tool zum Testen von PHP-Einheiten, und das ist sehr gut. Ich habe PHP_CodeSniffer nicht viel benutzt. Ich denke jedoch, dass Sie es wahrscheinlich nicht brauchen, wenn Sie alleine arbeiten. In einem Team ist es nützlicher, sicherzustellen, dass der Code gleich aussieht, unabhängig davon, wer ihn codiert hat.

Netzcodierer
quelle
5

Wir danken Ihnen für die Einstellung, dass Sie aus dieser Erfahrung etwas lernen werden. Ich bin sicher du wirst.

Das allererste, was Sie lernen sollten, ist, dass die Notwendigkeit von Unit-Tests nichts damit zu tun hat, wie erfahren Sie sind . Der beste Entwickler wird auch einer der besten Unit-Tester sein:

Bill Venners: Sie sagen in Ihrem Buch Refactoring: "Wenn Sie refactoring möchten, ist die wesentliche Voraussetzung solide Tests." Bedeutet das, wenn Sie keine Tests haben, sollten Sie nicht umgestalten?

Martin Fowler: Sie sollten sich vorstellen, eine Gratwanderung ohne Netz zu machen. Wenn Sie gut in einer Gratwanderung sind und es nicht so hoch ist, können Sie es versuchen. Aber wenn Sie noch nie eine Gratwanderung gemacht haben und es über den Niagarafällen ist, möchten Sie wahrscheinlich ein gutes Netz.

Von http://www.artima.com/intv/refactorP.html

Ich habe PHP ohne Unit-Test geschrieben. Nachdem ich jahrelang Unit-Tests in Java geübt hatte, stellte ich fest, dass ich ohne Unit-Tests an nichts viel Komplizierterem arbeiten konnte als an einzelnen Seiten in PHP. Der Grund? Produktivität . Ohne Unit-Tests könnte ich nicht mit Zuversicht umgestalten - dies bedeutete, dass entweder A) ich viel mehr abreißen und alles von Anfang an neu bearbeiten müsste oder B) ich mich mit hässlichem, altem Code befassen müsste.

Wenn Sie ein Gebot abgeben, müssen Sie die Zeit zum Testen berücksichtigen? Ja . Scheint es intuitiv, dass dies mehr Zeit in Anspruch nehmen wird? Ja nochmal . Sie werden wahrscheinlich, wie einige andere Antworten grob geschätzt haben, 50-100% mehr schätzen müssen als ohne Unit-Tests.

Jedoch!...

  • Sie werden Spezifikationslöcher früher erkennen und beheben
  • Das heißt, Sie entwickeln sich zu einer saubereren und solideren Spezifikation
  • Sie können schnell und sicher auf Änderungen der technischen Daten reagieren
  • Sie werden weniger Fehler haben
  • Ihre Fehler werden schneller erkannt und können leichter behoben werden

Infolgedessen sind Ihre Schätzungen genauer . Wenn Sie stündlich berechnen, werden Sie Ihre Kunden mehr beeindrucken und Ihre Preise erhöhen können. Wenn Sie eine Pauschale berechnen, verdienen Sie mehr Geld pro Stunde.

Ohne Tests sind Ihre Schätzungen höchstwahrscheinlich ein Crapshoot. Fehler, Änderungsaufträge und Neudefinitionen sind für eine genaue Schätzung schrecklich. Testen ist der Schlüssel zur Minimierung der Auswirkungen aller drei!

Nicole
quelle
3

Es gibt keine einfache Antwort darauf, wie lange Sie noch brauchen werden.

Aber in der Regel, wenn es sich um ein kurzes Projekt handelt: Ich würde sagen, dass die Entwicklung zusammen mit guten Unit-Tests 1,75-2-mal so lange dauern wird wie die Entwicklung ohne Unit-Tests. Für längere Projekte vielleicht 25-30%?

Ich schlage vor, Unit-Tests durchzuführen, bevor Sie Ihren Code schreiben. Auf diese Weise wird das Erstellen des Unit-Test-Gerüsts tatsächlich Teil Ihres Entwurfsprozesses. Sie sollten also nicht berücksichtigen, dass Sie Zeit für Unit-Tests verlieren, sondern dass das Erstellen des Unit-Tests Ihnen beim Entwerfen eines Gerüsts hilft Ein großartiges Produkt und die Existenz dieses Tests nach dem Erstellen erleichtert es Ihnen, sicherzustellen, dass dies auch so bleibt. Das Schreiben von Unit-Tests als Erstes ist wunderbar, um uns auf die tatsächlichen Anforderungen zu konzentrieren, gibt uns eine klare Möglichkeit zu testen, ob wir fertig sind (Bestehen von Unit-Tests), und hilft uns, "früh zu testen und häufig zu testen".

Was PHPUnit betrifft ... Es ist eine Weile her, seit ich es verwendet habe. Mein Eindruck ist, dass es leistungsstark ist, aber vielleicht noch etwas Arbeit benötigt, bevor es wirklich poliert wird.

Wenn es jedoch eine Sache gibt, die ich hier mitteilen möchte: Bitte sehen Sie Unit Testing nicht als bloße Formalität am Ende Ihres Projekts. Wenn das alles ist, ist es meiner Meinung nach wertlos.


quelle
3

Die Antworten sind bisher ziemlich gründlich, daher möchte ich nur einen Punkt hinzufügen, der nicht behandelt wird: Die zusätzliche Zeit aufgrund der Verwendung von PHPUnit wird sein

  1. zuerst höher, seit du es lernst, und
  2. Verringern Sie die Entwicklungszeit ohne Test, wenn Sie Vertrauen in sie gewinnen.

Unit-Testing-Modellklassen, die sich nicht mit Präsentation befassen, sind ziemlich einfach. Sie schreiben einen Test für jede Klasse und können in diesen Testfällen ein Objekt zum Testen einer bestimmten Methode / Funktion direkt instanziieren und konfigurieren. Sobald Sie PHPUnit eingerichtet und ausgeführt haben, können Sie diese Tests schnell zum Laufen bringen.

Unit-Testing-Webseiten können schwieriger sein. Wenn Sie Zend Framework, Symfony, Smarty oder eine andere MVC-Engine verwenden, kann es länger dauern, bis PHPUnit gut mit ihnen funktioniert. Wir verwenden Zend Framework und ich habe viel Zeit damit verbracht, Basisklassen zum Testen von Controllern zu erstellen und Skripte isoliert anzuzeigen. Angesichts der Größe dieses Projekts ist es wahrscheinlich besser, mit zu beginnen ControllerTestCase.

David Harkness
quelle