
单元测试在软件开发中至关重要,它能确保应用程序的各个组件在隔离状态下按预期运行。通过为特定代码单元编写测试,您可以在开发早期发现并修复错误,从而开发出更可靠、更稳定的软件。
在持续集成/持续交付(CI/CD)管道中,您可以在更改代码库后自动运行这些测试。这可确保新代码不会引入错误或破坏现有功能。
本文强调了单元测试在 Laravel 应用程序中的重要性,详细介绍了如何为 Laravel 应用程序编写单元测试。
是 PHP 生态系统中广泛使用的测试框架,专为单元测试而设计。它拥有一套用于创建和运行测试的强大工具,是确保代码库可靠性和质量的重要资源。
支持使用 进行测试,并提供了方便的辅助 *** ,让你可以测试应用程序。
在 Laravel 项目中设置 PHPUnit 只需极少的配置。Laravel 提供了一个预配置的测试环境,包括一个 phpunit.xml 文件和一个专门的 tests 文件目录。
你也可以修改 phpunit.xml 文件,定义自定义选项,获得量身定制的测试体验。您也可以在项目根目录下创建 .env.testing 环境文件,而不是使用 .env 文件。
Laravel 提供了一个结构化的默认目录布局。Laravel 项目的根目录包含一个 tests 目录,其中有 Feature 和 Unit 子目录。这种布局可以简单地分离不同的测试类型,并保持一个整洁有序的测试环境。
Laravel 项目中的 phpunit.xml 文件对于协调测试过程、确保测试运行的一致性以及根据项目要求定制 PHPUnit 的行为至关重要。它允许你定义如何运行测试,包括定义测试套件、指定测试环境和设置数据库连接。
该文件还指定会话、缓存和电子邮件应设置为数组驱动程序,以确保在运行测试时不会持续存在会话、缓存或电子邮件数据。
注:driver 一词指的是一种配置设置,在测试过程中将数据存储在内存阵列中,以保持隔离并防止测试运行之间的数据持久化。
你可以在 Laravel 应用程序上执行几种类型的测试:
测试驱动开发(TDD)是一种软件开发 *** ,强调在执行代码前进行测试。这种 *** 遵循一个称为 “red-green-refactor(红-绿-重构)” 循环的过程。

