[!WARNING] Upgrading to CodeIgniter4 is strongly recommended.
An easier way to use PHPUnit with CodeIgniter 3.x.
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/
ci-phpunit-test
from https://github.com/kenjis/ci-phpunit-test/releases.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
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
ci-phpunit-test
from https://github.com/kenjis/ci-phpunit-test/releases.application/tests/_ci_phpunit_test
folder.$ 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 use
ci-phpunit-test
from Composer, you have a couple of additional steps:
$ rm -rf /path/to/codeigniter/application/tests/_ci_phpunit_test
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
with
CI_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 MB
OK (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:
<?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.
See Function and Class Reference.
See Tips.
Some features of ci-phpunit-test are available in the following standalone packages.