dingo-d/wp-pest

一个将添加 WordPress 集成测试套件和 Pest 框架的包

2.0.0-alpha 2023-09-20 09:02 UTC

README

一个将使用 Pest PHP 测试框架添加 WordPress 集成和单元测试套件的包。

为什么要这样做?

当提到自动化测试时,WordPress 并不真正浮现在人们脑海中,对吧?希望这个包能帮助打破 WordPress 测试的污名。

这个包将使您能够通过使用 Pest PHP 框架轻松可读的测试设置快速启动和运行。

要求

  1. PHP > 7.4
  2. Composer

这个包只与 Composer 一起工作,我目前不打算支持其他安装方式。

设置

在您的项目中运行

composer require dingo-d/wp-pest-integration-test-setup --dev

之后,您可以运行以下命令

vendor/bin/wp-pest setup theme

这将设置 tests 文件夹,下载最新版本的 WordPress develop 仓库并将其放置在 wp 文件夹中。它还将设置您的集成和单元测试套件,并附带一个您可以在主题中运行的示例。

您可以通过输入以下内容来选择其他选项

vendor/bin/wp-pest setup --help
Description:
  Sets up the test suites.

Usage:
  setup [options] [--] <project-type>

Arguments:
  project-type                     Select whether you want to setup tests for theme or a plugin. Can be "theme" or "plugin"

Options:
      --wp-version[=WP-VERSION]    Pass the version of the WordPress you want to test on. [default: "latest"]
      --plugin-slug[=PLUGIN-SLUG]  If you are setting the plugin tests provide the plugin slug.
      --skip-delete                If you are running the setup tests in a CI pipeline, provide this option to skip the deletion step.
  -h, --help                       Display help for the given command. When no command is given display help for the list command
  -q, --quiet                      Do not output any message
  -V, --version                    Display this application version
      --ansi|--no-ansi             Force (or disable --no-ansi) ANSI output
  -n, --no-interaction             Do not ask any interactive question
  -v|vv|vvv, --verbose             Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug

Help:
  This command helps you set up WordPress integration and unit test suites.

幕后

关于这个包是如何产生的深入分析和解释,您可以阅读 这篇文章

基本上,“幕后”是下载了 wordpress-develop 仓库到您的项目中,添加了一个内存数据库(来自 aaemnnosttv/wp-sqlite-db 的 sqlite),以及来自 Yoast/wp-test-utils 的基础测试类。所有这些结合在一起,允许您在 WordPress 中使用 Pest PHP 运行集成测试,而无需任何额外设置。

在集成测试的同时运行单元测试

由于 Pest 处理 文件加载 的错误,为了成功运行单元测试,您需要在您的 Pest.php 文件或 Helpers.php 文件中添加以下辅助工具

function isUnitTest() {
	return !empty($GLOBALS['argv']) && $GLOBALS['argv'][1] === '--group=unit';
}

然后,在您的 集成 测试中,您需要在 uses() 调用之前添加以下内容

<?php

use Yoast\WPTestUtils\WPIntegration\TestCase;

if (isUnitTest()) {
	return;
}

uses(TestCase::class);

// Rest of the tests.

这样,当您运行单元测试组时,集成测试文件将退出,并且您不会使用错误的测试类来运行测试。

测试示例

命令将设置两个示例 - 一个用于单元测试,一个用于集成测试。

运行

vendor/bin/pest --group=unit

将运行单元测试

   PASS  Tests\Unit\ExampleTest
  ✓ example

  Tests:  1 passed
  Time:   0.02s

并运行

vendor/bin/pest --group=integration

将运行集成测试

Installing...
Running as single site... To run multisite, use -c tests/phpunit/multisite.xml
Not running ajax tests. To execute these, use --group ajax.
Not running ms-files tests. To execute these, use --group ms-files.
Not running external-http tests. To execute these, use --group external-http.

   PASS  Tests\Integration\ExampleTest
  ✓ Rest API endpoints work
  ✓ Creating terms in category works

  Tests:  2 passed
  Time:   0.14s

测试套件是分组在一起的,如果您想运行集成测试,则需要传递 --group=integration 选项,因为这样可以确保在运行测试时引导知道加载特定于集成测试的配置。

在 CI 管道中运行包

如果您想将此包作为持续集成(CI)管道的一部分运行,请确保在运行 wp-pest setup 命令时提供 --skip-delete 参数。这将跳过删除 wp-content 文件夹(在 CI 环境中根本不重要),并且不会阻止设置脚本。

问题

为什么需要这么高的 PHP 版本?如果我需要在不同 PHP 版本上测试我的主题/插件怎么办?

本包的潜在目标(除了让WordPress开发者更加熟悉测试之外)是敦促开发者更新他们的项目,并使用更多现代的PHP特性。虽然WordPress支持PHP 5.6,但现在已经不再提供安全补丁(在撰写本文时,PHP 7.4已进入EOL阶段)。

WordPress社区需要向前发展,如果这个包能帮助某人更新他们的服务器和PHP版本,那我将其视为成功。

脚本卡在下载WordPress的部分,我该怎么办?

并没有卡住!😂

你可能在WSL中运行,对吧?由于某种原因,WSL终端的下载可能很慢。
这是一个已知问题

可能的解决方案是禁用一些网络适配器,如这里所述(你也可以阅读一个tl;dr版本 😅)。

在Windows上无法运行

我还没有在原生Windows安装上测试。这在我的待办事项列表上,但不是优先事项。

有些东西不工作

请为此提交一个问题

更新

1.6.0版本

我决定将其名称改为更吸引人的wp-pest。说实话,我不明白为什么以前没有这样做。功能保持不变。

如果你刚刚下载并从1.6.0版本开始从头开始设置测试,那么你已经准备好了,祝你测试愉快!
如果不这样,你可能需要更新你的phpunit.xml文件以包含

<env name="WP_TESTS_DIR" value="wp/tests/phpunit"/>

在配置的<php>部分。

此外,根据包中的模板更新你的bootstrap.php文件。具体来说,你应该删除文件末尾的行

require_once dirname(__FILE__, 2) . '/wp/tests/phpunit/includes/bootstrap.php';

require_once dirname(__DIR__) . '/vendor/yoast/wp-test-utils/src/WPIntegration/bootstrap-functions.php';

WPIntegration\bootstrap_it();

确保你在文件顶部导入bootstrap_it()函数的命名空间

use Yoast\WPTestUtils\WPIntegration;

最后,但非常重要,从Pest.php文件中删除Integration

uses(TestCase::class)->in('Unit', 'Integration');

并添加

use Yoast\WPTestUtils\WPIntegration\TestCase;

uses(TestCase::class);

在每个集成测试的顶部。这将确保使用正确的基测试类进行集成测试。