Einführung in das automatisierte Testing mit Codeception in PHP-Projekten

Was ist automatisiertes Testing? Wie setzen wir es bei WATA Factory um? Was sind die Gründe, die automatisiertes Testing so interessant machen?

In diesem Artikel werden wir über Codeception sprechen, eines der Tools, welches wir zum automatisierten Testing in unseren PHP implementierten Webprojekten verwenden.

Was ist automatisiertes Testing?

Wenn wir im Bereich des Softwaretestens von automatisiertem Testen sprechen, möchten wir erreichen, dass manuelle Tests unbeaufsichtigt ausgeführt werden können, mit Hilfe eines Tools, welches den Prozess automatisch durchführt und verbessert, ohne jedoch den Nutzen des manuellen Testens zu 100% zu ersetzen. Wir berichteten hierüber bereits in einem früheren Artikel.

Wenn wir die Tests so gestalten können, dass sie von einem Computer ausgeführt werden, dann erreichen wir eine kontinuierliche Durchführung der Tests während der Weiterentwicklung der Anwendung.

Warum ist automatisiertes Testing für uns interessant?

Bei WATA Factory sahen wir die Notwendigkeit, diese Art von Tests zu implementieren, da die Entwicklung unserer Projekte neue Funktionalitäten erforderte, die zusammen mit den bereits Bestehenden getestet werden mussten, um die Qualität unserer Produkte weiterhin zu gewährleisten.

Die Automatisierung von Tests bringt eine Reihe von Vorteilen mit sich, mit deren Hilfe das Qualitätsniveau des Produkts erhöht und seine Kosten gesenkt werden, da die Wiederholung von Tests keine große Zeitinvestition in den Phasen der Verbesserung oder Entwicklung des Produkts erfordert.

Einige der Vorteile, die wir in der WATA Factory durch die Implementierung von automatisierten Tests erreicht haben, sind:

  • Automatische Überprüfung der Einhaltung der definierten Vorgaben unter Anwendung von BDD (Behavior Driven Development). Einer der großen Vorteile hiervon ist die Nutzung einer gemeinsamen Sprache zwischen Kunden und Entwickler-Team, um somit zu bestätigen, dass das Verhalten des Codes aus Sicht des Benutzers korrekt ist.
  • Reduktion der Anzahl von Bugs, da wir sicherstellen, dass sowohl die neue als auch die alte Funktionalität weiterhin korrekt funktioniert.
  • Zeitersparnis beim Testen, da wir wiederkehrende Aufgaben vermeiden, und sicherstellen, dass Änderungen in unserem Programm keine anderen Bereiche des Systems beeinflussen.
  • die Erstellung von solider Dokumentation.
  • Die Teamarbeit einfacher und sicherer zu machen.

Um mit der Entwicklung des automatisierten Testings zu beginnen, informierten wir uns über verschiedene Testing-Frameworks und stießen auf Codeception, welches alles was wir brauchten, in einem einzigen Tool vereinte.

Was ist Codeception und wie kann man es installieren?

Codeception ist ein PHP-Testframework, das zum Ziel hat, lesbare Tests zu erstellen und die Vorgänge aus der Sicht des Benutzers zu beschreiben. Es erlaubt uns, Akzeptanz-, Funktions- und Unit-Tests durchzuführen.

Der Schlüssel zu Codeception ist seine Mitwirkenden (Actors). Codeception versteht Tests als Vorgänge, die von einer Person angestoßen werden. Zusammengefasst kann man sagen, dass ein UnitTester Vorgänge startet und den Code testet, ein FunctionalTester die Anwendung als Ganzes testet, und ein AcceptanceTester interagiert mit der Schnittstelle.

Jeder Actor führt sogenannte Steps aus, das sind einzelne Anweisungen innerhalb eines Szenarios. Die Anweisungen, die ein Actor erzeugen kann, sind in Modulen gruppiert: PhpBrowser,WebDriver, DB, FileSystem, etc.

Zur Installation folgen wir den in der offiziellen Dokumentationbeschriebenen Schritten.

Bei der Installation wird ein Ordner mit dem Namen tests angelegt, und innerhalb dieses Ordners wird eine Grundstruktur für die Codierung der verschiedenen Testtypen erstellt.

Als Beispiel werden wir den klassischen Login testen. Obwohl es in diesem Test noch mehr Szenarien gibt, zeigen wir nur einige von ihnen, um nicht allzu sehr auszuschweifen.

Um den Test zu erstellen, führt man folgenden Befehl aus:

php vendor/bin/codecept g:feature acceptance Login

Dadurch wird eine ‚.feature‚-Datei erstellt, in der wir unsere User Story in einer formalen Sprache namens Gherkin schreiben, mit der Besonderheit, dass wir diese Szenarien als automatisierte Tests ausführen können.

