Laravel Laravel
  • 序章

    • 发布说明
    • 升级指南
    • 贡献指南
  • 快速开始

    • 安装
    • 配置
    • 目录结构
    • 前端
    • 入门套件
    • 部署
  • 架构概念

    • 请求生命周期
    • 服务容器
    • 服务提供者
    • 门面
  • 基础

    • 路由
    • 中间件
    • CSRF 保护
    • 控制器
    • 请求
    • 响应
    • 视图
    • Blade 模板
    • 资源打包
    • URL 生成
    • 会话
    • 验证
    • 错误处理
    • 日志记录
  • 深入探讨

    • Artisan 控制台
    • 广播
    • 缓存
    • 集合
    • 并发
    • 上下文
    • 契约
    • 事件
    • 文件存储
    • 辅助函数
    • HTTP 客户端
    • 本地化
    • 邮件
    • 通知
    • 包开发
    • 进程
    • 队列
    • 速率限制
    • 字符串
    • 任务调度
  • 安全

    • 认证
    • 授权
    • 邮件验证
    • 加密
    • 哈希
    • 密码重置
  • 数据库

    • 快速开始
    • 查询构建器
    • 分页
    • 迁移
    • 数据填充
    • Redis
    • MongoDB
  • Eloquent ORM

    • 快速开始
    • 关系
    • 集合
    • 变换器/类型转换
    • API 资源
    • 序列化
    • 工厂
  • 测试

    • 快速开始
    • HTTP 测试
    • 控制台测试
    • 浏览器测试
    • 数据库测试
    • Mock 测试
  • 软件包

    • Breeze
    • Cashier(Stripe)
    • Cashier(Paddle)
    • Dusk
    • Envoy
    • Fortify
    • Folio
    • Homestead
    • Horizon
    • Jetstream
    • Mix
    • Octane
    • Passport
    • Pennant
    • Pint
    • Precognition
    • Prompts
    • Pulse
    • Reverb
    • Sail
    • Sanctum
    • Scout
    • Socialite
    • Telescope
    • Valet
  • API 文档

数据库测试
点赞
0
11.x
11.x 10.x 9.x 8.5 8.x 7.x 6.x 5.8 5.7 5.6 5.5 5.4 5.3 5.2 5.1

Laravel 11 中文文档 /

未匹配的标注
本文档最新版为 10.x,旧版本可能放弃维护,推荐阅读最新版!

Database Testing

  • 介绍
    • 每次测试后重置数据库
  • 模型工厂
  • 运行 Seeders
  • 可用的断言

介绍

Laravel 提供了各种有用的工具和断言,从而让测试数据库驱动变得更加容易。除此之外,Laravel 模型工厂和 Seeders 可以轻松地使用应用程序的 Eloquent 模型和关系来创建测试数据库记录。我们将在接下来的文档中讨论所有这些强大的功能。

每次测试后重置数据库

在进行测试之前,让我们讨论一下如何在每次测试后重置数据库,以便让先前测试的数据不会干扰后续测试。Laravel 包含的 Illuminate\Foundation\Testing\RefreshDatabase trait 会为你解决这个问题。只需在您的测试类上使用该 Trait:

<?php
# 译者注:Pest 例子
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

test('基础 例子', function () {
    $response = $this->get('/');

    // ...
});
<?php
# 译者注:PHPUnit 例子
namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    use RefreshDatabase;

    /**
     * 一个基础的功能测试例子。
     */
    public function test_basic_example(): void
    {
        $response = $this->get('/');

        // ...
    }
}

如果你的数据库结构是最新的,那么这个 TraitIlluminate\Foundation\Testing\RefreshDatabase 并不会迁移数据库。相反,它只会在一个数据库事务中执行测试。因此,如果不使用这个 Trait,任何由测试用例添加到数据库的记录,可能仍然存在于数据库中。

如果你想使用迁移来完全重置数据库,可以使用这个 Trait Illuminate\Foundation\Testing\DatabaseMigrations 或 Illuminate\Foundation\Testing\DatabaseTruncation 来替代。然而,选用他们明显比 RefreshDatabase Trait 要慢。

模型工厂

当我们测试的时候,可能需要在执行测试之前向数据库插入一些数据。
Laravel 允许你使用 模型工厂 为每个 Eloquent 模型 定义一组默认值,而不是在创建测试数据时手动指定每一列的值。

要学习有关创建和使用模型工厂来创建模型的更多信息,请参阅完整的 模型工厂文档。定义模型工厂后,你可以在测试中使用该工厂来创建模型:

# 译者注:Pest 例子
use App\Models\User;

test('模型 可被 实例化', function () {
    $user = User::factory()->create();

    // ...
});
# 译者注:PHPUnit 例子
use App\Models\User;

public function test_models_can_be_instantiated(): void
{
    $user = User::factory()->create();

    // ...
}

运行 seeders

如果你在功能测试时希望使用 数据库 seeders 来填充你的数据库, 你可以调用 seed 方法。 默认情况下, seed 方法将会执行 DatabaseSeeder, 它将会执行你的所有其他 seeders。或者,你传递指定的 seeder 类名给 seed 方法:

<?php
# 译者注:Pest 例子
use Database\Seeders\OrderStatusSeeder;
use Database\Seeders\TransactionStatusSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;

uses(RefreshDatabase::class);

