Каков правильный способ установки и семени базы данных с помощью искусственных данных для тестирования интеграции

Предположим, у меня есть две таблицы в базе данных, одна называется students а другая называется departments . students выглядят следующим образом:

 department_id, student_id, class, name, age, gender, rank 

и departments выглядят так:

 department_id, department_name, campus_id, number_of_faculty 

У меня есть API, который может запрашивать базу данных и извлекать различную информацию из двух таблиц. Например, у меня есть конечная точка, которая может получить количество студентов в каждом кампусе, объединив 2 таблицы.

Я хочу выполнить интеграционное тестирование для конечных точек API. Для этого я создаю локальную базу данных, запускаю миграцию схем базы данных для создания таблиц, а затем заполняю каждую таблицу искусственными записями, чтобы точно знать, что находится в базе данных. Но приход с хорошим процессом посева оказался чем-то легким. Для простого примера, описанного выше, мой текущий подход включает в себя создание нескольких разных записей для каждого столбца. Например, мне нужно как минимум 2 студенческих городка (скажем, main и satellite ) и 3 отдела (например, Electrical Engineering и Mathematics для main кампуса и English для кампуса для satellite ). Тогда мне нужно как минимум 2 студента в каждом отделе или всего 6 студентов. И если я смешиваю по gender , age и rank , вы можете легко увидеть, что количество искусственных записей растет экспоненциально. Придумывание всех этих искусственных записей является ручным и, следовательно, утомительным для поддержания.

Поэтому мой вопрос: каков правильный способ настройки и семенной базы данных для тестирования интеграции в целом?

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

На самом деле это сложная задача в целом. Вы можете искать научные статьи и книги по этой теме. Это могут быть те. К сожалению, у меня нет рекомендаций по набору «хороших».

Весьма тривиальный подход – генерация случайных данных, взятых из набора потенциальных значений для каждого поля (столбец в случае базы данных). (Это то, что вы уже сделали.) Для небольших наборов вы можете даже генерировать полный набор потенциальных комбинаций. Например, вы можете посмотреть на следующий генератор тестовых данных для примера, применяющего вариант такого подхода.

Однако это может быть неприемлемо по следующим причинам:

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

Вы можете решить такие проблемы, добавив некоторые ограничения в процесс генерации тестовых данных для устранения недопустимых или избыточных комбинаций (применительно к вашему приложению).

Однако фактическое ограничение (и смысл) зависит от вашего бизнеса и случаев использования. Таким образом, нет общего правила в отношении таких ограничений. Например, если ваш API предоставляет специальное лечение для возрастных ценностей на основе гендерных комбинаций возраста и пола, важно для ваших тестов, если такое различие не существует, любая комбинация возраста и пола будет в порядке.

До тех пор, пока вы ищете сценарии тестирования белого ящика , вам нужно будет указать данные о вашей реализации (или, по крайней мере, спецификации).

Для тестирования черного ящика будет достаточно полного набора комбинаторных данных. Тогда проблема только в сокращении тестовых данных для обеспечения времени выполнения тестов в пределах некоторого максимума.

Когда вы имеете дело с тестированием белого ящика , вы можете явно искать добавление в угловые случаи. Например, в вашем случае: отдел без какого-либо студента, отдел с одним студентом, студенты без отдела, если такой сценарий имеет смысл в ваших целях тестирования. (например, при тестировании обработки ошибок или тестировании того, как ваше приложение будет обрабатывать несогласованные данные.)

В вашем случае вы просматриваете свой API как основной вид данных. Содержимое базы данных – это только вход, необходимый для достижения всех интересных результатов от этого API. Фактическая задача определения надлежащего содержимого базы данных может быть описана математической задачей обеспечения обратного отображения, предоставляемого вашим приложением (от содержимого базы данных до результата API).

При отсутствии готового инструмента вы можете применить следующие действия:

  1. начать с простого генератора комбинаторных данных
  2. применять некоторые ограничения, исключающие бесполезные или незаконные записи
  3. запускать тесты, фиксируя данные о покрытии, добавлять дополнительные данные для улучшения повторного тестирования покрытия, пока покрытие не будет выполнено

  4. просматривать и корректировать данные после любых изменений кода или схемы

Я думаю, что DbUnit может быть правильным инструментом для того, что вы пытаетесь сделать. Вы можете указать состояние своей базы данных перед тестированием и проверить ожидаемое состояние после.

Если вам нужно инициализировать базу данных таблицами и фиктивными данными с помощью Junit,

Я использую Unitils или DbUnit

Данные в Unitils могут быть загружены из XML-файлов внутри вашей папки ресурсов, поэтому, как только запускается тестовый бегун, он загрузит весь контент из xml и вставляет его в базу данных, пожалуйста, посмотрите примеры на своем веб-сайте.