ci-phpunit-test for CodeIgniter 3.x
An easier way to use PHPUnit with CodeIgniter 3.x.
- You don’t have to modify CodeIgniter core files at all.
- You can write controller tests easily.
- Nothing is untestable, maybe.
- Well documented.
Requirements
- PHP 7.3 or later
- If you use PHP 7.3 or later and Monkey Patching, you must use PHP-Parser 4.2 or later as a Composer dependency.
- CodeIgniter 3.x
- PHPUnit 9.3 or later
- If you want to use PHPUnit 9.2 or earlier, please use ci-phpunit-test 2.x.
Optional
- NetBeans
- Go to Project Properties > Testing > PHPUnit, check Use Custom Test Suite checkbox, and select
application/tests/_ci_phpunit_test/TestSuiteProvider.php
.
- Go to Project Properties > Testing > PHPUnit, check Use Custom Test Suite checkbox, and select
Change Log
See Change Log.
Folder Structure
codeigniter/
├── application/
│ └── tests/
│ ├── _ci_phpunit_test/ ... don't touch! files ci-phpunit-test uses
│ ├── Bootstrap.php ... bootstrap file for PHPUnit
│ ├── DbTestCase.php ... DbTestCase class
│ ├── TestCase.php ... TestCase class
│ ├── controllers/ ... put your controller tests
│ ├── libraries/ ... put your library tests
│ ├── mocks/
│ │ └── libraries/ ... mock libraries
│ ├── models/ ... put your model tests
│ └── phpunit.xml ... config file for PHPUnit
└── vendor/
Installation
- Download latest
ci-phpunit-test
from https://github.com/kenjis/ci-phpunit-test/releases. - Unzip and copy
application/tests
folder into yourapplication
folder in CodeIgniter project.
That’s it.
Installation via Composer
If you like Composer:
$ cd /path/to/codeigniter/
$ composer require kenjis/ci-phpunit-test:^3.0 --dev
And run install.php
:
$ php vendor/kenjis/ci-phpunit-test/install.php --from-composer
- The above command always overwrites existing files.
- You must run it at CodeIgniter project root folder.
- You can specify your
application
andpublic
folder with option arguments, if you use custom folder paths.
$ php vendor/kenjis/ci-phpunit-test/install.php -a <application_dir> -p <public_dir> -t <unittest_dir>
So the default would be:
$ php vendor/kenjis/ci-phpunit-test/install.php -a application -p public -t application/tests
- But some paths may be not correct, in that case, please fix them in tests/Bootstrap.php.
Upgrading
- Download latest
ci-phpunit-test
from https://github.com/kenjis/ci-phpunit-test/releases. - Unzip and replace
application/tests/_ci_phpunit_test
folder. - Read Change Log.
Upgrading via Composer
If you like Composer:
$ cd /path/to/codeigniter/
$ composer update kenjis/ci-phpunit-test
If you’re upgrading from a previous version of ci-phpunit-test
that created
an application/test/_ci_phpunit_test
directory and now want to directly use
ci-phpunit-test
from Composer, you have a couple of additional steps:
- Delete the old test library directory:
rm -rf /path/to/codeigniter/application/tests/_ci_phpunit_test
- Edit the
application/tests/Bootstrap.php
file. At the bottom of the “set the main path constants” section, add the following:define('CI_PHPUNIT_TESTPATH', implode( DIRECTORY_SEPARATOR, [dirname(APPPATH), 'vendor', 'kenjis', 'ci-phpunit-test', 'application', 'tests', '_ci_phpunit_test'] ).DIRECTORY_SEPARATOR);
And replace any references to
__DIR__ . '/_ci_phpunit_test/
orTESTPATH . '_ci_phpunit_test
withCI_PHPUNIT_TESTPATH . '
. (So, for example,__DIR__ . '/_ci_phpunit_test/CIPHPUnitTest.php'
would becomeCI_PHPUNIT_TESTPATH . '/CIPHPUnitTest.php'
.)
Read Change Log.
How to Run Tests
You have to install PHPUnit before running tests.
Note: You must run phpunit
command in application/tests
folder.
$ cd /path/to/codeigniter/
$ cd application/tests/
$ phpunit
PHPUnit 4.8.31 by Sebastian Bergmann and contributors.
...
Time: 341 ms, Memory: 5.50Mb
OK (3 tests, 3 assertions)
Generating code coverage report in Clover XML format ... done
Generating code coverage report in HTML format ... done
To generate coverage report, Xdebug is needed.
If you want to run a single test case file:
$ phpunit models/Category_model_test.php
How to Write Tests
As an example, a test case class for Inventory_model
would be as follows:
<?php
class Inventory_model_test extends TestCase
{
public function setUp(): void
{
$this->resetInstance();
$this->CI->load->model('Inventory_model');
$this->obj = $this->CI->Inventory_model;
}
public function test_get_category_list()
{
$expected = [
1 => 'Book',
2 => 'CD',
3 => 'DVD',
];
$list = $this->obj->get_category_list();
foreach ($list as $category) {
$this->assertEquals($expected[$category->id], $category->name);
}
}
public function test_get_category_name()
{
$actual = $this->obj->get_category_name(1);
$expected = 'Book';
$this->assertEquals($expected, $actual);
}
}
As an example, a test case class for Welcome controller would be as follows:
<?php
class Welcome_test extends TestCase
{
public function test_index()
{
$output = $this->request('GET', 'welcome/index');
$this->assertStringContainsString(
'<title>Welcome to CodeIgniter</title>', $output
);
}
}
See How to Write Tests for details.
Function/Class Reference
See Function and Class Reference.
Tips
See Tips.