inpsyde/wp-tests-starter

一个帮助您快速设置 WordPress 集成测试环境的包。

1.0.2 2016-01-27 23:05 UTC

This package is auto-updated.

Last update: 2024-09-05 14:20:14 UTC


README

注意:您正在阅读开发分支针对 2.0.0 版本的文档。您可以在 version-1 分支找到 1.0 版本的文档。

Wp Tests starter 是一个库,它可以帮助您使用官方的 wordpress-develop 仓库,通过 WordPress 核心来设置您的插件或库的集成测试。与单元测试的主要区别是您不需要(通常也不希望)模拟任何 WordPress 函数。相反,您拥有一个完全启动的 WordPress 核心以及与数据库服务器的实际连接。

所以如果您以 ORM 风格将对象映射到 WordPress 帖子上,您的集成测试将如下所示

public function testPersistBook(): void {

    $book = new Book('The Da Vinci Code', 'Dan Brown', '2003');
    $testee = new BookRepository($GLOBALS['wpdb']);
    $testee->persist($book); // maps book to WP_Post object and post meta

    self::assertGreaterThan(0, $book->id());

    $wpPost = get_post($book->id());

    self::assertSame('The Da Vinci Code', $wpPost->post_title);
    self::assertSame('2003', get_post_meta($book->id(), '_publishing_year', true));
    self::assertSame('Dan Brown', get_post_meta($book->id(), '_author', true));
}

不需要模拟。只需在 PHPUnit 测试用例中运行 WordPress。

安装

为了使用 Wp Tests Starter,您需要:具有 Composer 的 PHP 环境,以及具有 专用测试数据库 的 MySQL 服务器。此数据库应该是完全瞬时的,因此不要使用包含重要数据的任何数据库。您还需要以下四个 Composer 包作为开发依赖项安装

由于最后一个在 packagist.org 上不可用,您必须手动将存储库添加到您的 composer.json 文件中,方法是在其中添加

"repositories": [
    {
        "type": "vcs",
        "url": "https://github.com/WordPress/wordpress-develop"
    }
]

现在您可以运行

composer require --dev inpsyde/wp-tests-starter yoast/phpunit-polyfills wordpress/wordpress phpunit/phpunit

请注意,这需要一段时间,因为 Composer 将分析整个 GitHub 上的 WordPress 仓库。(一旦放置了 composer.lock,下一次安装运行将更快。)

设置您的测试

为了设置您的 PHPUnit 测试,您需要两个文件:phpunit.xml.dist 和一个 boostrap.php,它由 PHPUnit 在实际测试执行之前加载。这两个文件的示例假设您的库目录结构如下所示

├ src/
|  └ MyModule.php
├ tests/
|  ├integration/
|  |  └ MyModuleTest.php
|  └boostrap.php
├ vendor/
├ composer.json
└ phpunit.xml.dist

以下 phpunit.xml.dist 文件的示例告诉 PHPUnit 测试文件的位置,并将数据库凭据作为环境变量包含在内

<phpunit
    bootstrap="tests/bootstrap.dist.php"
>
    <php>
        <env name="WPTS_DB_URL" value="mysql://user:password@host/db_name?table_prefix=wp_test_"/>
    </php>
    
    <testsuites>
        <testsuite name="integration">
            <directory suffix="Test.php">./tests/integration</directory>
        </testsuite>
    </testsuites>
</phpunit>

最后,tests/boostrap.php 加载 Wp Tests Starter 和 WordPress

<?php

declare(strict_types=1);

namespace MyProject\Tests;

use Inpsyde\WpTestsStarter\WpTestsStarter;

$projectDir = dirname(__DIR__);

require_once $projectDir . '/vendor/autoload.php';

$starter = new WpTestsStarter(
    $projectDir . '/vendor/wordpress/wordpress', // path to the WordPress library
    getenv('WPTS_DB_URL') // Databse credentials in URL format, set in phpunit.xml.dist
);

// Some configuration:
$starter
    // Install WP core as multisite
    ->testAsMultisite()
    // boostrap your plugin or module code
    ->addActivePlugin(static function()  {
        (new MyModule())->init();
    })
    // add filters early
    ->addFilter('my_app.modules', static function(array $modules): array {
        // whatever, it's just an example
        return  $modules;
    })
    //finally load WordPress
    ->bootstrap();

这些文件仅显示了使用 WP Tests Starter 运行集成测试的简短方法。您还可以通过 WpTestsStarter 对象的方法获得其他几个配置选项。

运行 PHPUnit

有了这种配置,您可以使用以下命令执行 tests/integration 中所有测试类的 PHPUnit

vendor/bin/phpunit

在每次运行中,WP Starter 将将配置写入 vendor/wordpress/wordpress/wp-config.php,并加载 WordPress 内部引导脚本,这确保了数据库表的安装等。

配置

数据库 URL

为了不维护多个环境变量,您可以通过单个参数传递所有数据库凭据和选项,如下所示

mysql://user:password@localhost:3306/test_db?table_prefix=wp_tests_&charset=utf8mb4&collation=utf8_general_ci

此 URL 可以通过构造函数参数或 useDbUrl() 方法传递给 WpTestsStarter

<?php
//either
$starter = new WpTestsStarter($baseDir, $dbUrl);
// or
$starter->useDbUrl($dbUrl);

上面的 URL 示例将转换为以下 WordPress 常量和全局变量

<?php
define('DB_HOST', 'localhost:3306');
define('DB_USER', 'user');
define('DB_PASSWORD', 'password');
define('DB_NAME', 'test_db');
define('DB_CHARSET', 'utf8mb4');
define('DB_COLLATE', 'utf8_general_ci');
$GLOBALS['table_prefix'] = 'wp_tests_'

基本上,此 URL 的所有值都是可选的,但请记住,您需要一个完整的 WordPress 配置。或者,您可以使用显式值

$starter
    ->useDbHost('localhost')
    ->useDbUser('user');
    // and so on

许可

本存储库是免费软件,并按照GNU通用公共许可证版本2或(根据您的选择)任何后续版本发布。有关完整的许可证,请参阅许可证

返回顶部