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

时间:2016-11-25 23:59:26

标签: laravel unit-testing lumen

根据Lumen 5.3文档:

  

使用迁移

     

一种选择是在每次测试后回滚数据库并进行迁移   在下次测试之前。 Lumen提供了一个简单的DatabaseMigrations特性   这将自动为您处理。只需使用特征即可   你的考试班:

<?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');
    } 
} 
     

使用交易

     

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

<?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');
    } 
}

正如您所看到的,解释文本几乎完全相同,代码示例完全相同,但特性使用除外。所以我很清楚,差异完全在于框架处理测试的方式。

这些做法有何不同?你何时更喜欢一个?

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

2 个答案:

答案 0 :(得分:4)

运行测试时

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

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

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

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

答案 1 :(得分:0)

SQL中的事务使您可以回滚INSERTion,使用COMMIT提交您必须显式执行的插入。

这使您能够在不改变数据库本身的情况下进行单元测试。

迁移也是如此,但它们不会让您控制每一笔交易。