test('订单 可被 创建', function () {
    // 运行 DatabaseSeeder...
    $this->seed();

    // 运行指定的 seeder...
    $this->seed(OrderStatusSeeder::class);

    // ...

    // 运营一个数组指定的 seeder...
    $this->seed([
        OrderStatusSeeder::class,
        TransactionStatusSeeder::class,
        // ...
    ]);
});
<?php
# 译者注:PHPUnit 例子
namespace Tests\Feature;

use Database\Seeders\OrderStatusSeeder;
use Database\Seeders\TransactionStatusSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;

class ExampleTest extends TestCase
{
    use RefreshDatabase;

    /**
     * 测试创建一个新订单。
     */
    public function test_orders_can_be_created(): void
    {
        // 运行 DatabaseSeeder...
        $this->seed();

        // 运行指定的 seeder...
        $this->seed(OrderStatusSeeder::class);

        // ...

        // 运营一个数组指定的 seeder...
        $this->seed([
            OrderStatusSeeder::class,
            TransactionStatusSeeder::class,
            // ...
        ]);
    }
}

或者通过 RefreshDatabase trait 在每次测试之前自动为数据库填充数据。你也可以通过在测试类上定义 $seed 属性来实现:

    <?php

    namespace Tests;

    use Illuminate\Foundation\Testing\TestCase as BaseTestCase;

    abstract class TestCase extends BaseTestCase
    {
        /**
         * 指示是否应在每次测试之前运行默认 seeder。
         *
         * @var bool
         */
        protected $seed = true;
    }

当 $seed 属性为 true 时,这个测试将在每个使用 RefreshDatabase trait 的测试之前运行 Database\Seeders\DatabaseSeeder 类。但是,你可以通过在测试类上定义 $seeder 属性来指定要执行的 seeder:

    use Database\Seeders\OrderStatusSeeder;

    /**
     * 在每个测试之前运行一个制定的 seeder。
     *
     * @var string
     */
    protected $seeder = OrderStatusSeeder::class;

可用的断言

Laravel 为你的 Pest 或 PHPUnit 功能测试提供了几个数据库断言。我们将在下面逐个讨论。

assertDatabaseCount

断言数据库中的表包含给定数量的记录:

    $this->assertDatabaseCount('users', 5);

assertDatabaseHas

断言数据库中的表包含给定键 / 值查询约束的记录:

    $this->assertDatabaseHas('users', [
        'email' => '[email protected]',
    ]);

assertDatabaseMissing

断言数据库中的表不包含给定键 / 值查询约束的记录:

    $this->assertDatabaseMissing('users', [
        'email' => '[email protected]',
    ]);

assertSoftDeleted

assertSoftDeleted 方法断言给定的 Eloquent 模型已被「软删除」的记录:

    $this->assertSoftDeleted($user);

assertNotSoftDeleted

assertNotSoftDeleted 方法断言给定的 Eloquent 模型没有被「软删除」的记录:

$this->assertNotSoftDeleted($user);

assertModelExists

断言数据库中存在给定的模型:

use App\Models\User;

$user = User::factory()->create();

$this->assertModelExists($user);

assertModelMissing

断言数据库中不存在给定的模型:

use App\Models\User;

$user = User::factory()->create();

$user->delete();

$this->assertModelMissing($user);

expectsDatabaseQueryCount

可以在测试开始时调用 expectsDatabaseQueryCount 方法,以指定你希望在测试期间运行的数据库查询总数。如果实际执行的查询数量与这个预期不完全匹配,那么测试将失败:

$this->expectsDatabaseQueryCount(5);

// Test...

本文章首发在 网站上。



原文地址:cndocs/11.x/da...

译文地址:cndocs/11.x/da...

上一篇 下一篇

成为Laravel合作伙伴

Laravel Partners是提供一流Laravel开发和咨询服务的精英商店。我们每个合作伙伴都可以帮助您制定一个精美,结构完善的项目.

我们的伙伴
Laravel
亮点
  • Our Team
  • 发布说明
  • 入门
  • 路由
  • Blade 模板
  • 身份验证
  • 用户授权
  • Artisan 控制台
  • 数据库
  • Eloquent ORM
  • 测试
资源
  • Laravel Bootcamp
  • Laracasts
  • Laravel News
  • Laracon
  • Laracon EU
  • Laracon India
  • Jobs
  • Forums
  • Trademark
  • 版本发布时间
  • 包开发
  • 命令行应用
  • TALL stack全栈开发
  • Blade UI Kit
  • 前端资源构建
伙伴
  • WebReinvent
  • Vehikl
  • Tighten
  • 64 Robots
  • Active Logic
  • Byte 5
  • Curotec
  • Cyber-Duck
  • DevSquad
  • Jump24
  • Kirschbaum
生态系统
  • Cashier
  • Dusk
  • Echo
  • Envoyer
  • Forge
  • Horizon
  • Nova
  • Octane
  • Sail
  • Sanctum
  • Scout
  • Spark
  • Telescope
  • Valet
  • Vapor

Laravel是一个具有表达力,优雅语法的Web应用程序框架。我们认为,发展必须是一种令人愉悦的创造力,才能真正实现。Laravel试图通过减轻大多数Web项目中使用的常见任务来减轻开发的痛苦.

Laravel是Taylor Otwell的商标.
Copyright © 2011-2025 Laravel中文网 LLC.

  • Twitter
  • GitHub
  • Discord
Laravel 全栈开发网 推荐使用阿里云 按Ctrl+D试试