Modern Testing with Laravel 4
Behavior-Driven Development
簡稱 BDD, 簡單地說就是用一種情境設定的方式來進行開發的過程。
在 Laravel 4 我們需要以下三種組合之一:
- Codeception
- [email protected] and Mink – (optional)
- Selenium2, PhantomJS and Mink – (optional)
Codeception Installation
# 下載 codecept $ wget http://codeception.com/codecept.phar # 初始化 codecept, 它會建立所需的檔案在目前的目錄中的 tests 資料夾 $ php codecept.phar bootstrap
查看有什麼指令可以使用:
php codecept.phar
修改 tests/functional.suite.yml
:
1 2 3 |
class_name: TestGuy modules: enabled: [Laravel4, TestHelper] |
因為我們新增了一個 Laravel4 的 module, 所以讓 Codeception 再次重新建立所需的 Class:
php codecept.phar build
Codeception Usage
建立第一個測試:
php codecept.phar generate:cept acceptance Fisrt
Codeception 會在 tests/acceptance/
下建立一個 FirstCept.php
檔案
內容為:
1 2 |
<?php $I = new WebGuy($scenario); |
First Scenario
- 我要到
/
(網站首頁)。 - 我看到了
Hello World!
這段文字出現在首頁上。
這樣的情境,寫成測試檔就變成如下:
1 2 3 4 5 |
<?php $I = new WebGuy($scenario); $I->wantTo('goto homepage, and see hello word'); $I->amOnPage('/'); $I->see('Hello World!'); |
執行測試:
php codecept.phar run
Zombie.JS and Mink
由於 Codeception 的 PhpBrowser 是基於 PHP Curl 去實現模擬 Browser 的操作, 所以面對一些會有 Javascript 互動的網頁,在測試上就會顯得力不從心。還好 Codeception 提供了 ZombieJS module, 我們可以得到一個更真實的模擬測試。
Zombie.JS
Zombie.JS 是一個 NPM 的 package, 所以在這之前我們必須先安裝好 NPM 的環境。
將 zombie 1.4.1 版安裝到全域環境:
sudo npm install -g [email protected]
2013-06-18 註: 經測試, 目前只能裝 1.4.1 的版本, 版本太新 Mink 不支援.
開啟 ~/.bashrc
, 加上 NODE_PATH
的設定
export NODE_PATH="/usr/local/lib/node_modules"
Mink
在 composer.json
中加入到 require
:
"behat/mink": "1.5.*@dev"
重新更新 composer:
composer update
目前已知問題:
checkOption()
,uncheckOption()
,executeJs()
無作用
Selenium2 and PhantomJS
比起 Zombie.JS, 我更喜歡 PhantomJS, 更穩定且資源豐富. 主要看到官方的一些範例, 真得相當地強大, 甚至可以 Screenshot… (Codeception 用來當發生測試失敗時會將快照存在 log 資料夾, 相當地方便!)
要使用 PhantomJS 當作 Browser, 我們需要 Selenium2 作 driver.
先執行 Selenium2:
java -jar selenium-server-standalone-2.33.0.jar
將會啟動一個 Selenium2 Server, 預設會使用 port 4444
, 如需修改可在後面加上 -port
參數:
java -jar selenium-server-standalone-2.33.0.jar -port 8888
08:17:34.571 INFO - Java: Apple Inc. 20.45-b01-451 08:17:34.572 INFO - OS: Mac OS X 10.7.5 x86_64 08:17:34.584 INFO - v2.33.0, with Core v2.33.0. Built from revision 4e90c97 08:17:34.691 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub 08:17:34.692 INFO - Version Jetty/5.1.x 08:17:34.692 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver] 08:17:34.693 INFO - Started HttpContext[/selenium-server,/selenium-server] 08:17:34.693 INFO - Started HttpContext[/,/] 08:17:34.738 INFO - Started org.openqa.jetty.jetty.servlet.ServletHandler@56d73c7a 08:17:34.738 INFO - Started HttpContext[/wd,/wd] 08:17:34.746 INFO - Started SocketListener on 0.0.0.0:4444 08:17:34.746 INFO - Started org.openqa.jetty.jetty.Server@54cbf30e
接著啟動 PhantomJS 跟 Selenium2 連接:
phantomjs --webdriver=4444
PhantomJS is launching GhostDriver... [INFO - 2013-06-18T00:17:27.627Z] GhostDriver - Main - running on port 4444
然後設定 Codeception 的 tests/acceptance.suite.yml
設定檔, 指定用 Selenium2 module:
1 2 3 4 5 6 7 8 9 |
modules: enabled: [Selenium2] config: Selenium2: url: 'http://starck-macmini' browser: firefox capabilities: unexpectedAlertBehaviour: 'accept' # delay: 500 |
- url (required) – start url for your app
- browser (required) – browser that would be launched
- host – Selenium server host (localhost by default)
- port – Selenium server port (4444 by default)
- delay – To set delay between actions in milliseconds (1/1000 of second) if they run too fast
- capabilities – To set Selenium2 desired capabilities. Should be a key-value array.