在Laravel 5.4中每个测试类重置一次数据库

时间:2017-05-26 16:56:55

标签: phpunit laravel-5.4

我尝试使用Laravel 5.4 + PHPUnit来测试我的课程。我创建了以下类来测试用户控制器:

<?php

namespace Tests\Feature;

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

class UserControllerTest extends TestCase
{
protected $baseUrl = 'http://localhost/pmv2';

use DatabaseMigrations;

public function testCreatesUser()
{
    echo "\nTest: POST /users => Create new user";

    $data = [
        'first_name'   => 'first_new_user',
        'last_name'    => 'last_new_user',
        'email'        => 'email_new@pm.com',
        'password'     => 'new_password',
        'phone_number' => '3333333333',
        'status'       => 'active',
        'created_at'   => '2000-1-1 10:10:00',
        'updated_at'   => '2000-1-1 10:10:00',
    ];

    $response = $this->post('/users', $data);
    $response->assertStatus(200);

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

public function testReadAllUsers()
{
    $this->seed('UsersTableSeeder');

    echo "\nTest: GET /users => Read all users";

    $this->seed('UsersTableSeeder');

    $response = $this->get('/users');

    $response->assertStatus(200);
    $response->assertJson([
        'found' => true,
        'users' => [],
    ]);
}

public function testReadSingleUser()
{
    $this->seed('UsersTableSeeder');

    echo "\nTest: POST /users => Read single user";

    $response = $this->get('/users/1');

    $response->assertStatus(200);
    $response->assertJson([
        'found' => true,
        'user'  => [],
    ]);

}

public function testUpdateUser()
{
    $this->seed('UsersTableSeeder');

    echo "\nTest: POST /users => Create new user";

    $data = [
        'first_name'   => 'first_updated_user',
        'last_name'    => 'last_updated_user',
        'email'        => 'email_updated@pm.com',
        'password'     => 'updated_password',
        'phone_number' => '44444444444',
        'updated_at'   => '2000-1-1 10:10:00',
    ];

    $response = $this->put('/users/1', $data);

    $response->assertStatus(200);
    $this->assertDatabaseHas('users', ['email' => $data['email']]);
}
}

这里的问题是每次测试都会刷新数据库。我需要在第一次测试运行之前和最后一次测试之后刷新迁移一次。

2 个答案:

答案 0 :(得分:3)

这不是一个好主意:如果你需要它,这意味着你的测试不是独立的,甚至执行的顺序也会影响最终结果。

这不好:你应该遵循FIRST原则

  • F ast
  • 我是独立的/我是如此的
  • R repeatable
  • S elf validating
  • T imely

了解更多here

答案 1 :(得分:2)

创建用户后会发生什么?例如,在数据库中存在多一个用户。例如,您可以在POST调用之前和之后对用户进行计数。

你真的不需要测试POST,但是当提交POST调用时会发生什么。

你不测试/user/{id}是否存在。这使得测试依赖于id:测试必须是独立的。您可以在POST中进行相同的测试(创建用户),从响应或数据库中获取最后一个ID,然后获取该用户。这是一种检查数据库中完全相同的用户的方法。并且是一种删除id的方法。如果您依赖于ID,则测试仅运行一次。您的测试必须是可重复的。

每次花费太多时重置数据库。我建议你做以下几个步骤:

1)使用灯具重新创建数据库(正是您需要的测试)  2)运行所有测试

还要记住测试必须快速。持续时间超过15/20分钟的测试套件很慢!你需要快速。

阅读测试testReadSingleUser,我建议您手动创建用户&#34;,检索ID,最后获取具有该ID的用户。这使得测试可重复无限次。