Warning
Upgrading to CodeIgniter4 is strongly recommended.
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.
PHP 7.3 or later
If you use Monkey Patching, you must use PHP-Parser 4.2 or later as a Composer dependency.
CodeIgniter 3.x
If you want to upgrade to CodeIgniter4, see #361.
PHPUnit 9.3 or later
If you want to use PHPUnit 9.2 or earlier, please use ci-phpunit-test 2.x.
NetBeans
Go to Project Properties > Testing > PHPUnit, check Use Custom Test Suite checkbox, and select application/tests/_ci_phpunit_test/TestSuiteProvider.php
.
See Change Log.
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/
Download latest ci-phpunit-test
from https://github.com/kenjis/ci-phpunit-test/releases.
Unzip and copy application/tests
folder into your application
folder in CodeIgniter project.
That's it.
$ 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
and public
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.
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.
$ cd /path/to/codeigniter/$ composer update kenjis/ci-phpunit-test
Read Change Log.
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 useci-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/
or TESTPATH . '_ci_phpunit_test
withCI_PHPUNIT_TESTPATH . '
. (So, for example, __DIR__ . '/_ci_phpunit_test/CIPHPUnitTest.php'
would become CI_PHPUNIT_TESTPATH . '/CIPHPUnitTest.php'
.)
You need to install PHPUnit before running tests.
If you use Composer:
$ composer require phpunit/phpunit --dev
$ cd /path/to/codeigniter/$ vendor/bin/phpunit -c application/tests/PHPUnit 9.5.4 by Sebastian Bergmann and contributors.... 3 / 3 (100%)Time: 00:00.102, Memory: 12.00 MBOK (3 tests, 3 assertions)Generating code coverage report in Clover XML format ... done [00:00.002]Generating code coverage report in HTML format ... done [00:00.012]
To generate coverage report, Xdebug is needed.
If you want to run a single test case file:
$ vendor/bin/phpunit -c application/tests/ application/tests/models/Category_model_test.php
As an example, a test case class for Inventory_model
would be as follows:
<?phpclass 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:
<?phpclass 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.
See Function and Class Reference.
See Tips.
Some features of ci-phpunit-test are available in the following standalone packages.
https://github.com/kenjis/phpunit-helper
https://github.com/kenjis/monkey-patch
CodeIgniter Test Application for ci-phpunit-test
CodeIgniter Composer Installer
Cli for CodeIgniter 3.0
CodeIgniter Simple and Secure Twig
CodeIgniter Doctrine
CodeIgniter Deployer
CodeIgniter3 Filename Checker
CodeIgniter Widget (View Partial) Sample
CodeIgniter3 Namespaced Controller