[
](travisweston.com/?source=pos…)
6月12日
-
5分钟阅读
[
拯救
用Mantle TestKit测试WordPress
对WordPress的核心测试套件的改进,它是向后兼容的。
如果你已经做了很长时间的专业WordPress开发,你可能已经遇到了WordPress测试框架。这是用于执行WordPress插件和主题测试的标准代码。
它的设置和使用也是一个痛苦。
对我来说,最大的痛点之一一直是,如果我使用WordPress框架,我完全无法模拟WordPress的核心类和函数。这意味着我要么需要使用像Brain Monkey这样的模拟库,而放弃集成测试,要么我需要为每个项目维护两个独立的PHPUnit配置。
有了Mantle TestKit,这种情况就不复存在了。
什么是Mantle TestKit?
Mantle TestKit是整个Mantle项目的一个小部分。Mantle将Laravel的灵活性与WordPress的易用性结合起来。
正如创建者所描述的那样:
Mantle认为,企业级的WordPress开发是可能的,并且应该有一个简单而令人愉快的语法。
如何在你的项目中安装Mantle TestKit
Mantle TestKit应该作为你大部分测试的落地替换。如果你已经花时间将你的WordPress测试升级到使用PHPUnit 9。在修改一个客户项目时,我遇到的只有两个问题。
前期工作
为一个插件或主题设置PHPUnit不在本文的范围内,但外面有很多这方面的信息。其中有些已经过时了,但如果你对这个主题感兴趣,那么我相信你完全有能力把它放在一起。
谁知道呢,也许我以后会跟进写一篇关于它的文章。
断言数组子集
PHPUnit 8删除了断言assertArraySubset ,我转换的客户项目中的许多测试都在使用这个断言。最初,我试图重新组织测试用例来删除这些调用,但最终我选择了简单地添加一个 composer 包来填充该断言的路径。
composer require --dev dms/phpunit-arraysubset-assert
从那里,我能够在我的测试中添加以下几行。
use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts;
突然间,我又有了工作断言。
我选择只在已经使用断言的测试中添加这个,因为我想在未来不再使用它,但你可以很容易地将其添加到自定义测试用例中,并从那里扩展你的测试。
喜欢这篇文章吗? 成为会员 和 订阅 以获得更多像这样的精彩内容!
设置你的项目以使用Mantle TestKit
默认情况下,Mantle TestKit就像WordPress测试框架的落地替换,只是速度更快。因此,让我们看看将一个现有的WordPress插件从WordPress测试转换到Mantle TestKit的步骤。
我们要做的第一件事是安装TestKit。
composer require --dev mantle-framework/testkit
现在TestKit已经安装好了!
现在,我倾向于在wp-content ,但我们在哪里安装真的不重要。无论我们在哪里做,我们只需要知道wordpress-autoload.php 文件的位置。这可以在我们的供应商目录中找到。
让我们创建一个全新的bootstrap.php 文件来开始工作。
这真的很简单。
最后,因为我们不再使用WordPress的测试框架,我们不再能访问\WP_UnitTestCase ,所以我们需要把我们的测试案例过渡到新的Mantle测试案例。
不过在这之前,让我们花点时间来谈谈集成和单元测试。
集成测试与单元测试
尽管测试用例的名字是这样,WordPress实际上并不包括任何形式的单元测试。这可能是有争议的说法,但这是事实。你在WordPress测试框架中写的每个测试都是一个集成测试。为什么?因为它需要你与WordPress核心代码库集成才能运行。
Mantle TestKit允许我们做的一件事是创建真正的单元测试,并在与我们的集成测试相同的执行中运行它们。我们能够通过扩展两个不同的测试案例来做到这一点。
第一个是Mantle\TestKit\Integration_Test_Case ,正如它的名字所暗示的,它是我们的集成测试。这个测试用例将处理安装WordPress核心,设置数据库,以及我们执行集成测试所需的一切。
当然,如果你想对情况有更多的控制,你总是可以从主Mantle\TestKit\Test_Case 类中扩展出来。这仍然是一个集成测试,但它需要你在执行之前手动执行Mantle的安装过程。
第二种是Mantle\TestKit\Unit_Test_Case ,它自动强制我们所有的单元测试在一个单独的进程中运行,而不传递任何可能通过安装集成测试而杂乱无章的全局范围的globals。
作为一个最佳实践,你应该创建你自己的自定义测试用例,并从这些父测试用例中扩展出你自己的测试,因为你很可能需要定制你的环境,超出基本的要求。
配置集成测试
每个WordPress测试都有一个共同点,那就是安装后执行的回调。这对我们来说也是可以用Mantle的。如果你从上面描述的Integration_Test_Case ,那么你需要做的就是给你的bootstrap添加一个函数,名称为:mantle_after_wordpress_install 。
如果你打算从根Test_Case 类扩展,那么你可以简单地将这个函数作为一个闭包传递给\Mantle\install() 函数。在本教程中,我将假设你使用的是集成测试案例。
配置单元测试
如果你想进行单元测试,那么需要做两件事。首先,你的集成测试必须使用Integration_Test_Case 类,或者你的自定义实现必须在setUpBeforeClass 钩子期间安装Mantle。无论哪种方式,你都不能从你的bootstrap中运行Mantle\install() --否则我们最终会得到一个杂乱的全局范围,无论我们是否喜欢它。
第二件事是,你绝对必须使用Unit_Test_Case - 或复制功能。也就是说,如果你要这么做,为什么还要使用Mantle呢?
对于我的自定义单元测试类,我使用Brain Monkey,并在那里初步配置一切。
你会注意到,除了扩展Mantle Unit_Test_Case类,这只是一个如何为Brain Monkey配置测试用例的例子。那是因为这就是它的全部。
我们已经完成了
真的,一旦你有了你的测试扩展你的新的自定义类,并且你已经解决了自动加载的任何错误,这应该是你需要让你的测试工作的全部。
现在,如果你像我一样,一直在两个独立的PHPUnit配置文件中运行这些测试,最后一步将是把它们合并成一个文件。这就像把testsuite 块从一个文件复制到另一个文件一样简单,并确保你正在加载你的bootstrap。
如果你完成了向Mantle TestKit的转换,请告诉我,你觉得如何。
如果你对贡献感兴趣,你可以在Github上找到整个Mantle项目,并且可以在Mantle网站上找到文档。
你喜欢这篇文章吗? 成为会员 并阅读我写的所有内容--以及Medium上的其他内容。
已经是会员了吗? 订阅以获得通知 当我发布新的文章时。
完全公开:Mantle是由 巷子创建的,是我工作的一家WordPress机构。我们目前正在招人,所以为什么不 申请与我共事!