测试
为了开发一个健壮的扩展包,对所提供的代码进行测试覆盖非常重要。 不仅要确认现有代码的正确行为,还要在添加新功能时验证一切仍然正常工作。 这确保了我们的扩展包可以在以后的阶段有把握地进行重构。
测试还允许其他开发人员了解如何使用扩展包的某些特性,并使他们对扩展包的可靠性有信心。
安装 PHPUnit
在 PHP 中有许多测试行为的选项,但是我们将使用非常好的工具 PHPunit 来接近 Laravel 的默认设置。
在我们的扩展包中将 PHPUnit 安装为开发依赖:
composer require --dev phpunit/phpunit
注意: 如果你正在为老版本的 Laravel 开发扩展包,可能需要安装一个特定的版本。
要配置 PHPUnit,在扩展包的根目录中创建一个phpunit.xml
文件。 然后,复制以下模板以使用 in-memory sqlite 数据库并启用彩色报告。
phpunit.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="vendor/autoload.php"
backupGlobals="false"
backupStaticAttributes="false"
colors="true"
verbose="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false">
<testsuites>
<testsuite name="Test Suite">
<directory>tests</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">src/</directory>
</whitelist>
</filter>
<php>
<env name="DB_CONNECTION" value="testing"/>
</php>
</phpunit>
测试目录结构
为了适应特性和单元测试,创建一个包含 Unit 和 Feature 子目录和基本 TestCase.php 文件的 tests/ 目录。 结构如下:
- tests
- Feature
- Unit
TestCase.php
TestCase.php
继承了 \Orchestra\Testbench\TestCase (参见下面的示例) ,并包含了与在每个测试执行之前设置 “world” 相关的任务。 在 TestCase
类中,我们将实现三个重要的设置方法:
getPackageProviders()
getEnvironmentSetUp()
setUp()
让我们逐一来看看这些方法。
setUp()
你可能已经在自己的测试中使用过此方法。 当你在以后的所有测试中需要某个模型时,常常使用它。 因此,可以将该模型的实例化提取到每次测试之前调用的 setUp ()方法。 在测试中,所需的模型可以从 Test 类实例变量检索到。 使用此方法时,不要忘记调用父类的setUp()方法(并确保返回 void)。
getEnvironmentSetUp()
正如 Orchestra Testbench 所建议的: “如果需要在应用程序启动过程的早期添加一些内容,你可以使用 getEnvironmentSetUp()方法”。 因此,我建议在 setUp() 方法之前调用它。
getPackageProviders()
顾名思义,我们可以在 getPackageProviders()方法中加载服务提供者。 我们将通过返回一个包含所有提供者的数组来实现这一点。 现在,我们将只包括特定于扩展包的扩展包提供程序,但是想象一下,如果扩展包使用 EventServiceProvider,我们也会在这里注册它。
在一个扩展包中,TestCase 将继承自 \Orchestra\Testbench\TestCase:
// 'tests/TestCase.php'
<?php
namespace JohnDoe\BlogPackage\Tests;
use JohnDoe\BlogPackage\BlogPackageServiceProvider;
class TestCase extends \Orchestra\Testbench\TestCase
{
public function setUp(): void
{
parent::setUp();
// additional setup
}
protected function getPackageProviders($app)
{
return [
BlogPackageServiceProvider::class,
];
}
protected function getEnvironmentSetUp($app)
{
// perform environment setup
}
}
在运行 PHPUnit 测试套件之前,我们首先需要将测试名称空间映射到 composer.json 文件中 "autoload-dev"(psr-4)键下的适当文件夹:
{
...,
"autoload": {},
"autoload-dev": {
"psr-4": {
"JohnDoe\\BlogPackage\\Tests\\": "tests"
}
}
}
最后,通过运行 composer dump-autoload
重新映射自动加载文件。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: