Laravel 自带了两种测试类型
- Feature Test: 功能测试。针对类似接口这种流程性的测试。
- Unit Test: 单元测试。针对单个函数这种输入输出结果的测试。
新建一个 Feature Test
php artisan make:test FinishOrderTest
项目根目录下多了一个文件
tests/Feature/FinishOrderTest.php
安装 phpunit
要执行测试案例,就需要安装 phpunit,否则会报错
zsh: command not found: phpunit
安装方法
composer require --dev phpunit/phpunit
注意,最好不要指定版本安装
[InvalidArgumentException] Package phpunit/phpunit at version ^7 has a PHP requirement incompatible with your PHP version (7.0.18)
执行测试案例
./vendor/bin/phpunit
一个订单相关的测试案例
cat tests/Feature/FinishOrderTest.php <?php namespace Tests\Feature; use Tests\TestCase; use Illuminate\Foundation\Testing\WithFaker; use Illuminate\Foundation\Testing\RefreshDatabase; use App\User; use App\Models\Order; class FinishOrderTest extends TestCase { // use RefreshDatabase; public function testFinishOrderAPI() { $user = factory(User::class)->create(['email' => 'user4@test.com']); $token = $user->createToken('token', [])->accessToken; $headers = ['Authorization' => "Bearer $token"]; $order = Order::orderBy("id", "desc")->first(); $this->json('post', '/api/finish_order', ["order_id" => $order->order_id,], $headers) ->assertStatus(200); } }
测试数据重置
对于没有使用 migraton 的项目,不要作死使用
use RefreshDatabase;
他的重置原理是重新运行 migrate, 删除所有数据表,然后执行 migrate 重建。。。
在没有 migration 文件的情况下,这就是作死。。。
为何要使用 factory
参考: https://laravel-news.com/learn-to-use-model-factories-in-laravel-5-1
可以同时使用在 seed 和 test case 中。用于自动生成伪造数据,例如 name, email 等。
参考代码
cat database/factories/UserFactory.php <?php use Faker\Generator as Faker; $factory->define(App\User::class, function (Faker $faker) { static $password; return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'password' => $password ?: $password = bcrypt('secret'), 'remember_token' => str_random(10), ]; });