Codeception 是一个强大的 PHP 自动化测试框架,支持多种测试类型,包括单元测试、功能测试、接受测试、API 测试等。它通过简洁的语法、丰富的模块和扩展机制使得测试的编写和执行变得非常方便。在本文中,我们将介绍 Codeception 的基础使用,帮助你快速上手并开始编写和执行自动化测试。

1. 安装 Codeception

1.1 安装 Codeception

你可以通过 Composer 来安装 Codeception:

composer require --dev codeception/codeception

安装完成后,Codeception 会被添加到项目的 vendor 目录中。你可以通过执行以下命令来验证是否成功安装:

./vendor/bin/codecept --version

你将看到 Codeception 的版本信息,确认安装成功。

1.2 安装所需模块

Codeception 提供了多个模块支持不同类型的测试。例如,你可以使用 PhpBrowser 模块进行功能测试,使用 WebDriver 模块进行浏览器自动化测试,或者使用 Db 模块进行数据库测试等。

例如,安装 PhpBrowser 模块来进行功能测试:

composer require --dev codeception/module-phpbrowser

2. 初始化 Codeception 项目

Codeception 提供了一个初始化命令,用来快速生成项目所需的基本文件和配置:

./vendor/bin/codecept bootstrap

该命令会创建一个 tests 目录,目录下包含以下几个子目录:

  • tests/_support:存放辅助类、模块、配置等。
  • tests/_data:存放测试数据。
  • tests/acceptance:接受测试文件夹。
  • tests/functional:功能测试文件夹。
  • tests/unit:单元测试文件夹。

3. 编写测试

Codeception 支持三种主要的测试类型:

  • 单元测试(Unit Test):测试代码中的小单元,通常是函数、方法等。
  • 功能测试(Functional Test):测试系统的某个功能模块,通常不涉及外部依赖。
  • 接受测试(Acceptance Test):模拟用户行为进行端到端测试,通常涉及到用户界面和外部依赖。

3.1 创建单元测试

使用 Codeception 创建一个单元测试文件:

./vendor/bin/codecept generate:test unit ExampleTest

这将会在 tests/unit 目录下生成一个 ExampleTest.php 文件。打开该文件,你将看到一个基础的测试模板:

<?php
namespace Tests\Unit;

use Codeception\Test\Unit;

class ExampleTest extends Unit
{
    // _before() 和 _after() 方法可选,用于执行测试前后的操作
    protected function _before()
    {
    }

    protected function _after()
    {
    }

    // 测试方法
    public function testSomething()
    {
        $this->assertTrue(true);
    }
}

testSomething() 方法中,你可以编写你的测试代码。运行单元测试命令:

./vendor/bin/codecept run unit ExampleTest

3.2 创建功能测试

功能测试用于模拟用户与应用程序交互,通常不涉及外部浏览器。使用 PhpBrowser 模块进行功能测试。

首先创建一个功能测试:

./vendor/bin/codecept generate:test functional ExampleFunctionalTest

这会在 tests/functional 目录下生成一个 ExampleFunctionalTest.php 文件。你可以使用 PhpBrowser 模块来编写测试:

<?php
namespace Tests\Functional;

use Codeception\Util\Stub;
use Tests\Support\AcceptanceTester;

class ExampleFunctionalTestCest
{
    public function _before(AcceptanceTester $I)
    {
    }

    // 测试用户登录
    public function tryToTest(AcceptanceTester $I)
    {
        $I->amOnPage('/login');
        $I->see('Login');
        $I->fillField('username', 'admin');
        $I->fillField('password', 'password');
        $I->click('Submit');
        $I->see('Welcome, admin');
    }
}

运行功能测试:

./vendor/bin/codecept run functional ExampleFunctionalTest

3.3 创建接受测试

接受测试用于模拟实际用户的浏览器行为,通常用于端到端测试。它使用 WebDriver 模块,可以和浏览器交互。

首先,安装 WebDriver 模块:

composer require --dev codeception/module-webdriver

然后,创建接受测试:

./vendor/bin/codecept generate:test acceptance ExampleAcceptanceTest

tests/acceptance 目录下创建 ExampleAcceptanceTest.php 文件:

<?php
namespace Tests\Acceptance;

use Codeception\Util\Stub;
use Tests\Support\AcceptanceTester;

class ExampleAcceptanceTestCest
{
    public function _before(AcceptanceTester $I)
    {
    }

    public function tryToTest(AcceptanceTester $I)
    {
        $I->amOnPage('/login');
        $I->see('Login');
        $I->fillField('username', 'admin');
        $I->fillField('password', 'password');
        $I->click('Submit');
        $I->see('Welcome, admin');
    }
}

要运行 WebDriver 测试,通常你需要在本地或服务器上运行一个 Selenium 服务。你可以使用 docker 启动一个 Selenium 容器:

docker run -d -p 4444:4444 selenium/standalone-chrome

然后执行测试:

./vendor/bin/codecept run acceptance ExampleAcceptanceTest

4. 配置文件

Codeception 配置文件位于 tests/_support 目录下。以下是一些常见的配置文件和配置项:

  • tests/_support/Helper:自定义辅助类。
  • tests/_support/AcceptanceTester.php:接受测试的默认类,可以在其中定义一些通用的测试方法。
  • tests/_support/FunctionalTester.php:功能测试的默认类。
  • tests/_support/UnitTester.php:单元测试的默认类。

每个测试模块都有一个配置文件,位于 tests/_support/config 目录下,例如 tests/_support/config/acceptance.suite.yml,你可以在这些配置文件中设置各模块的参数,例如数据库、浏览器、超时等。

5. 常见命令

以下是一些常用的 Codeception 命令:

  • run:运行所有测试或指定测试类型(unit、functional、acceptance)。
./vendor/bin/codecept run
./vendor/bin/codecept run unit
./vendor/bin/codecept run functional
./vendor/bin/codecept run acceptance
  • generate:test:生成测试文件。
./vendor/bin/codecept generate:test unit ExampleTest
./vendor/bin/codecept generate:test functional ExampleFunctionalTest
./vendor/bin/codecept generate:test acceptance ExampleAcceptanceTest
  • bootstrap:初始化 Codeception 项目。
./vendor/bin/codecept bootstrap
  • guy:使用 guy 生成模拟的测试代码和功能。
./vendor/bin/codecept generate:guy FunctionalTester

6. 测试报告与结果

在 Codeception 执行测试后,会生成测试报告,默认情况下报告会显示在命令行界面,你可以通过以下方式查看报告:

  • HTML 报告:你可以配置 Codeception 生成 HTML 格式的测试报告,便于查看详细的测试结果。
  • JUnit 报告:生成 JUnit 格式的测试报告,以便与 CI/CD 工具(如 Jenkins)集成。
./vendor/bin/codecept run --coverage --html

7. 总结

通过 Codeception,你可以快速开始自动化测试,并轻松扩展为更复杂的测试场景。通过简单易用的接口和模块,你可以编写功能测试、接受测试、API 测试等多种类型的测试,确保你的代码质量和系统稳定性。