编程

PestPHP - 一款基于 PHPUnit 的优雅测试框架

1542 2023-04-20 23:58:00

PestPHP 是一个优雅的 PHP 测试框架。它专注于简单性,精致的设计以使 PHP 测试变得有趣。

测试 PHP 代码时,你可以接触一系列框架。尽管如此,我们相信 Pest 是世界上最优雅、最复杂的测试框架。它旨在使测试过程变得愉快,它的目标是使测试易于阅读和理解,代码语法与自然人类语言非常相似。

function sum($a, $b) {
    return $a + $b;
}
 
test('sum', function () {
  $result = sum(1, 2);
 
  expect($result)->toBe(3);
});

受 Ruby 的 Rspec 和 Jest 的启发,Pest 易于使用的 API 为你带来了流畅高效的编码体验。此外,测试报告组织良好、实用且信息丰富,具有清晰简洁的错误和堆栈跟踪显示,可用于快速调试。使用 Pest,你可以直接从控制台获得无与伦比的测试报告!

除了出色的测试报告外,Pest 还提供了一系列其他有价值的功能,包括:

  • 内置并行功能(parallel feature),可实现更快的测试运行
  • 优美的文档,且易于导航
  • 用于优化慢速运行测试的本机评测工具
  • 开箱即用的架构测试以测试应用程序规则
  • 直接在终端上报告覆盖率,以跟踪代码覆盖率
  • 多款可选插件,如观察模式和快照测试,可定制 Pest 以满足您的需求

无论你是从事小型个人项目还是大型企业应用程序,Pest 都能提供服务。因此,如果你想让测试过程变得愉快和高效,可以试试 Pest。我们相信你会和喜欢它的。

安装

要求: PHP 8.1+

1. 通过下面命令引入到项目中:

composer require pestphp/pest --dev --with-all-dependencies

2. 在 PHP 项目中初始化 Pest。这一步会在你测试套件的根目录下创建一个名为 Pest.php 的配置文件,你可以在该文件中调整测试套件配置。

./vendor/bin/pest --init

3. 你可以通过下面 pest 命令运行测试。

./vendor/bin/pest

编写测试

成功安装完 Pest 后,你将会看到项目中由如下文件和目录:

├── 📂 tests
│   ├── 📂 Unit
│   │   └── ExampleTest.php
│   └── 📂 Feature
│   │   └── ExampleTest.php
│   └── TestCase.php
│   └── Pest.php
├── phpunit.xml

tests 目录测试主目录,所有测试文件都放在此处。该目录中有两个子目录 - Unit 和 Feature,分别对应于单元测试和特性测试。TestCase.php 文件中,你可以定义所有测试都可以使用的通用功能或者设置。最后,Pest.php 文件是测试套件的配置文件。

此外,你项目的根目录中有一个 phpunit.xml,该文件用于在运行测试时配置 phpunit 的各种选项。需要注意的是,Pest 是建立在 PHPUnit 之上的,这意味着 PHPUnit 提供的所有选项也可以在 Pest 中使用。因此,您对 phpunit.xml 文件所做的任何自定义或配置也将应用于 Pest测试。

当您开始为项目编写测试时,重要的是要考虑如何有效地创建和组织测试文件。通常,测试文件使用 Test.php 作为后缀,例如 ExampleTest.php

第一个测试

test('sum', function () {
   $result = sum(1, 2);
 
   expect($result)->toBe(3);
});

编写完测试代码后,是时候使用 Pest 运行测试了。当您执行 ./vendor/bin/pest 命令时,pest 将显示一条消息,指示你的测试是通过还是失败。

作为 test() 函数的替代方案,Pest 提供了方便的 it() 函数,该函数只需在测试描述前加上 “it” 一词,即可使测试更具可读性。

it('performs sums', function () {
   $result = sum(1, 2);
 
   expect($result)->toBe(3);
});

本例中,当你运行 ./vendor/bin/pest 命令时,输出的内容中会包含描述" it performs sums",连同测试结果。

期望API

正如你可能在前面的示例中注意到的那样,我们使用Pest的期望API在测试代码中执行断言。expect() 函数是 expect API 的核心部分,用于断言满足某些条件。

例如,在我们前面的例子中,我们使用 expect($result)->toBe(3) 来确保 $result 的值等于3。Pest 的期望 API 提供了各种其他断言函数,你可以使用这些函数来测试代码的行为,例如 toBeTrue()toBeFalse()toContain()

通过使用期望API,你可以编写简洁易读的断言,明确代码正在做什么以及它应该如何表现。

Assertion API

虽然 Pest 的期望 API 提供了一种方便的方式来执行断言,但它并不是唯一可用的选项。你还可以使用 PHPUnit 的断言 API,如果你已经熟悉 PHPUnit 的声明 API,或者您需要执行 Pest 的期望 API 中没有的更复杂的断言,那么它可能会很有用。

test('sum', function () {
   $result = sum(1, 2);
 
   $this->assertSame(3, $result); // Same as expect($result)->toBe(3)
});

 你可以在 PHPUnit 网站的文档中查看 PHPUnit 的断言 API 的完整列表: docs.phpunit.de/en/10.0/assertions.html