【问题标题】:Prepare database data before running all unit tests在运行所有单元测试之前准备数据库数据
【发布时间】:2021-07-05 11:34:55
【问题描述】:

我在 Laravel 中使用 PHPUnit 创建单元测试。在创建单元测试时,我遇到在一些测试中我需要准备数据库数据,例如选择现有记录、插入新记录等。

我根据我的应用程序功能分离了每个单元测试类。因此,例如我的应用程序有用户管理模块,那么我将有 UserManagementTests 类。在开始在这个类中运行单元测试方法之前,我想准备所有需要的数据库数据,这样我就不需要在每个方法中查询数据库来获取特定单元测试方法所需的数据。

我是 PHPUnit 新手,不知道应该用什么关键字搜索这个问题。

其他信息:

  • 我的应用程序使用多个数据库
  • 每个数据库都已经存在数据,并且在测试期间不应删除其中的大部分数据。因此,对于某些测试,我的选择是创建新记录、运行测试并删除创建的记录以保留数据库的原始状态 - 我使用 Laravel 的 DatabaseTransactions 特性来执行此操作。

【问题讨论】:

  • 如果您的模型有工厂,您可以使用setUp 方法或测试方法中的工厂来准备所需的数据。
  • 不幸的是,每节课前准备数据并不容易。在每次测试之前使用setUptearDown 删除数据要容易得多(或者像你一样使用特征DatabaseTransactions
  • @apokryfos 是的,这就是我意识到的......所以我只是坚持使用 DatabaseTransactions 并为每个类创建方法来准备每个测试类中的测试所需的数据。所以至少我不必在每个单元测试方法中复制相同的代码来准备数据

标签: laravel unit-testing phpunit


【解决方案1】:

如果您在播种器类中获得了所需的所有数据,您可以根据需要在测试方法或测试类的 setUp() 方法中调用它们。

use Illuminate\Support\Facades\Artisan;

Artisan::call('db:seed', ['--class' => 'MySeederClass', '--database' => 'testingDatabase']);

【讨论】:

  • 不幸的是,我不使用播种器类。我需要查询当前数据库状态并使用该数据
  • 我每天都将我的实时数据库复制到我的开发数据库中,这是我获取所有“现有”数据的地方
  • 然后只需在config/database.php 中创建一个数据库配置选项并将其用作phpunit.xml 中的DB_CONNECTION。但是,由于您的测试数据库每天都在变化,因此不能保证您的测试每次都能正常工作。
猜你喜欢
  • 2013-04-25
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多