Suche…


Bemerkungen

Dieser Abschnitt bietet einen Überblick über das Verhalten und warum ein Entwickler es möglicherweise verwenden möchte.

Es sollte auch alle großen Themen innerhalb des Verhaltens erwähnen und auf die verwandten Themen verweisen. Da die Dokumentation für behat neu ist, müssen Sie möglicherweise erste Versionen dieser verwandten Themen erstellen.

Funktionsprüfung als User Storys

Funktionstests lassen sich am besten als Tests für Ihre User Storys beschreiben. Wenn Sie sich mit User Storys befasst haben, bevor sie normalerweise dem folgenden Muster folgen:

As a [role], I want to [desire], so that [benefit/desired outcome]

Für die folgenden Beispiele verwenden wir diese User Story als Beispiel:

As a Dungeon Master, I want to ensure harmony and mutual trust, so that
the party can work together as a team

Die zwei beliebtesten Testframeworks für Funktionstests in PHP sind Behat und PHPSpec .

Beginnend mit Behat

Behat stellt die Gherkin-Syntax bereit, die ein vom Menschen lesbares Format ist. Damit können Sie Ihre User Storys einfach beschreiben.

Um mit Behat zu beginnen, sollten Sie es mit Composer installieren und dann Ihre Testdateien initialisieren:

$ composer require --dev behat/behat="^3.0.5"

$ ./vendor/bin/behat --init

+d features # place your *.feature files here
+d features/bootstrap # place your context classes here
+f features/bootstrap/FeatureContext.php # place your definitions, transformations and hooks here

Standardmäßig platzieren Sie Ihre Testdateien im Ordner features/ und haben die Erweiterung .feature .

Jede Testdatei sollte eine bestimmte Funktion der Anwendung definieren. Ein Feature ist in eine Reihe von Szenarien unterteilt und enthält eine Reihe von Schritten, die erfolgreich ausgeführt werden müssen, damit das Szenario erfolgreich ist. Jedes Szenario muss bestanden werden, damit eine Funktion bestanden werden kann.

# features/PartyHarmony.feature
Feature: Party Harmony
    As a Dungeon Master, I want to ensure harmony and mutual trust, so that
    the party can work together as a team

    Scenario: Teach members to respect each others property
        Given that the Wizard has 10 cookies
        And the Bard eats 1 cookie
        Then the Bard is mysteriously on fire

Um Ihre Tests auszuführen, führen Sie die Binärdatei Behat direkt aus. Wir können optional angeben, welche Feature-Datei ausgeführt werden soll (andernfalls werden alle Tests ausgeführt). Diese Feature-Datei schlägt mit undefinierten Schritten fehl (da wir nicht definiert haben, was diese Schritte bedeuten):

$ ./vendor/bin/behat features/PartyHarmony.feature
Feature: Party Harmony
    As a Dungeon Master, I want to ensure harmony and mutual trust, so that
    the party can work together as a team

  Scenario: Teach members to respect each others property # features/PartyHarmony.feature:6
    Given that the Wizard has 10 cookies
    And the Bard eats 1 cookie
    Then the Bard is mysteriously on fire

1 scenario (1 undefined)
3 steps (3 undefined)
0m0.01s (10.49Mb)

--- FeatureContext has missing steps. Define them with these snippets:

    /**
     * @Given that the Wizard has :arg1 cookies
     */
    public function thatTheWizardHasCookies($arg1)
    {
        throw new PendingException();
    }

    /**
     * @Given the Bard eats :arg1 cookie
     */
    public function theBardEatsCookie($arg1)
    {
        throw new PendingException();
    }

    /**
     * @Then the Bard is mysteriously on fire
     */
    public function theBardIsMysteriouslyOnFire()
    {
        throw new PendingException();
    }

Jeder Schritt in einem Szenario führt einen Code aus einer Kontext-PHP-Datei aus (verschiedene Funktionstests können unterschiedliche Kontexte laden). Wir können die von Behat vorgeschlagenen Beispiele kopieren oder eigene erstellen. Die Schritte werden mit einer Überprüfung regulärer Ausdrücke abgeglichen. Also wenn wir umsetzen

<?php
# 
class FeatureContext {
    /**
     * @Given that the wizard has :num cookies
     */
    public function wizardHasCookies($num) {
        // $this->wizard is a pre-existing condition.... like syphilis
        $this->wizard->setNumberOfCookies($num);
    }

    /**
     * @Given the Bard eats :num cookie
     */
    public function theBardEatsCookie($num)
    {
        $this->bard->consumeCookies($num);
    }

    /**
     * @Then the Bard is mysteriously on fire
     */
    public function theBardIsMysteriouslyOnFire() {
        PHPUnit_Framework_Assert::assertTrue(
            $this->bard->isBardOnFire()
        );
    }
}

