Как писать юнит-тесты для скриптов которые работают с базами данных?

240
10 января 2018, 15:54

Добрый день, подскажите пожалуйста какие существуют подходы если нужно протестировать части веб-приложения которые работают с базой данных изменяя ее содержимое, но которые не меняют структуру таблиц

Answer 1

Способ с непосредственным изменением данных в БД

Скрипт. Функция (метод) выполняют какие-либо реальные действия с данными в БД. Тестовый скрипт затем выполняет выборку проверяемых данных из БД, сверяет их с ожидаемыми и выводить результат проверки. После теста, изменённые данные возвращают в исходное состояние или удаляют.

Способ без взаимодействия с БД в принципе (mock-объекты)

Вместо драйвера (или любого механизма, который выполнят непосредственного взаимодействие с БД), используется его имитационный (mock) вариант, с преднастроенными результатами для конкретных SQL запросов. Например:

объектБД = инициироватьЛожноеПодключениеБД;
объектБД->добавитьЛожныйЗапрос(
   'SELECT name FROM users WHERE id = ?', # для данного запроса
   [ ['Иван'] ]                           # выдать такой результат
);
функция получитьИмяПользователя (номерПользователя) {
    ...
    # объектБД - это "ложный" объект для работы с БД, который лишь
    #            делает вид, что взаимодействует с БД
    выборка = объектБД->выполнить(
        'SELECT name FROM users WHERE id = ?', номерПользователя
    );
    ...
    возвратить выборка[0][0];
}
В тесте:
равно(получитьИмяПользователя(), "Иван", "имя пользователя Иван");
Answer 2

зависит от фреймворка. Часто ORM позволяет накрутить объекты «в памяти», без обращения к БД. Часто можно использовать подменную SQLite-базу, которая тоже будет в памяти и работать быстро.

А вообще, коль скоро вопрос о юнит-тестах — юниты, отвечающие за работу с моделями, должны быть отделены от собственно базы данных (например, тем же ORM).

Если не отделены — то это не юнит, а интеграционное тестирование %)

READ ALSO
Сортировка в нужном порядке

Сортировка в нужном порядке

Требуется создать свой порядок сортировки вида: 1,2,3,null,null,null,nullПробовал создать дополнительное поле, и пронумеровать нужное

184
GetKeyboardState: определение состояния клавиши

GetKeyboardState: определение состояния клавиши

Не могу понять как работает функция GetKeyboardStateВроде как должна определять состояние всех клавиш, но правильность результата зависит от места...

212
Не могу подключиться к Ораклу из VS2017

Не могу подключиться к Ораклу из VS2017

Пишу под ASPNET MVC Framework веб-сервис, который должен работать с СУБД Oracle

229