如何用Mantle TestKit测试WordPress(附教程)

281 阅读6分钟

[

Travis Weston

](travisweston.com/?source=pos…)

特拉维斯-韦斯顿

关注

6月12日

-

5分钟阅读

[

拯救

](medium.com/m/signin?ac…)

用Mantle TestKit测试WordPress

对WordPress的核心测试套件的改进,它是向后兼容的。

照片:SigmundonUnsplash

如果你已经做了很长时间的专业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机构。我们目前正在招人,所以为什么不 申请与我共事!