Wenn Sie fragen: "Was ist Yii?" Schauen Sie sich mein früheres Tutorial an, Einführung in das Yii-Framework, Hier werden die Vorteile von Yii beschrieben und ein Überblick über die Neuerungen in Yii 2.0 (Oktober 2014) gegeben.
In dieser Programmierserie mit Yii2 leite ich die Leser beim Einsatz des Yii2-Frameworks für PHP. In diesem Lernprogramm werde ich das automatisierte Testen mit Codeception untersuchen, das in das Yii2-Entwicklungsframework integriert ist.
Zugegeben, meine Erfahrung beim Schreiben von Tests mit meinem Code ist rar. Ich war oft an Einzel- oder kleinen Projekten mit begrenzten Ressourcen beteiligt. Während meiner Zeit bei Microsoft hatten wir verschiedene Testteams, die dies taten. Aber ehrlich gesagt ist das wahrscheinlich auch typisch für Sie, richtig? Programmierer programmieren gerne, schreiben keine Tests - zumindest haben alte Programmierer das nicht getan.
Codeception ist eine innovative Bibliothek, die buchstäblich das Schreiben von Tests zum Spaß macht. Und ich würde sagen, dass sie bis zu einem vernünftigen Grad erfolgreich waren. Als ich mit "Lake Codeception" meinen Zeh in das Wasser tauchte, war das meistens einfach und macht Spaß. Als ich jedoch tiefer ging, stieß ich auf Konfigurationsprobleme mit Yii und den spezifischen Modulen dieser Serie. Es gab definitiv Herausforderungen. Insgesamt bin ich jedoch beeindruckt und sehe den Nutzen des Lernens mehr.
Einfach ausgedrückt: Codeception und seine Integration mit Yii lassen mich mehr Tests schreiben, eine Premiere für mich. Ich vermute, Sie haben eine ähnliche Erfahrung.
Eine kleine Erinnerung, bevor wir anfangen, nehme ich an den Kommentarthreads unten teil. Ich bin besonders interessiert, wenn Sie weitere Gedanken haben oder Themen für zukünftige Tutorials vorschlagen möchten. Wenn Sie eine Frage oder ein Thema haben, schreiben Sie bitte unten. Sie können mich auch direkt auf Twitter @reifman erreichen.
Um mich anzuführen, habe ich die Dokumentation der Setup-Umgebung von Yii verwendet. Ich begann mit einer globalen Installation von Codeception, sodass ich sie von jedem Projekt aus verwenden konnte.
$ composer global vorausgesetzt "codeception / codeception = 2.1. *" Das aktuelle Verzeichnis wurde in /Users/Jeff/.composer geändert ./composer.json wurde aktualisiert. Composer-Repositorys mit Paketinformationen werden geladen. Abhängigkeiten aktualisieren (einschließlich requir-dev) - Symfony installieren / yaml (v3.1.1) Laden aus dem Cache… Codeception / Codeception empfiehlt die Installation von symfony / phpunit-bridge (Für die Unterstützung von phpunit-bridge) Sperrdatei schreiben Generierung von Autoload-Dateien
Sie müssen auch verlangen Codeception / angeben
:
$ composer global erfordern "codeception / define = *" Das aktuelle Verzeichnis wurde in /Users/Jeff/.composer geändert ./composer.json wurde aktualisiert. Composer-Repositorys mit Paketinformationen werden geladen. Aktualisieren von Abhängigkeiten (einschließlich required-dev) Composer erfordert "Codeception / Verify = * "- Codeception installieren / angeben (0.4.3) Download: 100% Sperrdatei schreiben Autoload-Dateien werden erstellt
Und Codeception / Überprüfung
:
$ composer erfordern "codeception / verify = *" ./composer.json wurde aktualisiert. Composer-Repositorys mit Paketinformationen werden geladen. Abhängigkeiten werden aktualisiert (einschließlich requir-dev) - Codeception installieren / verifizieren (0.3.0) Herunterladen: 100% Sperrdatei erstellen Dateien automatisch laden
Als Nächstes hilft es, einen Alias für einzurichten Codecept
Verwenden Sie Ihr globales Composer-Verzeichnis:
$ composer global status Aktuelles Verzeichnis in /Users/Jeff/.composer geändert. Keine lokalen Änderungen
Hiermit wird der Alias festgelegt:
$ alias codecept = "/ Benutzer / Jeff / .composer / vendor / bin / codecept"
Für Yii müssen Sie außerdem Faker installieren, wodurch falsche Testdaten für Ihre Anwendung generiert werden:
$ composer required --dev yiisoft / yii2-faker: * ./composer.json wurde aktualisiert. Composer-Repositorys werden mit Paketinformationen geladen. Aktualisieren von Abhängigkeiten (einschließlich "required-dev") Keine Installation oder Aktualisierung von Dateien zum automatischen Laden von Dateien
Codecept Bootstrap
initialisiert die Codeception für Ihre Yii-Anwendung und erstellt verschiedene Konfigurationsdateien zum Erstellen und Ausführen von Tests für Ihre Anwendung. Wir verwenden die Hello-Anwendung aus dieser Serie für dieses Tutorial. Siehe den GitHub-Link auf dieser Seite, um den Code zu erhalten.
$ codecept bootstrap Initialisierung der Codeception in / Users / Jeff / Sites / hello Datei codeception.yml wurde erstellt <- global configuration tests/unit created <- unit tests tests/unit.suite.yml written <- unit tests suite configuration tests/functional created <- functional tests tests/functional.suite.yml written <- functional tests suite configuration tests/acceptance created <- acceptance tests tests/acceptance.suite.yml written <- acceptance tests suite configuration tests/_output was added to .gitignore --- tests/_bootstrap.php written <- global bootstrap file Building initial Tester classes Building Actor classes for suites: acceptance, functional, unit -> AcceptanceTesterActions.php wurde erfolgreich generiert. 0 Methoden hinzugefügt \ AcceptanceTester enthält Module: PhpBrowser, \ Helper \ Acceptance AcceptanceTester.php erstellt. -> FunctionalTesterActions.php wurde erfolgreich generiert. 0 Methoden hinzugefügt \ FunctionalTester enthält Module: \ Helper \ Functional FunctionalTester.php erstellt. -> UnitTesterActions.php wurde erfolgreich generiert. 0 Methoden hinzugefügt \ UnitTester enthält Module: Asserts, \ Helper \ Unit UnitTester.php erstellt. Bootstrap ist fertig. Checken Sie das Verzeichnis / Users / Jeff / Sites / hello / tests aus
Aus irgendeinem Grund endete ich auch mit doppelten Testverzeichnissen in hallo / tests. Löschen Sie einfach hallo / tests / funktional, hallo / tests / abnahme und hallo / tests / gerät. Alle Tests leben in Hallo / Tests / Codeception / *.
Codeception konzentriert sich auf drei Arten von Tests:
Und es unterstützt drei verschiedene Testformate für Ihren Testcode:
Beginnen wir mit einem Beispiel von Akzeptanztests mit cept format:
Wir werden Codeception verwenden Herzlich willkommen
Testbeispiel zuerst.
$ codecept $ generieren: Akzeptanz akzeptieren Der Willkommenstest wurde in /Users/Jeff/Sites/hello/tests/acceptance/WelcomeCept.php erstellt
Dies erzeugt Tests / Abnahme / WelcomeCept.php
, die wir unten bearbeiten werden.
Da für Abnahmeprüfungen der Browser erforderlich ist, müssen Sie /tests/acceptance.suite.yml in unserem Projekt bearbeiten, um unsere Entwicklungs-URL anzugeben, http: // localhost: 8888 / hallo:
# Codeception Test Suite-Konfiguration # # Suite für Abnahmetests. # Führen Sie Tests mit dem WebDriver oder PhpBrowser im Browser durch. # Wenn Sie sowohl WebDriver- als auch PHPBrowser-Tests benötigen, erstellen Sie eine separate Suite. Klassenname: AcceptanceTester-Module: aktiviert: - PhpBrowser: URL: http: // localhost: 8888 / hello / - \ Helper \ Acceptance
Jetzt können wir den ersten Test in Tests / Acceptance / WelcomeCept.php ändern. Ich schreibe einen Test, der die Titelseite lädt, um sicherzustellen, dass sie wie erwartet funktioniert.
Codeception-Tests haben in diesem Fall das Konzept eines Schauspielers, $ I = neuer AcceptanceTester ()
.
So werden Akteure in der Codeception-Dokumentation beschrieben:
Wir haben einen UnitTester, der Funktionen ausführt und den Code testet. Wir verfügen auch über einen FunctionalTester, einen qualifizierten Tester, der die Anwendung als Ganzes mit Kenntnissen der internen Funktionen testet. Und ein AcceptanceTester, ein Benutzer, der mit unserer Anwendung über eine von uns bereitgestellte Schnittstelle arbeitet.
Sie können Ihre Tests mit Code kommentieren, z $ I-> wantTo ('Einen bestimmten Test durchführen')
oder 'sicherstellen, dass die Frontpage funktioniert'
.
In meinem Test möchte ich sehen $ I-> siehe
Text für 'Herzliche Glückwünsche!'
und "Yii-powered"
:
wantTo ('sicherstellen, dass die Frontpage funktioniert'); $ I-> amOnPage ('/'); $ I-> siehe ('Glückwunsch!'); $ I-> see ('Yii-powered');
Hier ist die aktuelle Hallo-Homepage:
Als Nächstes führen wir einfach den Test aus Codecept ausgeführt
:
$ codecept run Codeception PHP Testing Framework v2.1.11 Unterstützt von PHPUnit 5.3.5 von Sebastian Bergmann und Mitwirkenden. Abnahmetests (1) ----------------------------------------- ------------------------------------------- Stellen Sie sicher, dass die Frontpage funktioniert (WelcomeCept). Ok -------------------------------------------------- -------------------------------------------------- -------- Funktionstests (0) ------------------------ ------------- -------------------------------- Unit-Tests (0) ------------- ----------------- --------------------------------- ------------ Zeit: 554 ms, Speicher: 10,25 MB OK (1 Test, 2 Assertions)
Wie Sie sehen, hat unser Test bestanden und der Code zur Überprüfung dieser Funktionalität war gut lesbar und einfach.
Um weiter zu gehen, begann ich mit den Standardtests von Yii. Zu diesem Zeitpunkt bin ich auf eine Reihe von Konfigurationsproblemen gestoßen - meistens aufgrund der Verwendung des benutzerdefinierten Moduls yii2-user in dieser Serie. Andere waren auf kleine Fehler mit Yii zurückzuführen, auf die das Team bei GitHub schnell reagiert und es behoben hat. In späteren Versionen des yii2-basic-Baums wurden Probleme behoben.
Da ich den yii2-basic-Baum für diese Serie aktualisiert hatte, musste ich einige der Standardtests geringfügig ändern.
Hier sehen Sie ein Beispiel für die Ausgabe der Standardabnahmetests, nachdem ich einige geringfügige Anpassungen vorgenommen hatte:
$ codecept run Codeception PHP Testing Framework v2.1.11 Unterstützt von PHPUnit 5.3.5 von Sebastian Bergmann und Mitwirkenden. Abnahmetests (4) ----------------------------------------- -------------------------------------------------- - Vergewissern Sie sich, dass ungefähr funktioniert (AboutCept). Ok. Stellen Sie sicher, dass der Kontakt funktioniert. (ContactCept). Ok. Stellen Sie sicher, dass die Startseite funktioniert ----------------------------------------------------------------------------------------------------------------------
Damit Funktionstests funktionieren, musste ich eine Instanz von Yiis integriertem Server ausführen. Ich hatte von dieser Komponente nichts gewusst, bis Yiis Alex Makarov es in unserem GitHub-Austausch erwähnte.
$ ./yii Aufschlag
Ich habe kleine Änderungen an den Funktionstests in / tests / codeception / funktional vorgenommen, meistens, um nach meinen spezifischen aktualisierten Textzeichenfolgen zu suchen, d. H. "Ungültiger Benutzername oder ungültiges Passwort" anstelle von Yiis Standardeinstellung. Hier ein Blick auf LoginCept.php:
wantTo ('Sicherstellen, dass das Login funktioniert'); $ loginPage = LoginPage :: openBy ($ I); $ I-> siehe ('Login'); $ I-> amGoingTo ('Versuchen Sie sich mit leeren Anmeldeinformationen anzumelden'); $ loginPage-> login (","); $ I-> expectTo ('siehe Validierungsfehler'); $ I-> see ('Login darf nicht leer sein.'); $ I-> see ('Das Passwort darf nicht leer sein.'); $ I-> amGoingTo ('versuche dich mit falschen Zugangsdaten anzumelden'); $ loginPage-> login ('admin', 'falsch'); $ I-> expectTo ('siehe Validierungsfehler'); $ I-> see ('Ungültiges Login oder Passwort'); $ I-> amGoingTo ('Versuchen Sie sich mit korrekten Anmeldeinformationen anzumelden'); $ loginPage-> login ('admin', 'admin11'); $ I-> expectTo ('siehe Benutzerinfo'); $ I-> siehe ('Logout');
Grundsätzlich greift der Code auf die Login Formular
modellieren und testen seine verschiedenen Methoden mit Yii dienen.
Hier ist der Testcode /tests/codeception_pages/LoginPage.php, den er nutzt (ich musste ihn auch ändern, um Änderungen an der Serie vorzunehmen):
Klasse LoginPage erweitert BasePage public $ route = 'user / login'; / ** * @param string $ benutzername * @param string $ password * / public function login ($ benutzername, $ password) $ this-> actor-> fillField ('input [name = "login-form [login]") ] ', $ username); $ this-> actor-> fillField ('input [name = "login-form [password]"]', $ password); $ this-> actor-> click ('button [type = submit]');
Sie können sehen, dass wir den Schauspieler kodieren fillFields
und klicken
Schaltflächen für unsere aktualisierten Formularfelder.
Bei der Fehlerbehebung bei der Integration von Codeception mit Yii fand ich es hilfreich, diese Tests im ausführlichen Modus auszuführen:
$ codecept run -vvv
Hier ist die ausführliche Ausgabe der Login-Funktionstests in MacOS Terminal, BESTANDEN
und GESCHEITERT
sind farblich rot oder pink und für die Sichtbarkeit invertiert:
Funktionstests (4) ----------------------------------------- -------------------------------------------------- - Module: Dateisystem, Yii2… -------------------------------------- -------------------------------------------------- --------------------------- Stellen Sie sicher, dass die Anmeldung funktioniert (LoginCept). Szenario: * Ich bin auf der Seite "/index-test.php/user/ login "[Page] /index-test.php/user/login [Response] 200 [Request Cookies] [] [Response Header] " content-type ": [" text / html; charset = UTF-8 "] * Ich sehe "Login" * Ich werde versuchen, mich mit leeren Anmeldeinformationen anzumelden * Ich fülle das Feld "input [name =" login-form [login] "]", "" * Ich fülle das Feld "input [name =" login -form [Kennwort] "]", "" * Klicken Sie auf die Schaltfläche [Typ = Senden] "[Uri] http: //localhost/index-test.php/user/login [Methode] POST [Parameters] " _csrf ":" VEpvcmk3bVgFH1Y9AVsmYWQQDEouTSggYXMFGStdKBEnCyQfBxo8Bw == "," login-form [login] ":" "," login-form [password] ":" " [Page] http: //localhost/index-test.php [Antwort] 200 [Cookies anfordern] "_csrf": "dd395a9e5e3c08 cfb1615dae5fc7b5ba0a2025c003e430ba0139b300f4a917ada: 2: i: 0; s: 5: "_ csrf"; i: 1; s: 32: "QU9OhlK90Zc8GzEx59jkBjEIsAKmn-Q_"; ; charset = UTF-8 "] * Ich erwarte Validierungsfehler. * Ich sehe" Login darf nicht leer sein. "* Ich sehe" Passwort kann nicht leer sein. "* Ich versuche mich mit falschen Anmeldeinformationen anzumelden * Ich fülle das Feld aus "input [name =" login-form [login] "]", "admin" * Ich fülle das Feld aus "input [name =" login-form [Passwort] "]", "falsch" * Ich klicke auf die Schaltfläche [type = submit] "[Uri] http: //localhost/index-test.php/user/login [Methode] POST [Parameter] " _csrf ":" QjFBRl9hMjMTZHgJNw15CnJrIn4YG3dLdwdgrgrLR3Lc3upcAorMUxjbA = "" "," login-form [passwort] ":" falsch " [Page] : i: 0; s: 5: "_ csrf"; i: 1; s: 32: "QU9OhlK90Zc8GzEx59jkBjEIsAKmn-Q_"; " [Response Headers] " content-type ": [" text / html; charset = UTF-8 "] * Ich erwarte Validierungsfehler. * Ich sehe" Ungültiges Login oder Passwort ". * Ich versuche, mich mit korrekten Anmeldeinformationen anzumelden. * Ich fülle das Feld" input [name = "login-form [login ] "]", "admin" * Ich fülle das Feld aus "input [name =" login-form [Kennwort] "]", "admin11" * Ich klicke auf die Schaltfläche [Typ = absenden] "[Uri] http: // localhost /index-test.php/user/login [Methode] POST [Parameter] "_csrf": "bG8uMXdPYk49Ohd.HyMpd1w1TQkwNSc2WVZEWjUlJwcfLmVcGWIzEQ ==", "login-form []]", "login-form ["] "" "". ":" admin11 " [Header] " location ": [" http: //localhost/index-test.php "]," content-type ": [" text / html; charset = UTF-8 "] [Seite] http: //localhost/index-test.php/user/login [Antwort] 302 [Anfrage Plätzchen] " _csrf ":" dd395a9e5e3c08cfb1615dae5fc7b5ba0a2025c003e430ba0139b300f4a917ada: 2: i: 0; s : 5: "_ csrf"; i: 1; s: 32: "QU9OhlK90Zc8GzEx59jkBjEIsAKmn-Q_"; " [Antwortkopf] " location ": [" http: //localhost/index-test.php "]," Inhaltstyp ": [" text / html; charset = UTF-8 "] [Weiterleitung zu] http: //localhost/index-test.php [Page] http: //localhost/index-test.php [Response] 200 [Cookies anfordern] " _csrf ": "dd395a9e5e3c08cfb1615dae5fc7b5ba0a2025c003e430ba0139b300f4a917ada: 2: stunden: 0: stunden: 0: stunden: 0: stunden: 0: stunden; html; charset = UTF-8 "] * Ich erwarte, Benutzerinformationen zu sehen. * Ich sehe" ABMELDEN "
Insgesamt gibt es einiges zu lernen, um mit Codeception zu beginnen und die Tests richtig zu codieren. Die Ergebnisse sind jedoch beeindruckend und hilfreich.
Grundsätzlich handelt es sich bei Unit-Tests um programmatische Tests unserer Infrastruktur und unserer Modelle. Idealerweise würden wir Tests für jede Methode und Nutzungsvariante unserer Modelle schreiben.
Unglücklicherweise konnte ich keine Einzeltests für die Funktionsweise unseres Baums erhalten, weil entweder noch kleine Yii-Fehler veröffentlicht wurden oder Konfigurationsprobleme zwischen Codeception und yii2-user, die wir in How to programmieren mit Yii2 integriert haben: Benutzerregistrierung integrieren.
Komponententests (3) ----------------------------------------- -------------------------------------------------- ----- Module: --------------------------------------- -------------------------------------------------- ----------------------- Anmeldeversuch ohne Benutzer (test \ codeception \ unit \ models \ loginFormTest :: testLoginNoUser)Fataler PHP-Fehler 'yii \ base \ ErrorException' mit der Meldung 'Aufruf an undefinierte Funktionstests \ codeception \ unit \ models \ expect ()'In unserer Serie "Startup" werde ich erneut auf Unit-Tests eingehen, bei denen yii2-user nicht verwendet wird, sondern die integrierte Benutzerintegration des Yii Advanced-Baums.
Schauen wir uns ein paar Beispiele aus der Baumstruktur der Yii2-App an.
Testen von Kontaktformular-E-Mails
Hallo / tests / codeception / unit / models / ContactFormTest.php testet das Versenden einer E-Mail durch programmgesteuerte Verwendung von Modellen:
mailer-> fileTransportCallback = function ($ mailer, $ message) return 'testing_message.eml'; ; protected function tearDown () unlink ($ this-> getMessageFile ()); parent :: tearDown (); public function testContact () $ model = $ this-> createMock ('app \ models \ ContactForm', ['validate']); $ model-> erwartet ($ this-> once ()) -> Methode ('validate') -> wird ($ this-> returnValue (true)); $ model-> attributes = ['name' => 'Tester', 'email' => '[email protected]', 'subject' => 'sehr wichtiger Buchstabe', 'body' => 'aktueller Körper Botschaft', ]; $ model-> contact ('[email protected] '); $ this-> angeben ('E-Mail sollte gesendet werden', function () erwartet ('E-Mail-Datei sollte existieren'), file_exists ($ this-> getMessageFile ()) -> true ();); $ this-> angeben ('Nachricht sollte korrekte Daten enthalten', function () use ($ model) $ emailMessage = file_get_contents ($ this-> getMessageFile ()); Expect ('E-Mail sollte Benutzernamen enthalten', $ emailMessage) -> enthält ($ model-> name); Expect ('E-Mail sollte die E-Mail des Absenders enthalten', $ emailMessage) -> enthält ($ model-> E-Mail); Expect ('E-Mail sollte den Betreff enthalten', $ emailMessage) -> enthält ($ model-> subject); erwarten ('E-Mail sollte body enthalten', $ emailMessage) -> enthält ($ model-> body);); private Funktion getMessageFile () return Yii :: getAlias (Yii :: $ app-> mailer-> fileTransportPath). '/testing_message.eml';Ich konnte diesen Test aufgrund eines kleinen Fehlers in Yii, der noch nicht aktualisiert wurde, nicht erfolgreich bestehen (oder zumindest den aktualisierten Code nicht finden). Mein Ableger der Yii-Codebasis benannte ausgehende E-Mails mit Datumsstempeln und der Code oben suchte nach einem festen Dateinamen. So ist es immer gescheitert. Trotzdem ist es nützlich zu erfahren, wie das programmgestützte Testen Modelle zum Generieren einer Datei verwenden kann, dann nach dieser Datei suchen und deren Inhalt überprüfen, um zu überprüfen, ob der Code funktioniert.
Login testen
Werfen wir einen Blick auf hallo / tests / codeception / unit / models / LoginFormTest.php. Meine Verwendung von yii2-user machte es zum Zeitpunkt der Erstellung dieses Tutorials übermäßig schwierig, die Integration zu integrieren. Wir können jedoch den konzeptionellen Ansatz für das Testen von Benutzermodellfunktionen betrachten.
Hier ist
testLoginCorrect ()
, sieht aus, ob der Login mit einem korrekten Passwort erfolgreich ist:public function testLoginCorrect () $ model = new LoginForm (['username' => 'admin', 'password' => 'admin11',]); $ this-> angeben ('Benutzer sollte sich mit den korrekten Anmeldeinformationen anmelden können'), function () use ($ model) expect ('model sollte Benutzer anmelden', $ model-> login ()) -> true (); Expect ('Fehlermeldung sollte nicht gesetzt werden', $ model-> errors) -> hasntKey ('password'); Expect ('Benutzer sollte angemeldet sein', Yii :: $ app-> user-> isGuest) -> falsch (););Es verwendet die
Login Formular
Um sich programmatisch beim Benutzer anzumelden, prüft das Programm, ob der aktuelle Benutzer von Yii jetzt kein Gast mehr ist.Expect ('Benutzer sollte angemeldet sein', Yii :: $ app-> user-> isGuest) -> false ();Was kommt als nächstes?
Ich hoffe, es hat Ihnen Spaß gemacht, etwas über Codeception und seine Integration mit Yii zu lernen, trotz einiger Straßensperren, denen ich begegnet bin. Die Standardinstallation von yii2-basic sollte heute besser abschneiden.
Wenn Sie mehr darüber erfahren möchten, wann und was getestet werden soll und warum, empfiehlt es sich, Yii's Testing Overview zu lesen. Es gibt sicherlich noch mehr zu lernen über Codeception und das Schreiben vollständigerer Tests.
Achten Sie auf kommende Tutorials in unserer Programmierserie "Programmieren mit Yii2", während wir weiter in verschiedene Aspekte des Frameworks eintauchen. Wenn Sie wissen möchten, wann das nächste Yii2-Tutorial ankommt, folgen Sie mir @reifman auf Twitter oder besuchen Sie meine Instructor-Seite.
Vielleicht möchten Sie auch unsere Reihe für das Erstellen Ihres Startups mit PHP ausprobieren, die die erweiterte Vorlage von Yii2 verwendet, während wir eine reale Anwendung erstellen. Sie können heute die Startanwendung Meeting Planner ausprobieren.
ähnliche Links