测试驱动的开发周期显示为 “红-绿-重构”。
以下是对该周期的解释:
TDD 有以下几个好处:
在 Laravel 开发中,你可以应用 TDD 原则,在实现控制器、模型和服务等组件之前为它们编写测试用例。
Laravel 的测试环境,包括 PHPUnit,提供了方便的 *** 和断言,以促进 TDD,确保您可以创建有意义的测试,并有效地遵循红-绿-重构循环。
本节将介绍如何编写一个简单的测试来检查模型的功能。
要继续学习,你需要具备以下条件:
git clone https://github.com/VirtuaCreative/kinsta-laravel-blog.git
composer install 命令安装项目依赖项。php artisan key:generate 命令生成应用密钥。首先,确保您的机器上有项目代码。您要测试的模型是 app/Http/Models/Post.php 文件中定义的 Post 模型。该模型包含多个可填写属性,如 title, description, 和 image。
您的任务是为该模型设计简单明了的单元测试。其中一个测试验证属性是否设置正确,另一个测试则通过尝试分配不可填充属性来检查批量分配。
php artisan make:test PostModelFunctionalityTest --unit 命令创建新的测试用例。--unit 选项指定这是一个单元测试,并将其保存在 tests/Unit 目录中。test_example 函数: public function test_attributes_are_set_correctly()
{
// create a new post instance with attributes
$post = new Post([
'title' => 'Sample Post Title',
'description' => 'Sample Post Description',
'image' => 'sample_image.jpg',
]);
// check if you set the attributes correctly
$this->assertEquals('Sample Post Title', $post->title);
$this->assertEquals('Sample Post Description', $post->description);
$this->assertEquals('sample_image.jpg', $post->image);
}
public function test_non_fillable_attributes_are_not_set()
{
// Attempt to create a post with additional attributes (non-fillable)
$post = new Post([
'title' => 'Sample Post Title',
'description' => 'Sample Post Description',
'image' => 'sample_image.jpg',
'author' => 'John Doe',
]);
// check that the non-fillable attribute is not set on the post instance
$this->assertArrayNotHasKey('author', $post->getAttributes());
} 这段代码定义了两个测试 *** 。
之一个 *** 创建一个带有指定属性的 Post 实例,并使用 assertEquals 断言 *** 断言你正确设置了 title, description, 和 image 属性。
第二个 *** 尝试创建一个带有额外不可填充属性(author)的 Post 实例,并使用 assertArrayNotHasKey 断言 *** 断言模型实例上未设置该属性。
use 语句: use App\Models\Post;
php artisan config:clear 命令清除配置缓存。php artisan test tests/Unit/PostModelFunctionalityTest.php
所有测试都应通过,终端应显示结果和运行测试的总时间。
如果测试失败,可以按照以下步骤进行调试:
Laravel 提供了一种方便的 *** ,使用内存 来建立测试环境,这种数据库速度快,而且不会在测试运行之间持久化数据。要配置测试数据库环境并编写与数据库交互的测试,请按以下步骤操作:
<env name="DB_CONNECTION" value="sqlite"/> <env name="DB_DATABASE" value=":memory:"/>
php artisan make:test PostCreationTest --unit 命令创建新的测试用例。test_example *** : public function testPostCreation()
{
// Create a new post and save it to the database
$post = Post::create([
'title' => 'Sample Post Title',
'description' => 'Sample Post Description',
'image' => 'sample_image.jpg',
]);
// Retrieve the post from the database and assert its existence
$createdPost = Post::find($post->id);
$this->assertNotNull($createdPost);
$this->assertEquals('Sample Post Title', $createdPost->title);
} use 声明: use App\Models\Post;
目前, PostCreationTest 类扩展了 PHPUnitFrameworkTestCase 基类。该基类通常用于在 Laravel 之外直接使用 PHPUnit 进行单元测试,或为与 Laravel 不紧密耦合的组件编写测试。然而,你需要访问数据库,这意味着你必须修改 PostCreationTest 类来扩展 TestsTestCase 类。
后者是为 Laravel 应用程序量身定制的 PHPUnitFrameworkTestCase 类。它提供了额外的功能和 Laravel 特有的设置,如数据库播种和测试环境配置。
use PHPUnitFrameworkTestCase; 语句替换为 use TestsTestCase;。请记住,您设置的测试环境使用的是内存 SQLite 数据库。因此,必须在运行测试前迁移数据库。请使用 IlluminateFoundationTestingRefreshDatabase 特性来完成这项工作。如果模式不是最新的,该特性就会迁移数据库,并在每次测试后重置数据库,以确保上一次测试的数据不会干扰后续测试。use 语句,以便在代码中使用该特质: use Illuminate\Foundation\Testing\RefreshDatabase;
testPostCreation *** 之前添加以下代码行: use RefreshDatabase;
php artisan config:clear 命令清除配置缓存。php artisan test tests/Unit/PostCreationTest.php
测试应该通过,终端应该显示测试结果和总测试时间。
单元测试是孤立地检查单个应用程序组件,而功能测试则是检查代码中较大的部分,如多个对象如何交互。功能测试至关重要,原因如下:
现在,在 app/Http/Controllers/PostController.php 文件中为 PostController 创建一个功能测试。重点是 store *** ,验证输入的数据,在数据库中创建并存储文章。
该测试模拟用户通过 *** 界面创建新文章,确保代码将文章存储在数据库中,并在创建后将用户重定向到文章索引页面。为此,请执行以下步骤:
php artisan make:test PostControllerTest 命令,在 tests/Features 目录下创建一个新的测试用例。test_example *** : use RefreshDatabase; // Refresh the database after each test
public function test_create_post()
{
// Simulate a user creating a new post through the web interface
$response = $this->post(route('posts.store'), [
'title' => 'New Post Title',
'description' => 'New Post Description',
'image' => $this->create_test_image(),
]);
// Assert that the post is successfully stored in the database
$this->assertCount(1, Post::all());
// Assert that the user is redirected to the Posts Index page after post creation
$response->assertRedirect(route('posts.index'));
}
// Helper function to create a test image for the post
private function create_test_image()
{
// Create a mock image file using Laravel's UploadedFile class
$file = UploadedFile::fake()->image('test_image.jpg');
// Return the path to the temporary image file
return $file;
} test_create_post 函数通过向 posts.store 路由发出带有特定属性的 POST 请求,模拟用户创建新文章的过程,其中包括使用 Laravel 的 UploadedFile 类生成的模拟图片。
然后,测试通过检查 Post::all() 的计数,断言代码已成功将文章存储到数据库中。它验证了代码是否在创建文章后将用户重定向到文章索引页面。
该测试可确保文章创建功能正常工作,应用程序能正确处理数据库交互和文章提交后的重定向。
use 语句: use App\Models\Post; use Illuminate\Http\UploadedFile;
php artisan config:clear 清除配置缓存。php artisan test tests/Feature/PostControllerTest.php
测试应该通过,终端应该显示测试结果和运行测试的总时间。
测试覆盖率是指单元测试、功能测试或浏览器测试在代码库中的检查范围,以百分比表示。它能帮助你识别代码库中未经测试的区域,以及可能包含错误的测试不足区域。
PHPUnit 的代码覆盖率功能和 Laravel 的内置覆盖率报告等工具会生成报告,显示测试覆盖了代码库中的哪些部分。这一过程提供了有关测试质量的重要信息,有助于您关注可能需要额外测试的区域。
php artisan test --coverage 命令。您应该会收到类似下面的输出:<img src=”https://kinst *** /wp-content/uploads/2024/03/code-coverage-report.png” alt=”Screen capture showing the execution of the command php artisan test --coverage. It shows the total number of tests that passed and the time to execute the results. It also lists each component in your codebase and its code coverage percentage.” width=”1001″ height=”471″ />。执行命令 php artisan test --coverage.code 覆盖率报告会显示测试结果、通过的测试总数以及执行结果所需的时间。它还会列出代码库中的每个组件及其代码覆盖率。百分比表示测试覆盖代码的比例。例如, Models/Post 的覆盖率为 100%,这意味着该模型的所有 *** 和代码行都已覆盖。代码覆盖率报告还会显示 “Total Coverage“–整个代码库的总体代码覆盖率。在本例中,测试只覆盖了 65.3% 的代码。php artisan test --coverage --min=85 命令。 该命令设置的最小阈值为 85%。您将收到以下输出:
测试更低阈值为 85%。 测试套件失败的原因是代码没有达到 85% 的更低阈值。虽然实现更高的代码覆盖率(通常是 100%)是我们的目标,但更重要的是彻底测试应用程序的关键和复杂部分。
通过采用本文概述的更佳实践,如编写有意义的综合测试、坚持 TDD 中的红-绿-重构循环,以及利用 Laravel 和 PHPUnit 提供的测试功能,你可以创建健壮而高质量的应用程序。
本章节主要是对宝塔面板的主界面的各个版本进行一个简单的说明。 宝塔面板主界面主要包括:服务器操作系统、服务器状态、站点信息、软件管理及网络流量几个部分。 Windows面板有部分功能未实现,其余部分与Linux面板同步。 系统操作...
宝塔面板中的网站管理是非常重要的一部分,也是站长经常需要使用到的功能模块。网站管理,主要用于管理和创建WEB站点。如果您是宝塔面板的使用用户,应该对此模块有充分的了解,以便于您更高效地管理网站。 宝塔面板网站管理模块包括:添加新网站、修改默认页、设置默认站点、站点列表、站点的运行与停止、备份站点、...
宝塔面板其中一个最为便捷的功能之一,无需SFTP或者FTP即可对服务器的文件内容进行上传、下载、编辑及删除等管理操作。 文件管理,用于管理该服务器上的文件内容。 文件的基础操作 文件的基础操作有哪些了,主要有这些方面:复制、粘贴、剪切、删除、重命名、压缩、刷新、新建文件、新建目录。...
宝塔面板提供丰富的软件以一键安装,这让服务器环境搭建提供不少的便利性,站长可以根据实际需求快速编译安装以实现不同的功能需求。 软件管理,主要是宝塔提供的一些面板扩展插件。 Nginx Nginx是一个高性能的HTTP和反向代理服务器,具有轻量级、占用内存小,并发能力强等优势。 w...
Node.js和PHP是Web开发工作中常用的两种基本Web技术。两者都为服务器端开发做出了贡献,Node.js甚至同时服务于客户端和服务器端开发。 PHP已经为开发人员服务了近3年,现在它为78%的网络提供支持。相比之下,Node.js相对较新,但扩展速度非常快,由于其全栈开发能力而成为流行...
您的网络服务器软件会影响您网站的整体性能和加载时间。出于这个原因,选择最适合您需求的Web服务器对于您的网站的成功至关重要。然而,有这么多可用的选项,要知道安装和使用哪一个可能具有挑战性。 在本指南中,我们将回顾八款适用于Windows和Linux的最佳Web服务器。 什么是Web服...