Каков правильный способ установки и семени базы данных с помощью искусственных данных для тестирования интеграции
Предположим, у меня есть две таблицы в базе данных, одна называется students
а другая называется departments
. students
выглядят следующим образом:
department_id, student_id, class, name, age, gender, rank
и departments
выглядят так:
department_id, department_name, campus_id, number_of_faculty
У меня есть API, который может запрашивать базу данных и извлекать различную информацию из двух таблиц. Например, у меня есть конечная точка, которая может получить количество студентов в каждом кампусе, объединив 2 таблицы.
- пакет Kotlin .kt класс в JAR
- Компилировать код kotlin как для JVM, так и для JavaScript
- Многопоточность с использованием Kotlin Corouts
- Простой способ узнать, является ли класс анонимным / объектом и получить конкретное имя класса из экземпляра в Котлине
- «Тип свойства не является подтипом переопределенного абстрактного значения val» в многонаследованном поле
Я хочу выполнить интеграционное тестирование для конечных точек API. Для этого я создаю локальную базу данных, запускаю миграцию схем базы данных для создания таблиц, а затем заполняю каждую таблицу искусственными записями, чтобы точно знать, что находится в базе данных. Но приход с хорошим процессом посева оказался чем-то легким. Для простого примера, описанного выше, мой текущий подход включает в себя создание нескольких разных записей для каждого столбца. Например, мне нужно как минимум 2 студенческих городка (скажем, main
и satellite
) и 3 отдела (например, Electrical Engineering
и Mathematics
для main
кампуса и English
для кампуса для satellite
). Тогда мне нужно как минимум 2 студента в каждом отделе или всего 6 студентов. И если я смешиваю по gender
, age
и rank
, вы можете легко увидеть, что количество искусственных записей растет экспоненциально. Придумывание всех этих искусственных записей является ручным и, следовательно, утомительным для поддержания.
Поэтому мой вопрос: каков правильный способ настройки и семенной базы данных для тестирования интеграции в целом?
- Как использовать библиотеку kmongo для оператора slice
- Не удалось запустить приложение Kotlin в Eclipse
- Являются ли числовые операции с использованием Kotlin столь же быстрыми, как эквивалент с Java-примитивами?
- У Котлина есть сборщик мусора? Если да, то на каком алгоритме он основан?
- Ошибка: не удалось найти или загрузить основной класс Hello.class
- Что такое объект объекта в Котлине
- Мой проект Kotlin Не удается разрешить зависимости от Travis-CI
- Приложение Kotlin с плагином приложения Gradle
Во-первых, я не знаю никакого общедоступного инструмента, который автоматизирует задачу генерации тестовых данных для произвольных сценариев.
На самом деле это сложная задача в целом. Вы можете искать научные статьи и книги по этой теме. Это могут быть те. К сожалению, у меня нет рекомендаций по набору «хороших».
Весьма тривиальный подход – генерация случайных данных, взятых из набора потенциальных значений для каждого поля (столбец в случае базы данных). (Это то, что вы уже сделали.) Для небольших наборов вы можете даже генерировать полный набор потенциальных комбинаций. Например, вы можете посмотреть на следующий генератор тестовых данных для примера, применяющего вариант такого подхода.
Однако это может быть неприемлемо по следующим причинам:
- результирующие данные будут демонстрировать значительную избыточность, хотя могут все еще не охватывать все интересные случаи.
- он может создавать несогласованные данные в отношении логических ограничений, которые ваше приложение будет применять в противном случае (например, ссылочная целостность)
Вы можете решить такие проблемы, добавив некоторые ограничения в процесс генерации тестовых данных для устранения недопустимых или избыточных комбинаций (применительно к вашему приложению).
Однако фактическое ограничение (и смысл) зависит от вашего бизнеса и случаев использования. Таким образом, нет общего правила в отношении таких ограничений. Например, если ваш API предоставляет специальное лечение для возрастных ценностей на основе гендерных комбинаций возраста и пола, важно для ваших тестов, если такое различие не существует, любая комбинация возраста и пола будет в порядке.
До тех пор, пока вы ищете сценарии тестирования белого ящика , вам нужно будет указать данные о вашей реализации (или, по крайней мере, спецификации).
Для тестирования черного ящика будет достаточно полного набора комбинаторных данных. Тогда проблема только в сокращении тестовых данных для обеспечения времени выполнения тестов в пределах некоторого максимума.
Когда вы имеете дело с тестированием белого ящика , вы можете явно искать добавление в угловые случаи. Например, в вашем случае: отдел без какого-либо студента, отдел с одним студентом, студенты без отдела, если такой сценарий имеет смысл в ваших целях тестирования. (например, при тестировании обработки ошибок или тестировании того, как ваше приложение будет обрабатывать несогласованные данные.)
В вашем случае вы просматриваете свой API как основной вид данных. Содержимое базы данных – это только вход, необходимый для достижения всех интересных результатов от этого API. Фактическая задача определения надлежащего содержимого базы данных может быть описана математической задачей обеспечения обратного отображения, предоставляемого вашим приложением (от содержимого базы данных до результата API).
При отсутствии готового инструмента вы можете применить следующие действия:
- начать с простого генератора комбинаторных данных
- применять некоторые ограничения, исключающие бесполезные или незаконные записи
-
запускать тесты, фиксируя данные о покрытии, добавлять дополнительные данные для улучшения повторного тестирования покрытия, пока покрытие не будет выполнено
-
просматривать и корректировать данные после любых изменений кода или схемы
Я думаю, что DbUnit может быть правильным инструментом для того, что вы пытаетесь сделать. Вы можете указать состояние своей базы данных перед тестированием и проверить ожидаемое состояние после.
Если вам нужно инициализировать базу данных таблицами и фиктивными данными с помощью Junit,
Я использую Unitils или DbUnit
Данные в Unitils могут быть загружены из XML-файлов внутри вашей папки ресурсов, поэтому, как только запускается тестовый бегун, он загрузит весь контент из xml и вставляет его в базу данных, пожалуйста, посмотрите примеры на своем веб-сайте.