自动化测试是保证代码质量的重要手段。对于 WordPress 开发来说,测试尤其重要,因为 WordPress 生态复杂,主题和插件经常需要与不同版本的核心、其他插件以及各种服务器环境兼容。PHPUnit 是 WordPress 官方推荐的测试框架,结合 WP-CLI 可以方便地运行测试套件。

WordPress 测试环境 的搭建需要安装 PHPUnit,并下载 WordPress 测试框架。最简单的方式是使用 WP-CLI 的 wp scaffold 命令:

# 在插件目录中生成测试骨架
wp scaffold plugin-tests 你的插件名

# 在主题目录中生成测试骨架
wp scaffold theme-tests 你的主题名

这个命令会生成 tests/ 目录,包含 bootstrap.phptest-sample.php 等文件,以及 phpunit.xml 配置文件。你还需要一个测试数据库,在 tests/bootstrap.php 中配置。

单元测试 是针对单个函数或方法的测试。你的测试类需要继承 WP_UnitTestCase,每个测试方法以 test_ 开头:

class MyPluginTest extends WP_UnitTestCase {
    public function test_my_function_returns_correct_value() {
        $result = my_plugin_function('input');
        $this->assertEquals('expected_output', $result);
    }
    
    public function test_filter_modifies_content() {
        $content = 'Hello World';
        $filtered = apply_filters('my_content_filter', $content);
        $this->assertStringContainsString('Hello', $filtered);
    }
    
    public function test_post_meta_is_saved_correctly() {
        $post_id = $this->factory->post->create();
        update_post_meta($post_id, '_my_meta', 'test_value');
        $this->assertEquals('test_value', get_post_meta($post_id, '_my_meta', true));
    }
}

WP_UnitTestCase 提供了很多有用的辅助方法,比如 $this->factory->post->create() 可以快速创建测试文章。每个测试运行前,测试框架会自动重置数据库,确保测试之间相互隔离。

集成测试 更贴近真实环境,它测试整个系统的行为,包括数据库查询、API 调用、页面渲染等。在 WordPress 中,集成测试通常涉及模拟 HTTP 请求或调用 REST API 端点:

public function test_rest_api_endpoint_returns_expected_data() {
    $request = new WP_REST_Request('GET', '/my-plugin/v1/data');
    $response = rest_do_request($request);
    $this->assertEquals(200, $response->get_status());
    $data = $response->get_data();
    $this->assertArrayHasKey('items', $data);
}

运行测试 可以使用 WP-CLI:

# 运行所有测试
wp eval-file tests/run-tests.php

# 或者直接使用 PHPUnit
./vendor/bin/phpunit

如果你使用 WP-CLI 的 scaffold 生成的测试骨架,可以直接执行 phpunit 命令。

持续集成(CI) 是自动化测试的最佳实践。你可以配置 GitHub Actions、GitLab CI 或 Travis CI,在每次提交代码时自动运行测试套件。一个简单的 GitHub Actions 工作流文件如下:

name: Run Tests
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: shivammathur/setup-php@v2
        with:
          php-version: '8.0'
      - run: composer install
      - run: vendor/bin/phpunit

CI 可以在代码合并前发现问题,避免有 bug 的代码进入生产环境。

测试覆盖率 是衡量测试质量的一个指标。你可以在 phpunit.xml 中配置生成覆盖率报告:

<logging>
    <log type="coverage-html" target="./coverage-report"/>
</logging>

然后查看哪些代码没有被测试覆盖到,逐步补齐。

对于 WordPress 开发者来说,编写测试是一个习惯问题。刚开始可能会觉得麻烦,但一旦习惯后,你会发现测试不仅减少了回归 bug,还能让你更自信地重构代码。对于发布到官方仓库的插件和主题,测试覆盖率也是社区评审的重要参考之一。