Sie werden die Verwendung von PHPUnit_Framework_Assert . Behat hat kein eigenes Assert-System, so dass Sie das verwenden können, was Sie wollen.

Beim Ausführen der Tests wird der eigentliche Code ausgeführt, und wir können testen, ob alles erfolgreich ist:

$ ./vendor/bin/behat features/PartyHarmony.feature
Feature: Party Harmony
    As a Dungeon Master, I want to ensure harmony and mutual trust, so that
    the party can work together as a team

  Scenario: Teach members to respect each others property # features/PartyHarmony.feature:6
    Given that the Wizard has 10 cookies                  # FeatureContext::thatTheWizardHasCookies()
    And the Bard eats 1 cookie                            # FeatureContext::theBardEatsCookie()
    Then the Bard is mysteriously on fire                 # FeatureContext::theBardIsMysteriouslyOnFire()

1 scenario (1 passed)
3 steps (3 passed)
0m0.01s (10.59Mb)

Behat mit Mink erweitern

Mink bietet eine Schnittstelle für MinkContext (wie Goutte und Selenium) sowie einen MinkContext , der bei Erweiterung zusätzliche MinkContext für unsere Schritte bereitstellt.

So installieren Sie Mink (und den Standard-Goutte-Treiber):

$ composer require --dev behat/mink-extension="^2.0"
$ composer require --dev behat/mink-goutte-driver="^1.0"

Dann erweitern Sie Ihren Kontext mit MinkContext :

<?php
use Behat\MinkExtension\Context\MinkContext;

class FeatureContext extends MinkContext … {
    …
}

Sie können die gesamte Liste der in Ihrer Behat-Installation verfügbaren Syntax mit dem folgenden Befehl anzeigen:

$ ./vendor/bin/behat -dl

Given /^(?:|I )am on "(?P<page>[^"]+)"$/
 When /^(?:|I )reload the page$/
 When /^(?:|I )move backward one page$/
 When /^(?:|I )move forward one page$/
 When /^(?:|I )press "(?P<button>(?:[^"]|\\")*)"$/
 When /^(?:|I )follow "(?P<link>(?:[^"]|\\")*)"$/
 When /^(?:|I )fill in "(?P<field>(?:[^"]|\\")*)" with "(?P<value>(?:[^"]|\\")*)"$/

Sie müssen dann Mink konfigurieren, um anzugeben, wo sich die zu testende Website befindet und welche Web-Treiber verwendet werden sollen (standardmäßig Goutte):

# ./behat.yml
default:
    extensions:
        Behat\MinkExtension:
            base_url: "[your website URL]"
            sessions:
                default:
                    goutte: ~

Hier ist ein Beispiel eines Szenarios, das nur die von Mink bereitgestellten Schritte verwendet:

# ./features/Authentication.feature
Feature: Authentication
    As a security conscious developer I wish to ensure that only valid users can access our website.

    Scenario: Login in successfully to my website
        When I am on "/login"
        And I fill in "email" with "[email protected]"
        And I fill in "password" with "my_password"
        And I press "Login"
        Then I should see "Successfully logged in"

    Scenario: Attempt to login with invalid credentials
        When I am on "/login"
        And I fill in "email" with "[email protected]"
        And I fill in "password" with "not_my_password"
        And I press "Login"
        Then I should see "Login failed"

Sie können dies jetzt testen, indem Sie die Funktion über Behat ausführen:

./vendor/bin/behat features/Authentication.feature

Sie können Ihre eigenen Schritte mit MinkContext für allgemeine Schritte erstellen (zum Beispiel das Anmelden ist ein sehr üblicher Vorgang):

Feature: Authentication
    As a security conscious developer I wish to ensure that only valid users can access our website.

    Scenario: Login in successfully to my website
        Given I login as "[email protected]" with password "my_password"
        Then I should see "Successfully logged in"

    Scenario: Attempt to login with invalid credentials
        Given I login as "[email protected]" with password "not_my_password"
        Then I should see "Login failed"

Sie müssen Ihre Kontextdatei mit MinkContext , um Zugriff auf die MinkContext und Seiteninteraktionen zu erhalten:

<?php
use Behat\MinkExtension\Context\MinkContext;

class FeatureContext extends MinkContext {
    /**
      * @Given I login as :username with password :password
      */
    public function iLoginAsWithPassword($username, $password) {
        $this->visit("/login");
        $this->fillField("email", $username);
        $this->fillField("password", $password);
        $this->pressButton("Login");
    }
}

Mink bietet auch CSS-Selektoren in den meisten seiner vorbereiteten Aufrufe, mit denen Sie Elemente auf der Seite anhand von Konstrukten wie dieser identifizieren können:

