测试对于Web开发是至关重要的。Laravel模型工厂以一种可预测和容易复制的方式来定义数据库记录,这样你的应用程序的测试是一致和可控的。模型工厂为你的每一个Eloquent模型定义一组默认属性.
例如,如果你正在做一个博客应用,允许作者和版主在上线前批准评论,你就需要在部署给用户之前测试该功能是否正常工作。所有这些都需要测试数据。
要测试上述的博客应用程序,你需要评论数据来模仿和测试你的应用程序的功能。Laravel允许你通过使用Laravel工厂和Faker来生成假的数据,而不需要从实际用户那里获得评论。
这篇文章解释了如何在没有真实用户评论的情况下获得评论数据。
先决条件
要完成本教程,你必须熟悉以下内容:
- XAMPP
- Composer
XAMPP是一个免费的、易于安装的Apache发行版,包含PHP、Perl和MariaDB–一个MySQL数据库。本教程使用最新的版本,即8.1.10,它安装了PHP 8.1.10。如果为MacOS安装XAMPP,请阅读这篇文章,如果为Linux安装,请阅读本指南。本教程在Windows上使用XAMPP。
Composer是一个工具,允许你定义、安装和下载你的Web应用在开发和生产中所依赖的软件包。本教程使用Composer的v2.4.4版本,需要PHP7.2以上版本。你使用Composer来安装本教程的Laravel安装程序。
你也可以下载项目的完整代码来进行学习。
如何设置项目
在本节中, 你将创建一个Laravel项目并将其连接到数据库. 让我们来看看这一切,以及如何完成它。
安装Laravel安装程序
为了快速创建一个Laravel项目, 安装Laravel安装程序:
composer global require laravel/installer
这段代码会在你的机器上全局安装Laravel安装程序.
创建一个Laravel项目
接下来, 通过运行以下程序创建一个Laravel项目:
laravel new app-name
这段代码引导了一个新的Laravel项目,并安装了所有的依赖项:
创建Laravel项目
另一个更简单的方法是直接使用Composer来安装Laravel。
composer create-project laravel/laravel app-name
使用上面的方法时,你不需要安装Laravel的安装程序。
启动应用程序
现在你可以把目录改成app-name,然后用Laravel自己的命令行界面(CLI)工具Artisan来启动这个项目:
php artisan serve
这段代码开始项目,并将其连接到localhost:8000或任何其他可用的端口,如果8000端口正在使用。在localhost:8000上, 你应该看到像这样的东西:
Laravel
创建数据库表格
为了将你的应用程序连接到数据库,你必须使用XAMPP的PHPMyAdmin图形用户界面创建一个新的数据库。进入localhost/phpmyadmin,在侧边栏上点击New:
创建数据库
上面的图片显示了Create Database表格,app_name是数据库名称。
单击 “Create” 来创建数据库。
编辑.env文件
为了将你的应用程序连接到数据库,你必须编辑.env文件中的DB部分:
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=app_name
DB_USERNAME=root
DB_PASSWORD=
这段代码用你的数据库名称、用户名、端口、密码和主机来填充数据库凭证。你现在可以开始创建工厂和模型了。
注意:用你的数据库凭证替换这些值。另外,如果你遇到 “Access denied for user” 的错误,把 DB_USERNAME
和 DB_PASSWORD
的值放在双引号中。
如何生成假数据
在创建应用程序并将其连接到数据库后,你现在可以创建必要的文件来在数据库中生成假数据。
创建评论模型
创建模型文件以与数据库表进行交互。要创建一个模型,请使用Artisan:
php artisan make:model Comment
这段代码在app/Models文件夹下创建了一个Comment.php文件,其中有一些模板代码。在 use HasFactory;
行下面添加以下代码:
protected $fillable = [
'name',
'email',
'body',
'approved',
'likes'
];
这段代码列出了你想允许大量分配的字段, 因为Laravel默认会保护你的数据库不被大量分配。Comment模型文件现在看起来应该是这样的:
评论模型文件
创建迁移文件
在创建了模型文件并声明了 $fillable
数组后,你必须使用下面的命令创建迁移文件:
php artisan make:migration create_comments_table
注意:在Laravel中,创建迁移文件的命名规则通常是 snake_case
,也被称为 underscore_case
。第一个词是动作, 第二个词是模型的复数, 最后一个词是在项目内创建的功能。这意味着你在为Book模型创建迁移时要写 create_books_table
。
这段代码在database/migrations文件夹下创建了一个名为yyyy_mm_dd_hhmmss_create_comments_table的文件。
接下来,编辑yyy_mm_dd_hhmmss_create_comments_table里面的up函数:
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email');
$table->longText('body');
$table->boolean('approved');
$table->integer('likes')->default(0);
$table->timestamps();
});
}
这段代码创建了一个模式,该模式创建了一个表,列有:id
, name
, email
, body
, approved
, likes
, 和 timestamps
.
运行迁移程序
在你用命令行运行迁移文件之前,创建和编辑迁移文件不会有任何作用。如果你看一下数据库管理器,它仍然是空的。
用Artisan来运行迁移文件:
php artisan migrate
这个命令在database/migrations中运行所有的迁移,因为这是自创建应用程序以来的第一次迁移:
成功的迁移
下面的图片显示了你所运行的所有迁移文件。每个文件代表数据库中的一个表:
迁移后的数据库
创建CommentFactory文件
创建一个工厂文件,包含你的定义函数。在这个演示中,你将使用Artisan创建一个工厂:
php artisan make:factory CommentFactory.php
这段代码在database/factories文件夹下创建了一个CommentFactory.php文件。
定义函数
CommentFactory里面的函数定义了Faker如何生成假数据。把它编辑成这个样子:
public function definition()
{
return [
'name' => $this->faker->name(),
'email' => $this->faker->email(),
'body' => $this->faker->sentence(45),
'approved' => $this->faker->boolean(),
'likes' => $this->faker->randomNumber(5)
];
}
这段代码告诉Faker生成以下内容:
- 一个名字
- 一个电子邮件地址
- 一个包含45个句子的段落
- 一个只能为真或假的批准值
- 一个在0到9999之间的随机数
将评论模型连接到CommentFactory
通过在定义上方声明一个受保护的$ model
变量,将 Comment
模型连接到 CommentFactory
:
protected $model = Comment::class;
同时,在文件的依赖性中加入 use App\Models\Comment;
。现在CommentFactory文件应该看起来像这样:
CommentFactory文件
如何Seed数据库
编程中的Seed意味着为数据库生成随机的假数据,用于测试。
现在你已经创建了模型,运行了迁移,并在CommentFactory中创建了定义,使用DatabaseSeeder文件运行种子程序。
创建CommentSeeder文件
创建一个seeder文件,使用工厂来生成数据:
php artisan make:seeder CommentSeeder.php
这段代码在database/seeders文件夹中创建了一个CommentSeeder.php文件。
编辑运行函数
将Comment模型连接到CommentSeeder上。在运行函数中添加以下代码:
Comment::factory()->count(50)->create();
这段代码告诉CommentSeeder使用Comment模型和CommentFactory的定义函数,在数据库中生成50条评论。同时,在文件的依赖关系中加入 use App/Models/Comment;
。现在CommentSeeder文件应该看起来像这样:
CommentSeeder文件
注意:你可以配置Faker来创建本地数据。例如,你可以通过在app/config.php文件内将 faker_locale
设置为 it_IT
,使其生成意大利语名称而不是随机名称。你可以在本指南中阅读更多关于Faker Locales的信息。
运行Seeder
接下来,用Artisan运行seeder文件:
php artisan db:seed --class=CommentSeeder
这段代码运行了seeder文件,并在数据库中生成了50行假数据。
数据库seed成功
现在数据库应该有50行假数据,你可以用它来测试你的应用程序的功能:
数据库中的50行数据
如何重置数据库
当使用生成的数据进行测试时,每次运行测试时都要重置数据库。假设你想测试批准的评论切换功能。在每次测试后刷新数据库,以确保以前生成的数据不会干扰未来的测试。
使用RefreshDatabase
使用test文件中的 RefreshDatabase
特性来刷新数据库。
导航到Test/Feature文件夹内的ExampleTest.php,在评论的 use Illuminate\Foundation\Testing\RefreshDatabase;
并在 test_the_application_returns_a_successful_response
函数上方添加以下一行代码:
use RefreshDatabase;
ExampleTest.php文件现在应该看起来像这样:
ExampleTest文件
运行测试
在测试文件中添加 RefreshDatabase
特性后,使用Artisan运行测试:
php artisan test
这段代码运行应用程序中的所有测试,并在测试后刷新数据库,如下图所示:
一个成功的Artisan测试
现在,检查数据库,看到空的评论表:
空的评论数据库
小结
这篇文章涵盖了如何创建一个Laravel项目,将其连接到数据库,并创建和配置模型,迁移,工厂和seeder文件来生成数据库的随机数据。它还讨论了如何在运行测试后重置数据库。
现在你已经看到了Laravel工厂和Faker是如何在几分钟内轻松生成任何数量的测试数据来测试一个应用程序,甚至作为一个占位符 – 只需最小的配置。
评论留言