Using Codeception Test with CodeIgniter
- PHP >= 5.3
- PHP CURL extension enabled
- Windows 7
- Server: WAMP (Apache: 2.2.22, PHP 5.3.13, MySql 5.2.24)
- CodeIgniter 2.1.3
- Codeception 1.1.5
เริ่มแรก install codeigniter เข้ามาก่อน (ขอคร่าวๆ เพราะน่าจะติดตั้งได้แล้ว)
เราต้อง test acceptance และ functional test เพราะฉนั้นเราต้องทำให้รัน CodeIgniter ได้จริง (หากติดตั้งไว้แล้ว ให้ข้าม srction นี้ไป)
เริ่มแรกก็ Setup local DNS เพื่อรันผ่าน domainname นิดนึงที่ C:\Windows\System32\drivers\etc\hosts
127.0.0.1 codeigniter-codeception.local
Setup vhost ของ apache
<VirtualHost *:80>
DocumentRoot "C:/wamp/www/codeigniter-codeception-test"
ServerName codeigniter-codeception.local
ServerAlias codeigniter-codeception.local
</VirtualHost>
เมื่อ setup แล้ว ก็ restart จากนั้นก็จะเข้า codeigniter หน้าแรกได้
การติดตั้งแบบอื่นยากหมด ให้ติดตั้งด้วยการ load codecept.phar มาใช้งานจะดีและเร็วที่สุด
เราจะติดตั้งด้วยการ load phar มาใช้งาน โดยเข้าไปที่ http://codeception.com/install แล้วเลือก download executable มาใช้งาน
เอาไปวางที่ project ของเรา จากนั้นลอง run ด้วยคำสั่ง
php codecept.phar
ก็จะได้ผลแบบนี้
C:\wamp\www\codeigniter-codeception-test>php codecept.phar
Codeception version 1.1.5
Usage:
[options] command [arguments]
Options:
--help -h Display this help message.
--quiet -q Do not output any message.
--verbose -v Increase verbosity of messages.
--version -V Display this application version.
--ansi Force ANSI output.
--no-ansi Disable ANSI output.
--no-interaction -n Do not ask any interactive question.
Available commands:
analyze Analyzes for non-existent methods and adds them to corresponding helper
bootstrap Initializes empty test suite and default configuration file
build Generates base classes for all suites
help Displays help for a command
list Lists commands
run Runs the test suites
generate
generate:cept Generates empty Cept file in suite
generate:cest Generates empty Cest file in suite
generate:scenarios Generates text representation for all scenarios
generate:suite Generates new test suite
generate:test Generates empty PHPUnit Test file in suite
เราต้องการ config ในการ test โดยเราไม่ต้องเขียนขึ้นมาเองให้ใช้ command นี้
php codecept.phar bootstrap
เราจะได้ test suit ออกมา อยู่ใน folder test ออกมาเป็น test 3 ส่วนคือ
- unit test
- functional
- acceptance
หากเราต้องการจะรันดูว่า test ว่างๆผ่านรึเปล่า เราก็จะเห็น error ทันที เพราะเรายังไม่ได้ config อะไรเลย เริ่มแรกให้เราไป config ก่อนว่า app ของเรารันอยูที่ domain ใหน โดยเราไป config
/codeigniter-codeception-test/tests/acceptance.suite.yml
ใส่ domain ที่เรา set vhost ลงไป หรือถ้าไม่ set vhost ก็ใส่ local path ลงไปให้ถูก
# Codeception Test Suite Configuration
# suite for acceptance tests.
# perform tests in browser using the Selenium-like tools.
# powered by Mink (http://mink.behat.org).
# (tip: that's what your customer will see).
# (tip: test your ajax and javascript by one of Mink drivers).
# RUN `build` COMMAND AFTER ADDING/REMOVING MODULES.
class_name: WebGuy
modules:
enabled:
- PhpBrowser
- WebHelper
config:
PhpBrowser:
url: 'http://codeigniter-codeception.local/'
จากนั้นลอง run empty test
php codecept.phar run
Error จะหายไป และสามารถ test ผ่าน :)
เป็น command สำหรับ generate script 5 ตัวเพื่อช่วยในการเขียน test ให้เร็วขึ้น (นิสนึง)
- generate:cept suite filename - Generates a sample Cept scenario.
- generate:cest suite filename - Generates a sample Cest test.
- generate:test suite filename - Generates a sample PHPUnit Test.
- generate:suite suite guy - Generates a new suite with the given Guy class name.
- generate:scenarios suite - Generates text files containing scenarios from tests.
เราต้องการให้ functional test รัน phoBrowser ได้ เราจะเข้าไปเพิ่มใน config (ปกติ framework ใหญ่ๆจะ test controller ได้เลย แต่ codeigniter ไม่ได้ ต้อง test ผ่าน browser แทน)
/codeigniter-codeception-test/tests/functional.suite.yml
แก้ไปคล้ายๆกับ acceptance
# Codeception Test Suite Configuration
# suite for functional (integration) tests.
# emulate web requests and make application process them.
# (tip: better to use with frameworks).
# RUN `build` COMMAND AFTER ADDING/REMOVING MODULES.
class_name: TestGuy
modules:
enabled:
- PhpBrowser
- WebHelper
- Filesystem
- TestHelper
config:
PhpBrowser:
url: 'http://codeigniter-codeception.local/'
หากเราปรับเรื่อง module ไป อย่าลืมรัน build ใหม่ด้วยนะ
php codecept.phar build
เราจะสั่งเกตว่า file /codeigniter-codeception-test/tests/functional/TestGuy.php
ใน จะมี PhpBrowser ร่วมมาใช้งาน
<?php
// This class was automatically generated by build task
// You can change it manually, but it will be overwritten on next build
use Codeception\Maybe;
use Codeception\Module\PhpBrowser;
use Codeception\Module\WebHelper;
use Codeception\Module\Filesystem;
use Codeception\Module\TestHelper;
....
....
....
....
....
และมี function หลายๆตัวเข้ามาใช้งานเช่น amOnPage, see เป็นต้น
เราจะ test hompage ว่ามี welcome text หรือเปล่า โดยสร้าง functional test ขึ้นมาด้วยคำสั่ง
php codecept.phar generate:test functional hompage
จะได้ file /codeigniter-codeception-test/tests/functional/homepageTest.php
จากนั้นเพิ่ม function สำหรับ test hompage เข้าไป
public function testOpenHomepage(){
$I = $this->testGuy;
$I->amOnPage('/');
$I->see('Welcome to CodeIgniter!', 'h1');
$I->see('application/views/welcome_message.php', 'code');
$I->see('application/controllers/welcome.php', 'code');
$I->seeLink('User Guide', 'user_guide/');
}
เแล้วลอง run
C:\wamp\www\codeigniter-codeception-test>php codecept.phar run
Codeception PHP Testing Framework v1.1.5
Powered by PHPUnit 3.7.8 by Sebastian Bergmann.
Suite acceptance started
Suite functional started
Trying to test open homepage (hompageTest::testOpenHomepage) - Ok
Suite unit started
Time: 1 second, Memory: 10.50Mb
OK (1 test, 4 assertions)
ดูให้ดีว่า php.ini อยู่ใหน เพราะ php cli กับ web อาจจะคนละตัวกันก็ได้
หากเจอว่า
PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Bangkok' for 'ICT/7.0/no DST' instead in phar:///Users/songpol/workspaces/gopress/codecept.phar/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php on line 42
PHP Warning: date_default_timezone_get(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Bangkok' for 'ICT/7.0/no DST' instead in phar:///Users/songpol/workspaces/gopress/codecept.phar/vendor/monolog/monolog/src/Monolog/Logger.php on line 112
ให้เข้าไปใน php.ini โดยใส่ zone ที่ทำงานอยู่
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "UTC"
ได้แล้ว เรียบร้อย :)