Skip to content

Instantly share code, notes, and snippets.

@obiconbig
Last active June 27, 2023 09:42
Show Gist options
  • Save obiconbig/5122390 to your computer and use it in GitHub Desktop.
Save obiconbig/5122390 to your computer and use it in GitHub Desktop.
How to use Codeception on CodeIgniter 2.1.x

How to use Codeception on CodeIgniter 2.1.x

Using Codeception Test with CodeIgniter

Requirements

  • PHP >= 5.3
  • PHP CURL extension enabled

Environment

 - Windows 7
 - Server: WAMP (Apache: 2.2.22, PHP 5.3.13, MySql 5.2.24)
 - CodeIgniter 2.1.3
 - Codeception 1.1.5

Installation CodeIgniter

เริ่มแรก install codeigniter เข้ามาก่อน (ขอคร่าวๆ เพราะน่าจะติดตั้งได้แล้ว)

Setup vhost

เราต้อง 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 หน้าแรกได้

Installation Codeception

การติดตั้งแบบอื่นยากหมด ให้ติดตั้งด้วยการ 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

Initialize your testing environment

เราต้องการ config ในการ test โดยเราไม่ต้องเขียนขึ้นมาเองให้ใช้ command นี้

php codecept.phar bootstrap

เราจะได้ test suit ออกมา อยู่ใน folder test ออกมาเป็น test 3 ส่วนคือ

  • unit test
  • functional
  • acceptance

First config

หากเราต้องการจะรันดูว่า 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 ผ่าน :)

Generator Tools

เป็น 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.

I want to functional test on phpBroser

เราต้องการให้ 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 เป็นต้น

First Functional Test

เราจะ 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)

Date time error

ดูให้ดีว่า 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"

ได้แล้ว เรียบร้อย :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment