前言
当前使用Laravel8.x
一代版本一代神
创建测试文件
# 项目根目录下使用php artisan 命令创建
php artisan make:test UserTest
# tests/Feature/UserTest.php
# 类中的每一个public方法即一个测试用例
# 需要进行数据库,缓存...相关测试
# 请配置 项目根目录下 phpunit.xml 文件
运行测试
# 测试 tests/Feature 下所有测试文件
# 不符合预期则输出具体位置&差异
php artisan test --testsuite=Feature --stop-on-failure
DatabaseTransactions
# use Illuminate\Foundation\Testing\DatabaseTransactions
# 测试类可以使用这个Trait
# 使用的作用:测试中对数据库的操作,在测试结束后不同步到数据库(不影响数据库)
http测试
# http 请求
# method 请求方法:get,post,put......
# url 请求地址 string
# params 请求参数 array
# headers http header 头信息设置 array
# 返回 response
$this->"method"("url","params","headers")
# 断言响应http状态码
$response->assertStatus(200);
# 断言响应http body的某些参数是否含相等
$response->assertJson(['code' => 10001]);
常用断言
# 判断两个值是否相等
# message 不相等时的信息提示
$this->assertEquals("value1","value2","message");
# 判断两个值是否不相等
$this->assertNotEquals("value1","value2","message");
# 判断值是否为空
$this->assertEmpty("value","message");
# 判断值是否不为空
$this->assertNotNull("value","message");
# 断言 value 这个"值"(不是key) 在 haystack 中存在
$this->assertContains("value","haystack");
# 示例 返回true
$this->assertContains('a', [0 => 'a']);
添加测试数据
# 有时候测试需要添加测试数据
# 总不能自己写sql造假数据
# 可以使用数据工厂类添加假数据
# 1.创建数据工厂类
php artisan make:factory “工厂类名” --model=“对应的数据库模型”
# 示例:
php artisan make:factory UserFactory --model=App/Models/Auth/User
# 这个例子创建的命名空间不对,因为我的模型是 App/Models/Auth/User.php
# 不是 App/Models/User
# 但是通过artisan 生成的命名空间是 namespace Database\Factories\Auth
# 不符合psr规范,所以要改
# 顺便指定工厂绑定的模型,设置model属性
# definition() 中定义创建数据的字段内容
# 结果如下:
namespace Database\Factories;
use App\Models\Auth\User;
use Illuminate\Database\Eloquent\Factories\Factory;
class UserFactory extends Factory
{
protected $model = User::class;
public function definition()
{
return [
'name' => $this->faker->name,
'mobile' => $this->faker->phoneNumber,
'password' => $this->faker->password,
'creator' => 1,
'updater' => 1,
'created_at' => now(),
'updated_at' => now(),
];
}
}
$this->faker 提供了生成数据内容的方法
介绍常用方法
# 注意事项 配置config/app.php
# 默认en_us 插入的数据格式不符合中国的标准
'faker_locale' => 'zh_CN'
# 生成名称
$this->faker->name;
# 生成手机号
$this->faker->phoneNumber;
# 生成邮箱
$this->faker->email;
# 生成图片地址
$this->faker->imageUrl;
数据工厂类的使用
单表创建
# new 实例化
# count(total) 指定创建条数
# create() 创建数据
UserFactory::new()->count(10)->create();
# user 表创建了10条数据
namespace Tests\Feature;
use Database\Factories\UserFactory;
use Tests\TestCase;
class UserTest extends TestCase
{
/**
* A basic feature test example.
*
* @return void
*/
public function test_example()
{
UserFactory::new()->count(10)->create();
$this->assertNotNull("successful");
}
}
关联创建
# 上面介绍了单个表数据填充
# 现在来填充两张有关联关系表的数据表
# user 用户表 post 文章表
# 关联关系 post.user_id = user.id
# 可以使用 afterCreating() 在执行UserFactory后 获取创建的user信息后执行PostFactory
# 使用state()给post添加user_id
PostFactory
namespace Database\Factories;
use Illuminate\Database\Eloquent\Factories\Factory;
class PostFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array
*/
public function definition()
{
return [
'title' => $this->faker->title,
'created_at' => now(),
'updated_at' => now(),
];
}
}
填充两张表数据
namespace Tests\Feature;
use Database\Factories\PostFactory;
use Database\Factories\UserFactory;
use Tests\TestCase;
class UserTest extends TestCase
{
/**
* A basic feature test example.
*
* @return void
*/
public function test_example()
{
UserFactory::new()->count(10)->afterCreating(function ($user) {
PostFactory::new()->count(1)->state(function () use ($user) {
return ['user_id' => $user->id];
})->create();
})->create();
$this->assertNotNull("successful");
}
}