2016-11-25 8 views
0

согласно 5.3 документации Lumen:В чем разница между миграциями баз данных и транзакциями при модульном тестировании в Lumen?

Использование Миграции

Один вариант заключается в откатить базу данных после каждого теста и перенести его до следующего испытания. 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

DatabaseMigrations переносит базу данных при запуске теста, а затем откатывает dabase, когда тест завершен.

DatabaseTransactions использует сделка. Любые данные, вставленные из вашей базы данных, будут возвращены после теста.

Разница между ними состоит в том DatabaseMigrations использует миграция (мигрирует миграцию базы данных затем прокатка его обратно после теста), а DatabaseTransactions использует транзакцию (вставленные данные из базы данных являются rolledback)

Источник: https://mattstauffer.co/blog/better-integration-testing-in-laravel-5.1-databasemigrations-databasetransactions-and-withoutmiddleware

+1

Таким образом, было бы целесообразным компромиссное заключение о том, что Миграции более безопасны, но медленнее, а транзакции быстрее, но технически работают над живыми данными, а затем доверяют, что транзакции смогут быть отброшены в конце? –

0

Сделка в SQL дает возможность откат INSERTION, чтобы зафиксировать вставку, которую вы должны явно сделать с помощью COMMIT.

Это дает возможность выполнять модульные тесты без изменения самой базы данных.

То же самое касается миграций, но они не дают вам контроля над каждой транзакцией.