behat チュートリアル
あなたと一緒に始めましょう
サーチ…
備考
このセクションでは、動作の概要と、開発者がそれを使用する理由について概要を説明します。
それはまた、behat内の任意の大きな科目に言及し、関連トピックにリンクする必要があります。ドキュメントは新しいものなので、これらの関連トピックの初期バージョンを作成する必要があります。
ユーザーストーリーとしての機能テスト
機能テストは、ユーザーストーリーのテストとして最もよく記述されています。あなたが通常次のパターンに従う前にユーザーのストーリーを扱っていれば:
As a [role], I want to [desire], so that [benefit/desired outcome]
次の例では、このユーザーストーリーを例として使用します。
As a Dungeon Master, I want to ensure harmony and mutual trust, so that
the party can work together as a team
PHPでの機能テストの最も一般的なテストフレームワークは、 BehatとPHPSpecです。
Behatで始まる
Behatは人間が読める形式であるGherkin Syntaxを提供しています。ユーザーのストーリーを簡単に記述することができます。
Behatを使い始めるには、Composerでインストールし、テストファイルを初期化する必要があります:
$ 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
デフォルトでは、テストファイルはfeatures/
フォルダーに配置され、拡張子は.feature
です。
各テストファイルは、アプリケーションの特定の機能を定義する必要があります。機能は一連のシナリオに分類され、シナリオが正常に実行されるために必要な一連のステップが含まれています。各シナリオは、通過するフィーチャを渡す必要があります。
# 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
テストを実行するには、Behatバイナリを直接実行します。実行するフィーチャー・ファイルをオプションで指定できます(それ以外の場合はすべてのテストが実行されます)。このフィーチャファイルは、定義されていないステップエラーで失敗します(これらのステップの意味を定義していないためです)。
$ ./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();
}
シナリオの各ステップは、コンテキストPHPファイルからコードの一部を実行します(さまざまな機能テストで異なるコンテキストを読み込むことができます)。 Behatが提案した例をコピーしたり、独自のものを作成することができます。このステップは、正規表現チェックと照合されます。したがって、我々が実装するなら
<?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()
);
}
}
PHPUnit_Framework_Assert
の使用に気づくでしょう。 Behatはそれ自身のアサートシステムを持っていないので、あなたが望むものを使うことができます。
テストを実行すると実際のコードが実行され、すべてが成功するかどうかテストできます:
$ ./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)
MinkとBehatを拡張する
Minkは、Webドライバ(GoutteやSeleniumなど)と拡張されたMinkContext
を提供し、追加のWeb言語を提供します。
Mink(およびデフォルトのGoutteドライバ)をインストールするには:
$ composer require --dev behat/mink-extension="^2.0"
$ composer require --dev behat/mink-goutte-driver="^1.0"
次に、 MinkContext
コンテキストを拡張します。
<?php
use Behat\MinkExtension\Context\MinkContext;
class FeatureContext extends MinkContext … {
…
}
Behatのインストールで利用できる構文の一覧は、次のコマンドで確認できます。
$ ./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>(?:[^"]|\\")*)"$/
次に、テストするWebサイトの場所と、使用するWebドライバ(デフォルトではGoutte)を示すようにMinkを設定する必要があります。
# ./behat.yml
default:
extensions:
Behat\MinkExtension:
base_url: "[your website URL]"
sessions:
default:
goutte: ~
ここでは、Mink提供の手順のみを使用したシナリオの例を示します。
# ./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"
Behatを使用してこの機能を実行することでこれをテストすることができます:
./vendor/bin/behat features/Authentication.feature
一般的な手順については、 MinkContext
を使用して独自のステップを作成できます(ログインは非常に一般的な操作です)。
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"
Webドライバとページのやり取りにアクセスするには、コンテキストファイルをMinkContext
拡張する必要があります:
<?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はまた、CSSのセレクタを提供しています。これは、あらかじめ用意されているコールのほとんどで、次のような構文を使用してページ上の要素を識別できます。
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()]"
MinkとSeleniumによるJavaScriptのテスト
ウェブサイトでJavaScriptをテストしたい場合は、Goutte(Guzzle経由のcURL)よりも少し強力なものを使用する必要があります。以下のようなオプションがいくつかありますZombieJS 、 セレンおよびSahiは 。この例では、Seleniumを使用します。
まず、Mink用のドライバをインストールする必要があります:
$ composer require --dev behat/mink-selenium2-driver="^1.2"
また、 Seleniumスタンドアロンサーバーの jarファイルをダウンロードして起動する必要があります。
$ java -jar selenium-server-standalone-2.*.jar
また、 @javascript
タグを使用してSeleniumドライバを使用し、Seleniumスタンドアロンサーバーの場所を指定するときにBehatに伝える必要があります。
# ./behat.yml
default:
# …
extensions:
Behat\MinkExtension:
base_url: "[your website URL]"
sessions:
# …
javascript:
selenium2:
browser: "firefox"
wd_host: http://localhost:4444/wd/hub
次に、ブラウザのエミュレーションを使用して実行するテストごとに、フィーチャまたはシナリオの先頭に@javascript
(または@selenium2
)タグを追加するだけです。
# ./features/TestSomeJavascriptThing.feature
@javascript # or we could use @selenium2
Feature: This test will be run with browser emulation
テストはBehatを介して実行できます(他のテストと同様)。 1つの違いは、テストが実行されるときに、Seleniumスタンドアロンサーバーを実行しているコンピュータにブラウザウィンドウを生成して、テストを実行することです。
テストデータの設定
機能テストでは、データが修正されることがよくあります。これにより、テストスイートのその後の実行が失敗する可能性があります(データが元の状態から変更された可能性があるため)。
Doctrine 、 Propel 、 Laravelのような移行またはシードをサポートするORMまたはフレームワークを使用してデータソースをセットアップした場合は、これを使用して、各テスト実行時にFixtureデータを含む新しいテストデータベースを作成できます。
現在のところ、これらのもの(または同等のもの)を使用していない場合は、 Phinxのようなツールを使用して新しいテストデータベースをすばやくセットアップしたり、テスト実行ごとに既存のデータベースを準備したりできます(テストエントリのクリーンアップ、元の状態)。
# 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
./phinx.xml
データベース資格情報を追加します。
$ php vendor/bin/phinx create InitialMigration
ドキュメントに記載されている構文を使用して、データベース表の作成方法と投入方法を指定できます。
次に、テストを実行するたびに、次のようなスクリプトを実行します。
#!/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
今度は、データ変更のために機能テストが失敗しないようにしてください。
電子メールのキャプチャ
機能テストには、外部API呼び出しや電子メールなど、環境から離れたプロセスのテストも含まれます。
たとえば、あなたのウェブサイトの登録プロセスを機能的にテストしているとします。このプロセスの最後のステップでは、アクティベーションリンク付きの電子メールを送信します。このリンクが訪問されるまで、アカウントは完全に登録されていません。両方をテストしたいと思うでしょう:
- 電子メールが正しく送信されること(書式設定、プレースホルダーの置き換えなど)
- アクティベーションリンクが動作すること
メールの送信をテストできますが、IMAPまたはPOPクライアントを使用してメールボックスから送信された電子メールを取得することもできますが、インターネット接続、リモート電子メールサーバー、配信中に発生する可能性のある問題例えば)。
より簡単な解決策は、送信SMTP接続をトラップし、送信された電子メールをディスクにダンプするローカルサービスを使用することです。
いくつかの例があります:
smtp-sink - Postfixにバンドルされているユーティリティプログラム。
# 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
smtp-sink
をkillして後でpostfixサービスを再起動することを忘れないでください:
# Restart postfix
sudo service postfix start
FakeSMTP - 送信メールをトラップするJavaベースのクライアント
# -b = Start without GUI interface
# -o = Which directory to dump your emails to
$ java -jar fakeSMTP.jar -b -o output_directory_name
あるいは、 メールトラップのようなサービスを提供するリモートサービスを使用することもできますが、テストはインターネットアクセスに依存します。
インストールまたはセットアップ
ビート/ミンク
作者を使ってインストールする(他の方法のためにチェックする)behat.org linuxを使用している場合は、php-curlをインストールしていることを確認してください(通常のカールインストールは動作しません)
Linux
sudo apt-get install php5-curl
Windowsを使用している場合は、PHP、Curl、Gitがインストールされていることを確認してください。以下のリンクのものを見つけることができます:
- PHP(Xampp): https ://www.apachefriends.org/de/index.html
- Curl: http : //curl.haxx.se/latest.cgi? curl= win64-nossl
- Git: http : //git-scm.com/download/win
あなたのcomposer.jsonには以下が含まれます:
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/"
}
}
(Windowsでcomposer.jsonファイルを保存するときは、「すべてのファイル」をFiletype、「ANSI」コーディングを選択する必要があります)
その後、次のコマンドを実行します。
$ curl http://getcomposer.org/installer | php
$ php composer.phar install
このBehat、Mink、Behat-Minkエクステンションがインストールされた後、behatを実行する
行動を実行する
$ bin/behat
Behat-Mink Extensionを有効にするには:behat.yml次の内容のファイル "behat.yml"を作成します
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"
このファイルはbinディレクトリとbehatへのリンクを含む同じディレクトリにあります。
また、ymlファイルではインデントにタブを使用しないように注意してください。スペースを使用します。 behat-minkで利用可能なコマンドのリストを取得するには、
$ bin/behat -di
あなたのシステムの一部を作る
Linux
あなたのHomedirectoryに行き、以下をしてください:
$ sudo vi .bashrc
そして、この行をディレクトリの最後に追加します
export BEHAT_HOME=/home/*user*/path/to/behat
export PATH=$BEHAT_HOME/bin:$PATH
コンソールを再起動するか、 "source .bashrc"と入力してください。
Windows
Systemsettingsを実行し、環境変数にbehat / binのパスを追加します
その他のドライバセレン、phantomjs、goutteなどのドライバは、あまりにもインストールする必要があります。