Как да изчистя и мигрирам базата данни автоматично за тестване?

Създавам API с Yii2 и имам някои API тестове за кодиране, работещи с тестова база данни. Въпреки това бих искал да изчистя и мигрирам базата данни при всеки кръг от тестване.

Как да направя това? Никъде не намирам отговор.


person Dubby    schedule 27.03.2015    source източник
comment
Не знам как точно трябва да работи това, което правите, но не би ли било толкова лесно като създаването на някакво действие вътре в контролер, който ще изпълнява голям sql файл, който премахва всички таблици и ги създава отново? Тогава преди вашите тестове просто се обадете на тази страница.   -  person Alexandru Trandafir Catalin    schedule 27.03.2015
comment
Сигурен съм, че трябва да има по-добър, по-малко хакерски начин да го направите. Освен това добавянето на действие на контролера за изчистване на базата данни звучи много рисковано.   -  person Dubby    schedule 27.03.2015
comment
Други идеи: за хакерския начин, за да го защитите, можете да подадете токен в url или да ограничите до локален ip. Видях, че Yii също има Fixtures, не съм сигурен дали са от полза за вас, и на последно място, тъй като споменахте кодиране тук, той описва какво точно искате да направите: codeception.com/docs/09-Data   -  person Alexandru Trandafir Catalin    schedule 27.03.2015


Отговори (2)


Миграциите на Yii са проектирани да правят точно това, което искате. Има пълна документация за създаването им тук. Недостатъкът е, че имате нужда от достъп до командния ред. Ако нямате това, пак можете да използвате миграции, но трябва да създадете нов екземпляр на конзолно приложение. Вижте тук за дискусия точно на това проблем.

Що се отнася до риска от това действие на контролера да изчисти базата данни, съгласен съм, че може да е рисковано, но можете да ограничите действието само до администраторски потребители, като използвате правила, и може би дори да използвате формуляр, за да инициирате действието, за да можете да използвате csrf токени за валидирайте подаването и разрешавайте действието само чрез метода post. Ако имате нужда от насоки как да направите това, мога да актуализирам отговора си.

person Joe Miller    schedule 27.03.2015
comment
Благодаря за отговора Да, използвам (и обичам) миграции и искам те да се изпълняват автоматично, когато провеждам тестове. Работих върху проект на Laravel в продължение на няколко месеца и всеки тестов файл започваше с нова база данни (попълнена със специфични модули). Бих искал да копирам това в Yii2, но не знам как. Мисля, че засега ще създам действие на контролера за премахване и мигриране на базата данни за всеки тестов файл. - person Dubby; 27.03.2015
comment
Всъщност нямам нужда от действие на контролера за това. Ще напиша персонализиран метод, който може да бъде извикан, за да постигне това. - person Dubby; 27.03.2015

Независимо от тестването на API, връщането на съдържанието на базата данни до определено състояние със сигурност може да се направи с помощта на миграции, но не мисля, че това е най-доброто решение, което можете да имате, решението за това трябва да бъде използването на Fixtures.

Вижте повече информация относно фикстурите в официалната документация: http://www.yiiframework.com/doc-2.0/guide-test-fixtures.html

След като внедрите приспособленията (трябва да е съвсем ясно, в противен случай просто отворете друга публикация), вероятно ще разберете, че миграциите всъщност може да са необходими така или иначе, за да се поддържа структурата на базата данни в синхрон.

Тази задача може да бъде извършена ръчно от разработчика, преди да се ангажира да създаде какъвто и да е тест, или автоматично, ако имате CI сървър.

Още веднъж, не е необходимо да се изпълняват миграции всеки път, когато стартирате тест, само в началото. Приспособленията са това, от което се нуждаете, за да доведете базата данни до определено състояние по време на всеки тип тест.

person Mr Peach    schedule 30.03.2015
comment
Възнамерявам да използвам приспособления, но някои тестове изискват създаването на модели за тестване на работния процес на създаване, удостоверяване, оторизация и взаимоотношения. Ако добавя потребители в един тест, не искам това да засяга други тестове, които може да очакват определен брой потребители (или друг модел) например. - person Dubby; 02.04.2015
comment
И когато казвам миграции, имам предвид, че искам базата данни да се надстрои автоматично до най-новата миграция, вместо да го правя ръчно. - person Dubby; 02.04.2015
comment
@Dubby Мисля, че има малко объркване: това наистина се свежда до начина, по който организирате работата и кодовата си база. Функциите, които разработвате, трябва да са самостоятелни, ако искате тестовете да се изпълняват отделно и да не оказват влияние върху работата на другите. Както обяснявах, вие наистина имате нужда от миграции, но те са необходими само в самото начало, преди да стартирате тестовете: в нормална система за непрекъсната интеграция миграциите ще се изпълняват автоматично. Codeception, който изпълнява тестовете, не е запознат с Yii и неговата миграционна инфраструктура, така че тази ситуация е съвсем очаквана. Надявам се това да помогне. - person Mr Peach; 02.04.2015
comment
Благодаря @The_Peach. Да, разбирам това и вероятно ще добавя някакъв код към tests/_bootstrap.php, за да проверя за миграции, надявайки се, че ще се изпълнява само веднъж при изпълнение на тестове. Харесвам термина self contained. Как да постигна това? Записите, добавени в един тест, не се премахват в края. Това е моят API тест, който не изчиства стойностите: gist.github.com/anonymous/fe05253bf0364cde349b - person Dubby; 04.04.2015
comment
Приспособленията @Dubby са това, което търсите, вижте отговора по-горе за повече информация как да ги настроите. Приспособленията са единственият начин да се контролира съдържанието на db за тестове. - person Mr Peach; 07.04.2015