Sprachübergreifende testgetriebene Entwicklung

9

Die kurze Frage: Wie verfolgen Sie die testgesteuerte Entwicklung in einem mehrsprachigen Projekt?

Insbesondere schreibe ich eine Webanwendung, die JavaScript und PHP verwendet, und ich möchte den TDD-Prinzipien folgen, bin mir aber nicht sicher, wie ich sie integrieren soll. Führe ich separate Testsuiten für die JS- und PHP-Abschnitte aus und verwende Mocks in der JS-Suite, um Serverantworten zu emulieren? Gibt es eine Technik zum Testen beider Komponenten in einem Durchgang?

Dies ist meine erste Erfahrung mit testgetriebener Entwicklung. Daher wäre jeder Ratschlag, den Sie uns geben können, wie Sie die Entwicklung weniger entmutigen können, großartig. Der Grund, warum ich mich dafür entschieden habe, ist, dass sich die Anforderungen geändert haben, sobald ich einen Prototyp fertiggestellt habe, was mich gezwungen hat, mein Design zu ändern. Ich dachte mir, wenn ich von vorne anfange, möchte ich von Anfang an mehr erweiterbaren Code mit integrierten Regressionstests schreiben.

Ich schreibe meine PHP-Tests in SimpleTest und meine JavaScript-Tests in JsTestDriver. Ich bin an objektorientierte Paradigmen gewöhnt, daher habe ich einige Klassen in PHP und mache etwas Ähnliches in JavaScript mit prototypischer Vererbung. Ich habe auch angefangen, dieses Buch über TDD in Python und dieses über TDD in JavaScript zu lesen , aber nach allem, was ich gesehen habe, beschreiben diese nicht das vollständige Testen einer Anwendung (abgesehen von der Verwendung von etwas wie Selenium oder einem anderen Webtreiber) Front-End-Abnahmetests durchführen. Ist TDD nicht für Full-Stack-Entwickler geeignet?

Chris Olsen
quelle
1
Sofern Sie nicht gezwungen sind, SimpleTest zu verwenden, würde ich empfehlen, zu PHPUnit zu wechseln. SimpleTest scheint nicht sehr aktiv zu sein und bleibt in Bezug auf Verspottung und Codeabdeckung etwas zurück.
Cerad

Antworten:

9

Gibt es eine Technik zum Testen beider Komponenten in einem Durchgang?

Das wäre eigentlich das Gegenteil von Unit- Tests - Unit-Tests, insbesondere im TDD-Stil, bedeuten, Ihre Komponenten isoliert zu testen . Daher lautet die Antwort "Ja, separate Testsuiten für die JS- und PHP-Abschnitte ausführen ", andernfalls handelt es sich nicht um Unit-Tests und nicht um TDD.

Natürlich können automatisierte Integrationstests "beide Komponenten in einem Durchgang" testen, und Sie können genau die Tools verwenden, die Sie bereits erwähnt haben (wie Selen). Dies sind jedoch in der Regel komplexere Tests, die außerhalb der TDD-Zyklen entwickelt wurden.

Doc Brown
quelle
3

Wichtig ist, zwischen TDD und ATDD zu unterscheiden . Das AT steht dort für " Akzeptanztests ", und dies bezieht sich auf die Entwicklung, bei der Sie zuerst mit einem Akzeptanztest beginnen, der wahrscheinlich den gesamten Stapel testet. Dies wird manchmal auch als "testgetriebene Entwicklung von außen nach innen" bezeichnet. Wenn von TDD die Rede ist, bezieht sich das "T" dort wahrscheinlich speziell auf Unit- Tests.

Ein wesentlicher Bestandteil von Komponententests besteht darin, die zu testende Einheit von ihren Abhängigkeiten zu isolieren. Dies bietet Ihnen zwei sehr wichtige Vorteile:

  • Sie können Ihre Tests extrem schnell durchführen, sodass Sie sie im Rahmen eines sehr kurzen Feedback-Zyklus sehr oft ausführen können. Anstatt sie beispielsweise jede Stunde auszuführen, sollten Sie in der Lage sein, alle Ihre Komponententests nach jeder kleinen Änderung auszuführen, damit Sie sofort das Feedback erhalten, ob diese Änderung etwas kaputt gemacht hat.

  • Ihre Tests können auf sehr spezifisches Verhalten ausgerichtet werden. Wenn einer von ihnen fehlschlägt, sollten Sie in der Lage sein, die genaue Art des Fehlers, auf den der Test hinweist, fast sofort zu bestimmen.

Aufgrund der Bedeutung dieser Isolation möchten Sie, dass Tests automatisch auf viel kleinere Einheiten beschränkt werden, als Ihre Sprachgrenzen Sie zwingen. Obwohl dies keine feste Regel ist, würde man oft erwarten, dass eine einzelne Klasse eine testbare Einheit ist. In Bezug auf TDD ist das Sprachproblem also mehr oder weniger irrelevant.

Wenn Sie andererseits ATDD durchführen möchten, sollten Sie sich die Ressourcen dafür genauer ansehen (dies geschieht häufig im Rahmen von BDD. Sehen Sie sich also auch Tools an, die darauf abzielen). Hier würde natürlich so etwas wie Selen passen. Wenn Sie ATDD ausführen, schreiben Sie normalerweise immer noch Unit-Tests. Um jeden Abnahmetest zu bestehen, können Sie die Implementierung auch mit Unit-Tests testen. Selbst wenn Sie ATDD durchführen möchten, ist es dennoch wichtig zu verstehen, wie Unit-Tests geschrieben werden.

Ben Aaronson
quelle
Cool, ich habe mir ATDD noch nie angesehen, bin aber mit Behat and Behave for BDD vertraut. Ich freue mich über das Feedback. Ich versuche immer noch, mich
Chris Olsen
@ChrisOlsen Es gibt zwei Aspekte, um sich zurechtzufinden: Komponententests (vs. Integration oder Akzeptanz) und wann Sie sie schreiben (vor dem Produktionscode und nicht danach). Wenn beide wie seltsame Mentalitäten erscheinen, könnten Sie versuchen, die erste vor der zweiten in den Griff zu bekommen. Viele Leute praktizieren kein TDD, bestehen aber dennoch auf einer sehr gründlichen Berichterstattung über Unit-Tests.
Ben Aaronson
1

Außerdem müssen Sie TDD nicht für den gesamten Stapel der Anwendung verwenden. TDD als Entwicklungsmethode eignet sich besser für die logischen Teile einer Anwendung. Die Teile, die einen experimentelleren Touch erfordern, wie das Design des Frontends, bestimmte Interaktionen oder die Datenbankdomäne, werden besser in einem traditionellen Stil ausgeführt, da Sie noch nicht wissen, ob dies die endgültige Version sein wird.

Die Logik der Anwendung sollte sich jedoch in Zukunft nicht ändern, und wenn dies der Fall ist, stehen Sie vor dem gefürchteten Anforderungsschleichen. Das macht es perfekt für eine Reihe von Regressionstests, um Vertrauen zu schaffen, wenn Änderungen am Code vorgenommen werden, was das ultimative Ziel von TDD ist.

Onkel Bob erklärt diesen Weg besser als ich. https://blog.8thlight.com/uncle-bob/2014/04/30/When-tdd-does-not-work.html

Cllamach
quelle