When I click on "div[id^='some-name']"
And I click on ".some-class:first"
And I click on "//html/body/table/thead/tr/th[first()]"

Testen von JavaScript mit Mink und Selen

Wenn wir JavaScript auf einer Website testen möchten, müssen wir etwas mächtigeres als Goutte verwenden (was nur cURL via Guzzle ist). Es gibt verschiedene Optionen wie ZombieJS , Selenium und Sahi . Für dieses Beispiel verwende ich Selenium.

Zuerst müssen Sie die Treiber für Mink installieren:

$ composer require --dev behat/mink-selenium2-driver="^1.2"

Außerdem müssen Sie die JAR-Datei für den Selenium-Standalone-Server herunterladen und starten:

$ java -jar selenium-server-standalone-2.*.jar

Wir müssen Behat auch mitteilen, dass der Selenium-Treiber verwendet wird, wenn wir das @javascript Tag verwenden und den Standalone-Server des Selenium-Servers @javascript .

# ./behat.yml
default:
    # …
    extensions:
        Behat\MinkExtension:
        base_url: "[your website URL]"
        sessions:
            # …
            javascript:
                selenium2:
                    browser: "firefox"
                    wd_host: http://localhost:4444/wd/hub

Dann müssen Sie für jeden Test, den Sie mithilfe der Browser-Emulation ausführen möchten, nur den Tag @javascript (oder @selenium2 @javascript ) am Anfang des Features oder Szenarios hinzufügen.

# ./features/TestSomeJavascriptThing.feature
@javascript # or we could use @selenium2
Feature: This test will be run with browser emulation

Der Test kann dann über Behat (wie jeder andere Test) ausgeführt werden. Der einzige Unterschied ist, wenn der Test ausgeführt wird, sollte auf dem Computer, auf dem der Selenium-Standalone-Server ausgeführt wird, ein Browserfenster angezeigt werden, das die beschriebenen Tests ausführt.

Testdaten einrichten

Beim Funktionstest werden Daten häufig modifiziert. Dies kann dazu führen, dass nachfolgende Läufe der Testsuite fehlschlagen (da sich die Daten möglicherweise vom ursprünglichen Status geändert haben).

Wenn Sie Ihre Datenquelle mithilfe eines ORM oder eines Frameworks eingerichtet haben, das Migration oder Seeding unterstützt (wie Doctrine , Propel , Laravel ), können Sie dies verwenden, um bei jedem Testlauf eine neue Testdatenbank mit Fixture-Daten zu erstellen.

Wenn Sie derzeit keine dieser Methoden (oder gleichwertig) verwenden, können Sie Tools wie Phinx verwenden, um schnell eine neue Testdatenbank einzurichten oder eine vorhandene Datenbank für jeden Testlauf vorzubereiten (bereinigen Sie Testeinträge , setzen Sie die Daten in den ursprünglichen Zustand zurück.) ).

# Install Phinx in your project
$ php composer.phar require robmorgan/phinx

$ php vendor/bin/phinx init
Phinx by Rob Morgan - https://phinx.org. version x.x.x
Created ./phinx.xml

Fügen Sie Ihre Datenbankanmeldeinformationen zu ./phinx.xml .

$ php vendor/bin/phinx create InitialMigration

Sie können angeben, wie Ihre Datenbanktabellen mit der in der Dokumentation bereitgestellten Syntax erstellt und gefüllt werden.

Dann führen Sie jedes Mal, wenn Sie Ihre Tests ausführen, ein Skript wie folgt aus:

#!/usr/bin/env bash

# Define the test database you'll use
DATABASE="test-database"

# Clean up and re-create this database and its contents
mysql -e "DROP DATABASE IF EXISTS $DATABASE"
mysql -e "CREATE DATABASE $DATABASE"
vendor/bin/phinx migrate

# Start your application using the test database (passed as an environment variable)
# You can access the value with $_ENV['database']
database=$DATABASE php -d variables_order=EGPCS -S localhost:8080

# Run your functional tests
vendor/bin/behat

Jetzt sollten Ihre Funktionstests nicht aufgrund von Datenänderungen fehlschlagen.

E-Mails erfassen

Funktionstests können auch Testprozesse umfassen, die Ihre Umgebung verlassen, z. B. externe API-Aufrufe und E-Mails.

Stellen Sie sich zum Beispiel vor, Sie testen den Registrierungsprozess für Ihre Website funktional. Der letzte Schritt dieses Prozesses besteht darin, eine E-Mail mit einem Aktivierungslink zu senden. Bis dieser Link besucht wird, ist das Konto nicht vollständig registriert. Sie möchten beide testen:

  1. Dass die E-Mail korrekt gesendet wird (Formatierung, Platzhalterersetzung usw.) und
  2. Dass der Aktivierungslink funktioniert