Feature: Login page
Check that the user can access correctly with correct credentials, in other case a warning text is shown.
 
Scenario: User inserts empty password and empty username
   Given I am on login page
   When I fill fields with empty value
     And I click on login button
   Then I see the entered user data are not correct
 
Scenario: Successful access with valid credencials
   Given I am on login page
   When I fill the fields with correct credencials
     And I click on login button
   Then I see Welcome Dummy Name

Szenarien werden Schritt für Schritt unter der Verwendung von GIVEN-WHEN-THEN Kriterien geschrieben.

  • Der GIVEN-Teil ist die Vorbedingung für den Test. Von wo aus begonnen wird
  • Der Teil WHEN ist das spezifische Verhalten, also die Aktionen, die wir brauchen.
  • Und schließlich THEN, der Teil, in dem wir das erwartete Ergebnis erhalten.

Definieren der Tests

Unser nächster Schritt ist die Definition und Umwandlung der Feature-Datei in einen gültigen Test. Sie wird in der AcceptanceTester-Datei definiert.

Um die notwendigen Schritte zu erhalten, wird der folgende Befehl ausgeführt:

php vendor/bin/codecept gherkin:snippets acceptance

Da wir in der Acceptance Suite sind nutzen wir zum implementieren WebDriver als Modul, was uns die Interaktion mit dem Browser ermöglicht. Das bedeutet, dass wir seine Methoden innerhalb der Testerdatei verwenden können, so wie wir es bei den Skripttests tun können, mit

$I->

Man kann verschiedene Methoden verwenden, die bereits entwickelt wurden (z. B. amOnPage oder click). Jeder Schritt des Gherkin-Szenarios wird um die in Codeception definierten Methoden erweitert.

Wir zeigen nun, wie das in unserem Fall umgesetzt werden kann:

/**
 * @Given I am on login page
 */
public function iAmOnLoginPage()
{
 $I->amOnPage('/login');
}

/**
 * @When I fill fields with empty value
 */
public function iFillFieldsWithEmptyValue()
{
 $I->fillField('#username','');
 $I->fillField('#password','');
}

/**
 * @When I fill the fields with correct credencials
 */
public function iFillTheFieldsWithCorrectCredencials()
{
 $I->fillField('#username','correctUsername');
 $I->fillField('#password','correctPassword');
}

/**
 * @When I click on login button
 */
public function iClickOnLoginButton()
{
 $I->click('Login');
}

/**
 * @Then I see the entered user data are not correct
 */
public function iSeeTheEnteredUserDataAreNotCorrect()
{
 $I->see('the entered user data are not correct');
}

/**
 * @Then I see Welcome Dummy Name
 */
public function iSeeWelcomeDummyName()
{
 $I->see('Welcome Dummy Name,');
}

Schließlich führen wir unsere .feature-Datei mit folgendem Befehl aus

php vendor/bin/codecept run acceptance Login.feature --steps 

um zu sehen, dass Given/When/The mit Teilschritten erweitert wird und das erwartete Ergebnis bei der Ausführung angezeigt wird.

Acceptance Tests (2)
-------------------------------------------------------------
Login page: User inserts empty password and empty username Signature: User inserts empty password and empty username
Test: App/Tests/surveys/Login.feature:User inserts empty password and empty username

Scenario -- 
Check that the user can access correctly with correct credentials, in other case a warning text is shown.

Given i am on login page
 I am on url "https://###########/login"
When i fill fields with empty value
 I fill field "#username"," "
 I fill field "#password"," "
And i click on login button 
 I click "LOGIN"
 I wait 5
Then i see the entered user data are not correct 
 I see "the entered user data are not correct" 
PASSED 

Login page: User inserts proper information - Successful access with valid credencials 
Signature: Successful access with valid credencials 
Test: App/Tests/surveys/articulo_test.feature: Successful access with valid credencials

Scenario --
Check that the user can access correctly with correct credentials, in other case a warning text is shown.

Given i am on login page 
 I am on url "https://########/login"
When i fill the fields with correct credencials 
 I fill field "#username","correctUsername"
 I fill field "#password","correctPassword"
And i click on login button 
 I click "LOGIN"
 I wait 5
Then i see welcome dummy name 
 I see "Welcome Dummy Name,"
PASSED 
-------------------------------------------------------------
Time: 19.57 seconds, Memory: 18.00 MB OK (2 tests, 2 assertions)

Dieses Tool bietet uns viele Vorteile, es hat auch eine Anwendung, bekannt als Webception, in der der Kunde alle Tests vom Browser aus ausführen kann und somit in der Lage ist, den Status der Anwendung zu verfolgen.