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

Предположим, у меня есть две таблицы в базе данных, одна называется 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 и вставляет его в базу данных, пожалуйста, посмотрите примеры на своем веб-сайте.

  • COROUTINE_SUSPENDED и suspendCoroutineOrReturn в Котлине
  • упаковать файл Kotlin .class в JAR для выполнения
  • Применить @JvmStatic и @JvmField автоматически ко всем файлам в Котлине
  • Как провести различие между связанной ссылочной ссылкой элемента и функцией того же типа в котлин?
  • Что такое `it` в лямбда-тесте Котлин?
  • Как я могу получить случайное число в Котлине?
  • Как создать параметр конструктора типа «Единица» Kotlin с параметром одного типа с kotlinpoet?
  • Котлин, получивший доступ к классу Java
  • В Kotlin, как я идиоматически обращаюсь к значениям вложенной карты с нулевым значением или возвращать значение по умолчанию?
  • Использование нескольких языков JVM в одном проекте
  • Невозможно размонтировать коллекцию объектов xml с использованием JAXB и Kotlin
  • Interesting Posts

    Использование условия для выбора свойства сортировки в Котлине

    В чем разница между arrayListOf и mutableListOf, какая из них лучше?

    Вывод типа компилятора Kotlin не может выбрать способ вызова (двусмысленность с типичными типами)

    Android Parcelable в Kotlin: CREATOR не найден на Parcelable class

    Kotlin: Cast ArrayList <String!> В массив <String>

    Отладчик Android Studio не работает при использовании поддержки на C ++

    Как вызвать внешнюю команду из кода Котлина?

    Kotlin: Как я могу позволить Android Studio реализовать интерфейс в нижней части класса

    Цвет материала для материалов Apple не применяется последовательно

    Какой тип языка Котлин? Чистый ООП или функциональный

    Ошибка «Function0 не является функциональным интерфейсом» при передаче java lambda в kotlin fun

    Firebase Admin SDK не может подключаться к базе данных из внутреннего файла jar

    Размер RealmResults возвращается Zero

    В Kotlin, как мне расширить класс, который имеет несколько конструкторов?

    Геттеры и сеттеры в Котлине

    Давайте будем гением компьютера.