kenjis/ci-phpunit-test

使用PHPUnit与CodeIgniter 3.x更简单的方式

v3.0.4 2022-12-26 04:22 UTC

README

Latest Stable Version Total Downloads Latest Unstable Version License

Scrutinizer Code Quality Coverage Status Build Status

警告

强烈建议升级到CodeIgniter4.

使用CodeIgniter 3.x与PHPUnit更简单的方式。

  • 无需修改CodeIgniter核心文件。
  • 可以轻松编写控制器测试。
  • 几乎没有什么是不可以测试的。
  • 文档齐全。

Screenshot: Running tests on NetBeans 8.1

要求

  • PHP 7.3或更高版本
    • 如果您使用Monkey Patching,您必须将PHP-Parser 4.2或更高版本作为Composer依赖项使用。
  • CodeIgniter 3.x
    • 如果您想升级到CodeIgniter4,请参阅#361
  • PHPUnit 9.3或更高版本
    • 如果您想使用PHPUnit 9.2或更早版本,请使用ci-phpunit-test 2.x

可选

  • NetBeans
    • 转到项目属性 > 测试 > PHPUnit,勾选使用自定义测试套件复选框,并选择application/tests/_ci_phpunit_test/TestSuiteProvider.php

变更日志

查看变更日志

目录结构

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/

安装

手动安装

  1. https://github.com/kenjis/ci-phpunit-test/releases下载最新的ci-phpunit-test
  2. 解压并将application/tests文件夹复制到CodeIgniter项目的application文件夹中。

就是这样。

Composer安装

$ cd /path/to/codeigniter/
$ composer require kenjis/ci-phpunit-test:^3.0 --dev

并运行install.php

$ php vendor/kenjis/ci-phpunit-test/install.php --from-composer
  • 上述命令始终会覆盖现有文件。
  • 您必须在CodeIgniter项目根目录下运行它。
  • 如果您使用自定义文件夹路径,可以使用选项参数指定您的applicationpublic文件夹。
$ php vendor/kenjis/ci-phpunit-test/install.php -a <application_dir> -p <public_dir> -t <unittest_dir>

所以默认情况下会是

$ php vendor/kenjis/ci-phpunit-test/install.php -a application -p public -t application/tests
  • 但是某些路径可能不正确,在这种情况下,请在tests/Bootstrap.php中修复它们。

升级

手动升级

  1. https://github.com/kenjis/ci-phpunit-test/releases下载最新的ci-phpunit-test
  2. 解压并替换application/tests/_ci_phpunit_test文件夹。
  3. 阅读变更日志

Composer升级

$ cd /path/to/codeigniter/
$ composer update kenjis/ci-phpunit-test

阅读变更日志

如果您想删除application/test/_ci_phpunit_test/

如果您是从创建了一个application/test/_ci_phpunit_test目录的ci-phpunit-test旧版本升级,现在想直接从Composer使用ci-phpunit-test,您需要执行一些额外的步骤

  1. 删除旧的测试库目录
    $ rm -rf /path/to/codeigniter/application/tests/_ci_phpunit_test
  2. 编辑application/tests/Bootstrap.php文件。在“设置主路径常量”部分的底部,添加以下内容
    define('CI_PHPUNIT_TESTPATH', implode(
        DIRECTORY_SEPARATOR,
        [dirname(APPPATH), 'vendor', 'kenjis', 'ci-phpunit-test', 'application', 'tests', '_ci_phpunit_test']
    ).DIRECTORY_SEPARATOR);
    并将任何对__DIR__ . '/_ci_phpunit_test/'TESTPATH . '_ci_phpunit_test'的引用替换为CI_PHPUNIT_TESTPATH . '。(例如,__DIR__ . '/_ci_phpunit_test/CIPHPUnitTest.php'将变为CI_PHPUNIT_TESTPATH . '/CIPHPUnitTest.php'。)

如何运行测试

在运行测试之前,您需要安装PHPUnit。

如果您使用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]

要生成覆盖率报告,需要Xdebug。

运行单个测试

如果您想运行单个测试用例文件

$ vendor/bin/phpunit -c application/tests/ application/tests/models/Category_model_test.php

如何编写测试

例如,对于Inventory_model的测试用例类如下所示

<?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);
    }
}

例如,对于Welcome控制器的测试用例类如下所示

<?php

class Welcome_test extends TestCase
{
    public function test_index()
    {
        $output = $this->request('GET', 'welcome/index');
        $this->assertStringContainsString(
            '<title>Welcome to CodeIgniter</title>', $output
        );
    }
}

详见编写测试指南获取详细信息。

函数/类参考

详见函数和类参考

技巧

详见技巧

独立包

以下独立包中包含了ci-phpunit-test的一些功能。

与CodeIgniter 3.x相关的项目