In diesem kurzen, aber umfassenden Tutorial betrachten wir die verhaltensgesteuerte Entwicklung (BDD) mit phpspec. Meistens wird es eine Einführung in das phpspec-Tool geben, aber wir werden an dieser Stelle verschiedene BDD-Konzepte ansprechen. BDD ist heutzutage ein heißes Thema und phpspec hat in der PHP-Community in letzter Zeit viel Aufmerksamkeit auf sich gezogen.
Bei BDD geht es darum, das Verhalten von Software zu beschreiben, um das Design richtig zu gestalten. Es wird oft mit TDD in Verbindung gebracht, während sich TDD darauf konzentriert testen Bei BDD geht es mehr um Ihre Bewerbung beschreibt sein Verhalten. Die Verwendung eines BDD-Ansatzes zwingt Sie dazu, die tatsächlichen Anforderungen und das gewünschte Verhalten der von Ihnen erstellten Software ständig zu berücksichtigen.
In der PHP-Community haben zwei BDD-Tools, Behat und phpspec, in letzter Zeit viel Aufmerksamkeit auf sich gezogen. Behat hilft Ihnen, das zu beschreiben äußeres Verhalten Ihrer Anwendung mithilfe der lesbaren Sprache "Gherkin". phpspec dagegen hilft Ihnen bei der Beschreibung der inneres Verhalten Ihrer Anwendung, indem Sie kleine "specs" in der PHP-Sprache schreiben - daher SpecBDD. Diese Spezifikationen testen, ob Ihr Code das gewünschte Verhalten aufweist.
In diesem Tutorial erfahren Sie alles über die ersten Schritte mit phpspec. Auf unserem Weg werden wir das Fundament einer ToDo-Listenanwendung Schritt für Schritt mit einem SpecBDD-Ansatz aufbauen. Auf dem Weg dorthin werden wir phpspec anführen!
Hinweis: Dies ist ein Zwischenartikel zu PHP. Ich gehe davon aus, dass Sie objektorientiertes PHP gut verstehen.
Ich gehe davon aus, dass Sie für dieses Tutorial die folgenden Dinge haben:
Die Installation von phpspec über Composer ist der einfachste Weg. Sie müssen lediglich den folgenden Befehl in einem Terminal ausführen:
$ composer erfordern phpspec / phpspec Bitte geben Sie eine Versionsbeschränkung für die Anforderung von phpspec / phpspec an: 2.0.*@dev
Das wird ein composer.json
Datei für Sie und installieren Sie phpspec in einem Verkäufer/
Verzeichnis.
Um sicherzustellen, dass alles funktioniert, führen Sie es aus phpspec
und sehen Sie, dass Sie die folgende Ausgabe erhalten:
$ vendor / bin / phpspec run 0 Spezifikationen 0 Beispiele 0ms
Bevor wir beginnen, müssen wir ein wenig Konfiguration vornehmen. Wenn phpspec ausgeführt wird, sucht es nach einer YAML-Datei mit dem Namen phpspec.yml
. Da wir unseren Code in einen Namespace stellen, müssen wir sicherstellen, dass phpspec dies weiß. Wenn wir dabei sind, stellen wir sicher, dass unsere Spezifikationen schön aussehen, wenn wir sie ausführen.
Machen Sie die Datei mit folgendem Inhalt:
formatter.name: hübsche Suites: todo_suite: Namespace: Petersuhm \ Todo
Es gibt viele weitere Konfigurationsoptionen, die Sie in der Dokumentation nachlesen können.
Eine weitere Sache, die wir tun müssen, ist Composer mitzuteilen, wie er unseren Code automatisch lädt. phpspec verwendet den Autoloader von Composer. Dies ist für die Ausführung unserer Spezifikationen erforderlich.
Fügen Sie ein Autoload-Element zum hinzu composer.json
Datei, die der Composer für Sie erstellt hat:
"required": "phpspec / phpspec": "2.0.*@dev", "autoload": "psr-0": "Petersuhm \\ Todo": "src"
Laufen composer dump-autoload
Nach dieser Änderung wird der Autoloader aktualisiert.
Nun können wir unsere erste Spezifikation schreiben. Wir fangen damit an, eine Klasse zu beschreiben TaskCollection
. Wir lassen phpspec mit der beschreiben
Befehl (oder alternativ die Kurzversion) desc
) .
$ vendor / bin / phpspec beschreiben "Petersuhm \ Todo \ TaskCollection" $ vendor / bin / phpspec run Soll ich "Petersuhm \ Todo \ TaskCollection" für Sie erstellen? y
Was ist also hier passiert? Zuerst haben wir phpspec gebeten, eine Spezifikation für a zu erstellen TaskCollection
. Zweitens liefen wir unsere spec Suite und dann phpspec automagisch angeboten, um das tatsächliche zu erstellen TaskCollection
Klasse für uns. Cool, nicht wahr??
Fahren Sie fort und führen Sie die Suite erneut aus. Sie werden sehen, dass wir bereits ein Beispiel in unserer Spezifikation haben (wir werden gleich sehen, was ein Beispiel ist):
$ vendor / bin / phpspec run Petersuhm \ Todo \ TaskCollection 10 initial ist initialisierbar 1 Spezifikationen 1 Beispiele (1 bestanden) 7ms
Aus dieser Ausgabe können wir sehen, dass die TaskCollection
ist initialisierbar. Um was geht es hierbei? Schauen Sie sich die von phpspec generierte spec-Datei an und es sollte klarer sein:
shouldHaveType ('Petersuhm \ Todo \ TaskCollection');
Die Phrase "ist initialisierbar" wird von einer Funktion namens abgeleitet it_is_initializable ()
welche phpspec zu einer aufgerufenen Klasse hinzugefügt hat TaskCollectionSpec
. Diese Funktion bezeichnen wir als Beispiel. In diesem speziellen Beispiel haben wir das, worauf wir uns beziehen Matcher namens shouldHaveType ()
das prüft den Typ unseres TaskCollection
. Wenn Sie den an diese Funktion übergebenen Parameter in etwas anderes ändern und die Spezifikation erneut ausführen, werden Sie feststellen, dass sie fehlschlägt. Bevor wir dies vollständig verstehen können, müssen wir zunächst untersuchen, in welcher Variablen $ das
bezieht sich auf unsere Spezifikation.
$ das
?Na sicher, $ das
bezieht sich auf die Instanz der Klasse TaskCollectionSpec
, da dies nur regulärer PHP-Code ist. Aber mit phpspec musst du behandeln $ das
anders als Sie normalerweise tun, denn unter der Haube bezieht sich dies tatsächlich auf das zu testende Objekt, das in der Tat das ist TaskCollection
Klasse. Dieses Verhalten wird von der Klasse geerbt ObjectBehavior
, Dadurch wird sichergestellt, dass Funktionsaufrufe an die angegebene Klasse weitergeleitet werden. Das bedeutet, dass SomeClassSpec
Proxy-Methodenaufrufe an eine Instanz von SomeClass
. phpspec bindet diese Methodenaufrufe um, um ihre Rückgabewerte gegen Matcher wie den gerade gesehenen auszuführen.
Sie brauchen kein tiefes Verständnis dafür, um phpspec nutzen zu können. Denken Sie daran, soweit Sie dies wünschen, $ das
bezieht sich eigentlich auf das zu testende Objekt.
Bisher haben wir selbst nichts unternommen. Aber phpspec hat ein leeres gemacht TaskCollection
Klasse für uns zu verwenden. Jetzt ist es an der Zeit, etwas Code einzufügen und diese Klasse nützlich zu machen. Wir werden zwei Methoden hinzufügen: eine hinzufügen()
Methode, um Aufgaben hinzuzufügen, und a Anzahl()
Methode, um die Anzahl der Aufgaben in der Sammlung zu zählen.
Bevor wir echten Code schreiben, sollten wir ein Beispiel in unsere Spezifikation schreiben. In unserem Beispiel möchten wir versuchen, der Auflistung eine Aufgabe hinzuzufügen, und anschließend sicherstellen, dass die Aufgabe tatsächlich hinzugefügt wird. Dazu benötigen wir eine Instanz der (bisher nicht vorhandenen) Aufgabe
Klasse. Wenn wir diese Abhängigkeit als Parameter zu unserer Spezifikationsfunktion hinzufügen, gibt uns phpspec automatisch eine Instanz, die wir verwenden können. Eigentlich ist die Instanz keine echte Instanz, sondern das, worauf sich phpspec als Mitarbeiter
. Dieses Objekt wird als reales Objekt fungieren, aber mit phpspec können wir noch mehr ausgefallenere Sachen machen, die wir bald sehen werden. Obwohl die Aufgabe
Klasse gibt es noch nicht, vorläufig nur so tun. Öffne die TaskCollectionSpec
und fügen Sie ein benutzen
Aussage für die Aufgabe
Klasse und fügen Sie dann das Beispiel hinzu it_adds_a_task_to_the_collection ()
:
use Petersuhm \ Todo \ Task;… Funktion it_adds_a_task_to_the_collection (Task $ task) $ this-> add ($ task); $ this-> Aufgaben [0] -> shouldBe ($ task);
In unserem Beispiel schreiben wir den Code "Wir wünschten, wir hätten". Wir nennen das hinzufügen()
Methode und dann versuchen, es zu geben $ task
. Dann prüfen wir, ob die Task tatsächlich zur Instanzvariablen hinzugefügt wurde $ Aufgaben
. Der Matcher sollte sein()
ist ein Identität Matcher ähnlich dem PHP ===
Vergleicher. Sie können beide verwenden sollte sein()
, shouldBeEqualTo ()
, shouldEqual ()
oder shouldReturn ()
- Sie alle machen dasselbe.
Das Ausführen von phpspec führt zu einigen Fehlern, da wir keine Klasse haben Aufgabe
noch.
Lassen Sie uns phpspec das für uns beheben:
$ vendor / bin / phpspec beschreiben "Petersuhm \ Todo \ Task" $ vendor / bin / phpspec ausführen Soll ich "Petersuhm \ Todo \ Task" für Sie erstellen? y
Wenn Sie phpspec erneut ausführen, passiert etwas Interessantes:
$ vendor / bin / phpspec run Soll ich 'Petersuhm \ Todo \ TaskCollection :: add ()' für Sie erstellen? y
Perfekt! Wenn Sie einen Blick auf die TaskCollection.php
Datei, Sie werden sehen, dass Phpspec eine hinzufügen()
Funktion für uns auszufüllen:
phpspec beschwert sich jedoch immer noch. Wir haben keine
$ Aufgaben
Array, also machen wir eins und fügen die Aufgabe hinzu:Aufgaben [] = $ Aufgabe;Jetzt sind alle unsere Spezifikationen schön und grün. Beachten Sie, dass ich dafür gesorgt habe, dass der Typ eingegeben wurde
$ task
Parameter.Um sicherzugehen, dass wir es richtig verstanden haben, fügen wir eine weitere Aufgabe hinzu:
Funktion it_adds_a_task_to_the_collection (Task $ task, Task $ anotherTask) $ this-> add ($ task); $ this-> Aufgaben [0] -> shouldBe ($ task); $ this-> add ($ anotherTask); $ this-> Aufgaben [1] -> shouldBe ($ anotherTask);Phpspec läuft, es sieht so aus, als ob wir alle gut sind.
Implementierung der
Zählbar
SchnittstelleWir möchten wissen, wie viele Aufgaben sich in einer Sammlung befinden. Dies ist ein guter Grund, um eine der Schnittstellen der Standard PHP Library (SPL) zu verwenden, nämlich die
Zählbar
Schnittstelle. Diese Schnittstelle gibt an, dass eine Klasse sie implementiert Muss haben eineAnzahl()
Methode.Früher haben wir den Matcher verwendet
shouldHaveType ()
, die ein Art Matcher. Es verwendet den PHP-KomparatorBeispielvon
um zu bestätigen, dass ein Objekt tatsächlich eine Instanz einer bestimmten Klasse ist. Es gibt 4 Matcher, die alle dasselbe tun. Einer von ihnen istshouldImplement ()
, das ist perfekt für unsere Zwecke, also gehen wir weiter und verwenden Sie das in einem Beispiel:function it_is_countable () $ this-> shouldImplement ('Countable');Sehen Sie, wie schön das liest? Lassen Sie uns das Beispiel ausführen und phpspec uns den Weg weisen:
$ vendor / bin / phpspec run Petersuhm / Todo / TaskCollection 25 ✘ ist eine Instanz von Countable mit countable zu erwarten, aber [obj: Petersuhm \ Todo \ TaskCollection].Okay, unsere Klasse ist keine Instanz von
Zählbar
da wir es noch nicht implementiert haben. Lassen Sie uns den Code für unsereTaskCollection
Klasse:Die Klasse TaskCollection implementiert \ CountableUnsere Tests werden seit dem nicht ausgeführt
Zählbar
Schnittstelle hat eine abstrakte Methode,Anzahl()
, die wir umsetzen müssen. Eine leere Methode macht den Trick fürs Erste:öffentliche Funktion count () //…Und wir sind wieder grün. Im Moment unser
Anzahl()
Methode macht nicht viel und ist eigentlich ziemlich nutzlos. Schreiben wir eine Spezifikation für das Verhalten, das wir wünschen. Erstens, ohne Aufgaben wird erwartet, dass unsere Zählfunktion Null zurückgibt:Funktion it_counts_elements_of_the_collection () $ this-> count () -> shouldReturn (0);Es kehrt zurück
Null
, nicht0
. Um einen grünen Test zu erhalten, korrigieren wir den TDD / BDD-Weg:öffentliche Funktion count () return 0;Wir sind grün und alles ist gut, aber das ist wahrscheinlich nicht das Verhalten, das wir wollen. Lassen Sie uns stattdessen unsere Spezifikation erweitern und etwas hinzufügen
$ Aufgaben
Array:Funktion it_counts_elements_of_the_collection () $ this-> count () -> shouldReturn (0); $ this-> Aufgaben = ['foo']; $ this-> count () -> sollteReturn (1);Natürlich kehrt unser Code immer noch zurück
0
, und wir haben einen roten Schritt. Das zu beheben ist nicht zu schwierig und unserTaskCollection
Die Klasse sollte jetzt so aussehen:Aufgaben [] = $ Aufgabe; public function count () return count ($ this-> Aufgaben);Wir haben einen grünen Test und unseren
Anzahl()
Methode funktioniert. Was für ein Tag!Erwartungen & Versprechen
Denken Sie daran, ich habe Ihnen gesagt, dass Sie mit phpspec coole Sachen mit Instanzen von machen können
Mitarbeiter
Klasse, AKA die Instanzen, die automatisch von phpspec injiziert werden? Wenn Sie bereits Unit-Tests geschrieben haben, wissen Sie, was Mocks und Stubs sind. Wenn Sie dies nicht tun, machen Sie sich bitte nicht zu viele Sorgen. Es ist nur Jargon. Diese Dinge beziehen sich auf "gefälschte" Objekte, die als Ihre realen Objekte fungieren, aber Sie können sie isoliert testen. phpspec schaltet diese automatisch ausMitarbeiter
Instanzen in Mocks und Stubs, wenn Sie es in Ihren Spezifikationen benötigen.Das ist wirklich großartig. Unter der Haube verwendet phpspec die Prophecy-Bibliothek, die ein hochmeinendes Mocking-Framework ist, das gut mit phpspec spielt (und von den gleichen fantastischen Leuten gebaut wird). Sie können eine Erwartung für einen Mitarbeiter festlegen (Spott), wie diese Methode sollte aufgerufen werden", und Sie können Versprechen (Stubbing) hinzufügen, wie" diese Methode wird zurückkehren dieser Wert ". Mit phpspec ist das wirklich einfach und wir werden beide Dinge als nächstes tun.
Lass uns eine Klasse machen, wir nennen es
Aufgabenliste
, das kann unsere sammelklasse nutzen.$ vendor / bin / phpspec desc "Petersuhm \ Todo \ TodoList" $ vendor / bin / phpspec run Soll ich "Petersuhm \ Todo \ TodoList" für Sie erstellen? yAufgaben hinzufügen
Das erste Beispiel, das wir hinzufügen, ist das Hinzufügen von Aufgaben. Wir machen eine
Aufgabe hinzufügen()
Eine Methode, die nichts anderes tut, als unserer Sammlung eine Aufgabe hinzuzufügen. Es leitet den Anruf einfach an diehinzufügen()
Methode auf der Sammlung, so ist dies ein perfekter Ort, um eine Erwartung zu nutzen. Wir möchten nicht, dass die Methode tatsächlich den Aufruf vonhinzufügen()
Methode wollen wir nur sicherstellen, dass es versucht, es zu tun. Außerdem möchten wir sicherstellen, dass es nur einmal aufgerufen wird. Sehen Sie sich an, wie wir mit phpspec vorgehen können:shouldHaveType ('Petersuhm \ Todo \ TodoList'); function it_adds_a_task_to_the_list (TaskCollection $ task, Task $ task) $ task-> add ($ task) -> shouldBeCalledTimes (1); $ this-> Aufgaben = $ Aufgaben; $ this-> addTask ($ task);Erstens haben wir von phpspec die zwei Mitarbeiter, die wir brauchen: eine Aufgabensammlung und eine Aufgabe. Dann setzen wir eine Erwartung an den Task Collection Collaborator, die im Wesentlichen sagt: "the
hinzufügen()
Die Methode sollte genau 1 Mal mit der Variablen aufgerufen werden$ task
als Parameter ". So bereiten wir unseren Mitarbeiter vor, der jetzt ein Mock ist, bevor wir ihn dem zuweisen$ Aufgaben
Eigentum an derAufgabenliste
. Schliesslich versuchen wir tatsächlich das anzurufenAufgabe hinzufügen()
Methode.Ok, was hat phpspec dazu zu sagen:
$ vendor / bin / phpspec starte Petersuhm / Todo / TodoList 17! fügt eine Aufgabe zu den Listeneigenschaften hinzu, die nicht gefunden wurden.Das
$ Aufgaben
Eigenschaft ist nicht vorhanden - einfach:Versuchen Sie es erneut und lassen Sie sich von phpspec leiten:
$ vendor / bin / phpspec run Soll ich 'Petersuhm \ Todo \ TodoList :: addTask ()' für Sie erstellen? y $ vendor / bin / phpspec run Petersuhm / Todo / TodoList 17 ✘ fügt eine Aufgabe zur Liste hinzu. Einige Vorhersagen sind fehlgeschlagen. P4-> add (genau (Double \ Petersuhm \ Todo \ Task \ P3: 000000002544d76d0000000059fcae53)), aber es wurde nichts gemacht.Okay, jetzt ist etwas Interessantes passiert. Siehe die Meldung "Erwartet genau 1 passende Anrufe:…"? Das ist unsere versagte Erwartung. Dies geschieht, weil nach dem Anruf
Aufgabe hinzufügen()
Methode, diehinzufügen()
Methode auf der Sammlung war nicht genannt, was wir erwartet hatten.Um wieder grün zu werden, geben Sie den folgenden Code in das leere Feld ein
Aufgabe hinzufügen()
Methode:Aufgaben-> Hinzufügen ($ Task);Zurück zu grün! Es fühlt sich gut an, richtig?
Auf Aufgaben prüfen
Schauen wir uns auch die Versprechen an. Wir möchten eine Methode, die uns mitteilen kann, ob Aufgaben in der Sammlung vorhanden sind. Dazu prüfen wir einfach den Rückgabewert von
Anzahl()
Methode auf der Sammlung. Wieder brauchen wir keine reale Instanz mit einer realenAnzahl()
Methode. Wir müssen nur sicherstellen, dass unser Code einige aufruftAnzahl()
Methode und tun Sie einige Sachen abhängig vom Rückgabewert.Schauen Sie sich das folgende Beispiel an:
Funktion it_checks_whether_it_has_any_tasks (TaskCollection $ task) $ task-> count () -> willReturn (0); $ this-> Aufgaben = $ Aufgaben; $ this-> hasTasks () -> shouldReturn (false);Wir haben einen Mitarbeiter zur Aufgabensammlung, der eine
Anzahl()
Methode das wird zurückkehren Null. Das ist unser Versprechen. Dies bedeutet, dass jedes Mal, wenn jemand anruftAnzahl()
Methode wird es Null zurückgeben. Wir weisen dann den vorbereiteten Mitarbeiter dem zu$ Aufgaben
Eigentum an unserem Objekt. Schließlich versuchen wir eine Methode aufzurufen,hasTasks ()
, und stellen Sie sicher, dass es zurückkehrtfalsch
.Was hat phspec dazu zu sagen??
$ vendor / bin / phpspec run Soll ich 'Petersuhm \ Todo \ TodoList :: hasTasks ()' für Sie erstellen? y $ vendor / bin / phpspec run Petersuhm / Todo / TodoList 25 ✘ prüft, ob Aufgaben erwartet werden, die falsch sind, aber null sind.Cool. phpspec hat uns a
hasTasks ()
Methode und nicht überraschend, kehrt sie zurückNull
, nichtfalsch
.Wieder einmal ist dies leicht zu beheben:
public function hasTasks () return false;Wir sind wieder grün, aber das wollen wir nicht. Lassen Sie uns auf Aufgaben prüfen, wenn es 20 davon gibt. Das sollte wiederkommen
wahr
:Funktion it_checks_whether_it_has_any_tasks (TaskCollection $ task) $ task-> count () -> willReturn (0); $ this-> Aufgaben = $ Aufgaben; $ this-> hasTasks () -> shouldReturn (false); $ task-> count () -> willReturn (20); $ this-> Aufgaben = $ Aufgaben; $ this-> hasTasks () -> shouldReturn (true);Führen Sie phspec aus und wir erhalten:
$ vendor / bin / phpspec run Petersuhm / Todo / TodoList 25 ✘ prüft, ob Aufgaben erwartet werden, aber falsch sind.okay,
falsch
ist nichtwahr
, Wir müssen also unseren Code verbessern. Lass uns das benutzenAnzahl()
Methode um zu sehen, ob es Aufgaben gibt oder nicht:public function hasTasks () if ($ this-> task-> count ()> 0) gibt true zurück; falsch zurückgeben;Tah dah! Zurück zu grün!
Benutzerdefinierte Matcher erstellen
Zum Schreiben guter Spezifikationen gehört es, sie so lesbar wie möglich zu machen. Unser letztes Beispiel kann dank der angepassten Matcher von phpspec sogar ein bisschen verbessert werden. Es ist einfach, benutzerdefinierte Matcher zu implementieren - wir müssen nur die. Überschreiben
getMatchers ()
Methode, die von vererbt wirdObjectBehavior
. Durch die Implementierung von zwei benutzerdefinierten Matchern können unsere Spezifikationen folgendermaßen geändert werden:Funktion it_checks_whether_it_has_any_tasks (TaskCollection $ task) $ task-> count () -> willReturn (0); $ this-> Aufgaben = $ Aufgaben; $ this-> hasTasks () -> shouldBeFalse (); $ task-> count () -> willReturn (20); $ this-> Aufgaben = $ Aufgaben; $ this-> hasTasks () -> shouldBeTrue (); function getMatchers () return ['beTrue' => Funktion ($ subject) return $ subject === true; , 'beFalse' => Funktion ($ subject) return $ subject === false; ,];Ich finde das sieht ziemlich gut aus. Denken Sie daran, dass das Umgestalten Ihrer Daten wichtig ist, um sie auf dem neuesten Stand zu halten. Durch die Implementierung eigener Matcher können Sie Ihre Daten bereinigen und sie lesbarer machen.
Eigentlich können wir auch die Negation der Matcher verwenden:
Funktion it_checks_whether_it_has_any_tasks (TaskCollection $ task) $ task-> count () -> willReturn (0); $ this-> Aufgaben = $ Aufgaben; $ this-> hasTasks () -> shouldNotBeTrue (); $ task-> count () -> willReturn (20); $ this-> Aufgaben = $ Aufgaben; $ this-> hasTasks () -> shouldNotBeFalse ();Ja. Ziemlich cool!
Fazit
Alle unsere Spezifikationen sind grün und schauen, wie gut sie unseren Code dokumentieren!
Petersuhm \ Todo \ TaskCollection 10 ✔ ist initialisierbar 15 ✔ fügt der Sammlung eine Aufgabe hinzu 24 ✔ ist abzählbar 29 ✔ Elemente der Sammlung Petersuhm \ Todo \ Task 10 ✔ ist initialisierbar Petersuhm \ Todo \ TodoList 11 initial ist initialisierbar Aufgabe an die Liste 24 ✔ prüft, ob es Aufgaben hat 3 Spezifikationen 8 Beispiele (8 bestanden) 16msWir haben das gewünschte Verhalten unseres Codes effektiv beschrieben und erreicht. Nicht zu vergessen, unser Code wird zu 100% von unseren Spezifikationen abgedeckt, was bedeutet, dass das Refactoring keine angstauslösende Erfahrung sein wird.
Ich hoffe, dass Sie inspiriert wurden, phpspec auszuprobieren. Es ist mehr als ein Testwerkzeug - es ist ein Entwurfswerkzeug. Wenn Sie sich erst einmal mit phpspec (und seinen fantastischen Code-Generierungswerkzeugen) vertraut gemacht haben, fällt es Ihnen schwer, es wieder loszulassen! Die Leute beschweren sich oft, dass TDD oder BDD sie verlangsamt. Nachdem ich phpspec in meinen Arbeitsablauf aufgenommen habe, fühle ich mich wirklich andersherum - meine Produktivität ist deutlich verbessert. Und mein Code ist solider!