配置测试

Pest.php 文件是一个配置文件,用于定义测试套件的设置。此文件位于项目 tests 目录下,并在运行测试时由 Pest 自动加载。虽然您可以在此文件中定义 全局钩子自定义断言,但其主要目的是指定测试套件中使用的基本测试类。

在使用 Pest 时,提供给测试函数的闭包中可用的 $this 变量绑定到特定的测试用例类,通常是 PHPUnit\Framework\TestCase。这保证了以 Pest 函数式风格编写的测试用例可以访问 PHPUnit 的底层断言 API,简化了与更熟悉 PHPUnit 测试框架的其他开发人员的协作。

1it('has home', function () {
2 echo get_class($this); // \PHPUnit\Framework\TestCase
3 
4 $this->assertTrue(true);
5});

但是,您可以将特定文件夹甚至整个测试套件与另一个基本测试用例类关联,从而更改测试中 $this 的值。为此,您可以在 Pest.php 配置文件中使用 pest() 函数和 in() 方法。

1// tests/Pest.php
2pest()->extend(Tests\TestCase::class)->in('Feature');
3 
4// tests/Feature/ExampleTest.php
5it('has home', function () {
6 echo get_class($this); // \Tests\TestCase
7});

此外,Pest 支持 glob 模式 在 in() 方法中。这允许您使用单个模式指定多个目录或文件。Glob 模式是字符串表示形式,可以匹配各种文件路径,例如通配符。如果您不熟悉 glob 模式,请参阅 PHP 手册 此处

1// tests/Pest.php
2pest()->extend(Tests\TestCase::class)->in('Feature/*Job*.php');
3 
4// This will apply the Tests\TestCase to all test files in the "Feature" directory that contains "Job" in their filename.

另一个更复杂的示例是在不同模块中使用模式匹配多个目录,同时应用多个测试用例类和 trait。

1// tests/Pest.php
2pest()
3 ->extend(DuskTestCase::class)
4 ->use(DatabaseMigrations::class)
5 ->in('../Modules/*/Tests/Browser');
6 
7// This will apply the DuskTestCase class and the DatabaseMigrations trait to all test files within any module's "Browser" directory.

在基本测试用例类中定义为 publicprotected 的任何方法都可以在测试闭包中访问。

1use PHPUnit\Framework\TestCase as BaseTestCase;
2 
3// tests/TestCase.php
4class TestCase extends BaseTestCase
5{
6 public function performThis(): void
7 {
8 //
9 }
10}
11 
12// tests/Pest.php
13pest()->extend(TestCase::class)->in('Feature');
14 
15// tests/Feature/ExampleTest.php
16it('has home', function () {
17 $this->performThis();
18});

Trait 可以链接到测试或文件夹,就像类一样。例如,在 Laravel 中,您可以使用 RefreshDatabase trait 在每次测试之前重置数据库。要在测试中包含 trait,请将 trait 的名称传递给 pest()->use() 方法。

1<?php
2 
3use Tests\TestCase;
4use Illuminate\Foundation\Testing\RefreshDatabase;
5 
6pest()->extend(TestCase::class)->use(RefreshDatabase::class)->in('Feature');

要将特定测试与特定的测试用例类或 trait 关联,您可以在**该特定测试文件内**使用 pest()->extend()pest()->use() 方法,省略 in() 方法的使用。

1pest()->extend(Tests\MySpecificTestCase::class);
2 
3it('has home', function () {
4 echo get_class($this); // \Tests\MySpecificTestCase
5});

接下来,配置测试套件时可用的功能之一是能够对文件夹进行分组。使用此功能时,您可以使用 --group 选项过滤执行的测试:分组测试