Edited at

behat 3.0とJenkins CIでBDDに挑戦(5)

More than 1 year has passed since last update.

関連記事:

ここ数か月ほど進化が止まっていたbehatだが、

漸くJenkins CIへの対応が可能になったようだ。

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 余談はここから ↓-------------------


behat3Jenkins Ci

behat3のバージョンは3.0.15で(2015/03/24現在)それ以降は動作が変わる可能性があります。

Continuous Integration(CI, 継続的インテグレーション?)という言葉はご存じだろうか。

テストを絶え間なくやる(継続)ことで品質を維持する手法ということになるだろうか。

すでに完成しているシステムがあったとして、

その内容を修正すると一つの問題は解決しても別の場所で問題が発生することがある。

それを防ぐためにテストを常にし続けて問題の発見につなげるということだ。

テストには内部テスト(PHPUnitみたいやなやつ)と外部テスト(behat)と両方該当する。

behatのように外部テストに最適なツールにはこのCIには最適だろうと思う。

CIで用いられる代表的なツールがJenkins CIだ。

これとbehatの組み合わせを考えていく。

Jenkins CIにはプラグインでJUnitフォーマットを読み込む仕組みが存在するので、

behat側でJUnit形式で出力すれば組み込みは可能なはずだ。

behat2には各種フォーマットで出力する機能が標準装備されている。

Jenkins CIに対応しようと思えばコマンドラインにパラメータを追加するだけでよかったのだが、

何故かbehat3にはそのシステムが削除されている。

オワタ━\(^o^)/━( ゚∀)━(  ゚)━(゚  )━(∀゚ )━\(^o^)/━!!

では対応は無理かと思ったが、

そこは捨てる神あれば拾う神あり。

対応している素敵な人がいた。

https://github.com/Behat/Behat/pull/676

待っている人がやはり多かったようでコメントはいいねの嵐だ。

2015/3/22時点でマージされていたので、

これを使えばJenkins CIにも対応できそうだ。

------------------- ↑ 余談はここまで ↑-------------------

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 本題はここから ↓-------------------


behat3のインストール

毎度毎度、ゼロからインストールしていているのは、

検索からこの記事に直接来たときでも問題ないようにするためで、

必要なければ読み飛ばしてもらっていい。


composerのインストール

$ curl http://getcomposer.org/installer | php  # composerのダウンロード

$ php composer.phar init -n # composer.jsonの生成
$ php composer.phar config bin-dir "bin/" # binディレクトリ指定
$ php composer.phar install # venderディレクトリ生成
$ php composer.phar require "behat/behat=*@dev" "behat/mink=*@dev" "behat/mink-extension=*@dev" "behat/mink-browserkit-driver=*@dev" "behat/mink-goutte-driver=*@dev" "behat/mink-selenium2-driver=*@dev" --prefer-dist # 各種インストール


インストール確認

$ ./bin/behat --version

behat version 3.0-dev


behat3の設定

behatのプロジェクトを初期化する。

featuresディレクトリが新規に作成され必要なファイルが生成される。

$ ./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


サンプル実行

mink-extension内にあるサンプルを実行する。

Wikipediaで検索する的な内容。

$ cp ./vendor/behat/mink-extension/features/search.feature ./features/

$ cp ./vendor/behat/mink-extension/behat.yml.dist ./behat.yml
$ ./bin/behat
Feature: Search
In order to see a word definition
As a website user
I need to be able to search for a word

Scenario: Searching for a page that does exist # features\search.feature:6
Given I am on "/wiki/Main_Page" # Behat\MinkExtension\Context\MinkContext::visit()
When I fill in "search" with "Behavior Driven Development" # Behat\MinkExtension\Context\MinkContext::fillField()
And I press "searchButton" # Behat\MinkExtension\Context\MinkContext::pressButton()
Then I should see "agile software development" # Behat\MinkExtension\Context\MinkContext::assertPageContainsText()

Scenario: Searching for a page that does NOT exist # features\search.feature:12
Given I am on "/wiki/Main_Page" # Behat\MinkExtension\Context\MinkContext::visit()
When I fill in "search" with "Glory Driven Development" # Behat\MinkExtension\Context\MinkContext::fillField()
And I press "searchButton" # Behat\MinkExtension\Context\MinkContext::pressButton()
Then I should see "Search results" # Behat\MinkExtension\Context\MinkContext::assertPageContainsText()

2 scenarios (2 passed)
8 steps (8 passed)
0m1.98s (15.81Mb)


Jenkins CI対応

Jenkins CIでも読み込めるようにJUnitフォーマットで出力する

$ ./bin/behat --format=junit --out=.

$ cat defautl.xml
<?xml version="1.0" encoding="UTF-8"?>
<testsuites name="default">
<testsuite name="Search" tests="2" skipped="0" failures="0" errors="0">
<testcase name="Searching for a page that does exist" status="passed"></testcase>
<testcase name="Searching for a page that does NOT exist" status="passed"></testcase>
</testsuite>
</testsuites>

outで指定したディレクトリにxmlファイルが出力される。


Jenkins CIのプロジェクト登録

インストールが完了すれば出力ディレクトリにxmlファイルが作成されるので、

それをJenkins CIに登録する

プロジェクト作成

jenkins_phpcs01.PNG

ビルド設定

jenkins_phpcs02.PNG

------------------- ↑ 本題はここまで ↑-------------------

ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪

------------------- ↓ 補足はここから ↓-------------------

Jenkins CIは深掘りするときりがないので別の機会にやるとして、

現状Jenkins CIbehat3との組み合わせをどう運用しているかを箇条書きにしてみると


  • ページの死活確認

  • ログイン後ページの死活確認

  • ページのリンク切れ確認

  • SEOのテキスト確認

  • UserAgentの挙動確認

  • WebAPIの動作保証

もちろん本番環境にかけている。