Jetzt können Sie das Senden der E-Mail testen, aber die IMail- oder POP-Clients zum Abrufen der gesendeten E-Mails aus dem Postfach verwenden. Dies bedeutet jedoch, dass Sie auch Ihre Internetverbindung, den Remote-E-Mail-Server und alle Probleme prüfen, die bei der Zustellung auftreten können (Spam-Erkennung) zum Beispiel).

Eine einfachere Lösung ist die Verwendung eines lokalen Dienstes, der ausgehende SMTP-Verbindungen abfängt und die gesendete E-Mail auf die Festplatte speichert.

Einige Beispiele sind:

smtp-sink - Ein Hilfsprogramm, das im Lieferumfang von Postfix enthalten ist.

# Stop the currently running service
sudo service postfix stop

# Dumps outgoing emails to file as "day.hour.minute.second"
smtp-sink -d "%d.%H.%M.%S" localhost:2500 1000

# Now send mails to your local SMTP server as normal and they will be
# dumped to raw text file for you to open and read

# Run your functional tests
vendor/bin/behat

Vergessen Sie nicht, smtp-sink zu smtp-sink und anschließend den Postfix-Dienst neu zu starten:

# Restart postfix
sudo service postfix start

FakeSMTP - Ein Java-basierter Client, der ausgehende E-Mails abfängt

# -b = Start without GUI interface
# -o = Which directory to dump your emails to
$ java -jar fakeSMTP.jar -b -o output_directory_name

Alternativ können Sie einen Remote-Dienst verwenden, der diesen Dienst wie Mailtrap bereitstellt. Die Prüfung ist jedoch vom Internetzugang abhängig.

Installation oder Setup

Behat / Mink

Mit composer installieren (für andere Methoden überprüfen) behat.org Wenn Sie Linux verwenden, stellen Sie sicher, dass Sie php-curl installiert haben (normale Curl-Installation funktioniert nicht).

Linux

sudo apt-get install php5-curl

Wenn Sie Windows verwenden , stellen Sie sicher, dass PHP, Curl und Git installiert sind. Sie finden diese unter folgenden Links:

Ihr composer.json würde folgendes enthalten:

behat - composer.json

{
  "require": {
    "behat/behat": "dev-master",
    "behat/mink": "dev-master",
    "behat/mink-extension": "dev-master",
    "behat/mink-selenium2-driver": "dev-master",
    "phpunit/php-code-coverage": "dev-master",
    "phpunit/phpunit-mock-objects": "dev-master",
    "phpunit/phpunit": "dev-master"
  },
  "minimum-stability": "dev",
  "config": {
    "bin-dir": "bin/"
  }
}

(Wenn Sie die composer.json-Datei in Windows speichern, müssen Sie "All files" als Dateityp und "ANSI" -Codierung auswählen.)

Führen Sie anschließend die folgenden Befehle aus:

$ curl http://getcomposer.org/installer | php
$ php composer.phar install

Nach diesem Behat werden Mink und Behat-Mink-Erweiterung installiert, um Behat auszuführen

Behat ausführen

$ bin/behat

Um die Behat-Mink-Erweiterung zu aktivieren, verwenden Sie: behat.yml Erstellen Sie eine Datei "behat.yml" mit folgendem Inhalt

behat.yml

default:
  suites:
    default:
      paths:
        features: %paths.base%/features/
        bootstrap: %paths.base%/features/bootstrap/
      contexts: 
        - FeatureContext
  extensions:
    Behat\MinkExtension:
      base_url: 'http://www.startTestUrl.de'
      selenium2:
        browser: firefox
        wd_host: "http://localhost:4444/wd/hub"

Diese Datei befindet sich in demselben Verzeichnis, in dem sich das bin-Verzeichnis und der Link zu behat befindet.
Beachten Sie auch, dass in der Yml-Datei keine Registerkarten zum Einrücken verwendet werden. Leerzeichen verwenden. Um eine Liste der in behat-mink verfügbaren Befehle zu erhalten, verwenden Sie

$ bin/behat -di

Machen Sie sich einen Teil Ihres Systems

Linux

Gehen Sie zu Ihrem Homedirectory und tun Sie Folgendes:

$ sudo vi .bashrc

Fügen Sie diese Zeilen am Ende des Verzeichnisses hinzu

export BEHAT_HOME=/home/*user*/path/to/behat
export PATH=$BEHAT_HOME/bin:$PATH

Starten Sie die Konsole neu oder geben Sie "source.bashrc" ein.

Windows

Gehen Sie die Systemeinstellungen durch und fügen Sie den Pfad zu behat / bin den Umgebungsvariablen hinzu

Andere Treiber über Treiber wie Selenium, Phantomjs, Goutte usw. müssen ebenfalls installiert werden.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow