在 Lumen 中进行单元测试时,数据库迁移和事务之间有什么区别?

Tyl*_*ing 2 unit-testing laravel lumen

根据 Lumen 5.3 文档:

使用迁移

一种选择是在每次测试后回滚数据库并在下一次测试之前迁移它。Lumen 提供了一个简单的 DatabaseMigrations trait,它会自动为你处理这个问题。只需在您的测试类上使用 trait:

<?php

use Laravel\Lumen\Testing\DatabaseMigrations; 
use Laravel\Lumen\Testing\DatabaseTransactions;

class ExampleTest extends TestCase 
{
    use DatabaseMigrations;

    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $this->get('/foo');
    } 
} 
Run Code Online (Sandbox Code Playgroud)

使用事务

另一种选择是将每个测试用例包装在一个数据库事务中。同样,Lumen 提供了一个方便的 DatabaseTransactions trait 来自动处理这个:

<?php

use Laravel\Lumen\Testing\DatabaseMigrations;
use Laravel\Lumen\Testing\DatabaseTransactions;

class ExampleTest extends TestCase 
{
    use DatabaseTransactions;

    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $this->get('/foo');
    } 
}
Run Code Online (Sandbox Code Playgroud)

如您所见,解释文本几乎相同,代码示例完全相同,除了 trait 用法。所以我很清楚,差异完全在于框架处理测试的方式。

这些有什么不同,你什么时候更喜欢一个?

如果一个区别与数据库驱动程序有关,我使用的是 MYSQL。

ace*_*777 5

DatabaseMigrations 在您运行测试时迁移数据库,然后在测试完成时回滚数据库。

DatabaseTransactions使用交易。从您的数据库插入的任何数据都将在测试后回滚。

两者之间的区别是DatabaseMigrations使用迁移(迁移您的数据库迁移然后在测试后回滚它)而DatabaseTransactions使用事务(从数据库插入的数据被回滚)

来源:https : //mattstauffer.co/blog/better-integration-testing-in-laravel-5.1-databasemigrations-databasetransactions-and-withoutmiddleware

  • 那么一个恰当的权衡总结是否会是迁移更安全但速度更慢,交易速度更快,但技术上处理实时数据,然后相信交易最终能够回滚? (2认同)