如何开始使用 Pest PHP 测试框架测试您的 WordPress 代码
已发表: 2022-05-18我们都同意 WordPress 从一开始就已经走过了漫长的道路,而且它发展成为的不仅仅是博客软件。
它的核心仍然是一个内容管理系统 (CMS),但 wordpress.org 目录中有超过 59,000 个插件,您可以对其进行自定义以实现更多功能。
它受欢迎的原因是它对内容创建者和开发者的准入门槛低。 有时这需要付出代价。 WordPress 在开发方面名声不佳,这已不是什么秘密。 它有很多遗留的包袱和顽固的规则,可以防止在涉及 PHP 代码时发生任何向后兼容性的破坏性更改(Gutenberg 是另一个我不会讨论的故事)。
那些开始进入编程世界的开发人员经常使用遗留的 PHP 代码,问题是他们可以学习一些糟糕的编程模式。 这反过来意味着他们将重用编写不佳的代码,从而增加世界上糟糕代码的数量。
这就是 WordPress 在开发者社区中名声不佳的地方。
打破循环
那么我们如何才能打破这种糟糕代码的循环呢? 通过教新开发人员如何编写好的代码。 教新开发人员(以及仍然坚持“WordPress”做事方式的老开发人员)的一个例子是编写教程。
另一种方法是鼓励他们使用可以帮助他们编写更好代码的工具。
我目前正在参与旨在发布新版 WordPress 编码标准的工作,这是一组用于 PHP_CodeSniffer 工具的规则,可以让您知道您的代码是否存在一些潜在问题(安全性、最佳实践、代码风格)。
我最近开发的另一个工具是一个包,它可以帮助开发人员设置使用 Pest 测试框架的 WordPress 集成测试。
好的,那么为什么我们需要这个新工具呢?
创建这个包的主要动机是鼓励更多的人为他们的代码编写测试,尤其是插件开发人员。
WordPress 社区中的许多开发人员都遵循这样的口头禅:我可以看到它有效,因为我已经在我的浏览器中尝试过了。 没关系,但是这样做有问题。
首先,它很耗时。 每次你做出一些改变,你都需要确保它有效,而且你没有破坏任何东西。
其次,人会犯错。 我们并非万无一失,代码可能会以您从未想过的方式被滥用。 您会惊讶于人们在编写代码时的创造力。
自动化测试速度很快,可以帮助您测试执行代码时会发生的各种情况。
您测试预期的行为(快乐路径),并且可以快速添加示例,说明如何以您不希望使用的方式使用代码(不快乐路径)。
它还可以保护您的代码免受回归。 代码回归是指您通过添加新代码无意中破坏了代码的一部分。
到目前为止设置的测试问题
在 WordPress 中进行测试并不是什么新鲜事。 并不是说您以前无法为您的代码设置测试。 有很多很棒的库可以帮助你设置一切,比如 wp-browser。
但问题是设置过程通常很笨拙。
您需要为测试设置一个单独的数据库,并且您需要运行某些脚本,然后更改文件以使其全部工作。
让我们面对现实吧,这不是一件简单的事情,开发人员天生就是懒惰的生物(这就是我们编写代码为我们做事的原因)。
wp-pest 集成测试设置的目的是消除所有额外的工作。
如何设置
为了设置它,您的项目必须使用 Composer。 这是将包添加到代码中的事实上的标准方式。
在您的终端类型中
composer require dingo-d/wp-pest-integration-test-setup --dev
下载包及其依赖项后,您可以通过键入来设置主题测试
vendor/bin/wp-pest setup theme
或者,如果您想为插件设置测试,您可以编写
vendor/bin/wp-pest setup plugin --plugin-slug=your-plugin-slug
或者,您可以提供--wp-version
参数,以指定您想在哪个 WordPress 版本上测试您的代码。
在后台,将下载一个 WordPress 实例,并设置一个内存数据库,以及您可以运行的两个测试示例。
然后,运行
vendor/bin/pest --group=unit
或者
vendor/bin/pest --group=integration
将运行测试。
Pest 的美妙之处在于它的语法对开发人员友好。 它具有惊人的文档和出色的语法。 让我们看一个简单的例子。 假设您正在注册一个名为“书籍”的自定义帖子类型:
<?php /** * Plugin Name: Test plugin * Desctiption: Test plugin * Version: 1.0.0 * License: MIT */ function test_plugin_register_books_cpt() { $args = array( 'label' => esc_html__( 'Books', 'test-plugin' ), 'public' => true, 'publicly_queryable' => true, 'show_ui' => true, 'show_in_menu' => true, 'query_var' => true, 'rewrite' => array( 'slug' => 'book' ), 'capability_type' => 'post', 'has_archive' => true, 'hierarchical' => false, 'menu_position' => null, 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'comments' ), ); register_post_type( 'book', $args ); } add_action( 'init', 'test_plugin_register_books_cpt' );
运行添加示例的 setup 命令后,名为BooksCptTest.php
的测试将如下所示:
<?php namespace Tests\Integration; beforeEach(function () { parent::setUp(); }); afterEach(function () { parent::tearDown(); }); test('Books custom post type is registered', function () { // We can use assertions from PHP_Unit. $this->assertNotFalse(has_action('init', 'test_plugin_register_books_cpt')); $registeredPostTypes = \get_post_types(); // Or we can use expectations API from Pest. expect($registeredPostTypes) ->toBeArray() ->toHaveKey('book'); });
运行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\\BooksCptTest ✓ Books custom post type is registered Tests: 1 passed Time: 0.14s
结论
就像这样,您可以在您的主题或插件中运行 WordPress 集成测试。 测试之所以令人惊奇,是因为它们不仅可以保护我们免于错误,还可以迫使我们编写干净且可测试的代码。 对于逻辑复杂或与第三方 API 通信的插件尤其如此。
为这样的代码库编写测试将迫使您考虑您的代码架构是什么样的,以便您可以轻松编写自动化测试 - 更不用说您不必手动测试所有内容所节省的时间和金钱。
如果您认为这是您可能会从中受益的东西,请随意使用它,并在 GitHub 上为存储库加注星标。
希望这将鼓励更多的 WordPress 开发人员使用能够提高他们编码技能的工具。