Создание тестовых данных в базах данных из XML

Я ищу структуру, которая позволяет мне использовать XML для настройки данных модульного тестирования.

Я много занимаюсь разработкой, когда веб-интерфейс соединяется с несколькими таблицами на одном или нескольких внутренних серверах баз данных. В целях модульного тестирования я вставляю данные в таблицы HSQLDB в памяти и запускаю операции с БД. Это быстро и обеспечивает достаточно хорошую среду для модульного тестирования.

Hibernate работает с ним достаточно хорошо. Я просто говорю, что использую диалект HSQLDB для модульного тестирования и диалект DB2 в производстве, и он имеет дело с различиями между ними.

Довольно часто я работаю с устаревшими таблицами, которые использовались в рабочей среде до широкого использования SQL. Много decimal(7,2) поля. Много (и я имею в виду много) составных ключей и индексов. У меня есть случаи, когда в этой таблице есть составной PK, состоящий из этих двух полей, которые фактически являются FK для составного PK другой таблицы, плюс пара других полей, специфичных для этой таблицы. У нас есть decimal(8,0) поля, которые на самом деле являются значениями ГГГГММДД. Этот последний на самом деле является частью составного ПК.

Я не получаю мод в этой среде. Некоторые из этих таблиц использовались в производстве десятилетиями.

HSQLDB работает достаточно хорошо со всем этим. Он может симулировать все эти вещи. Я даже могу создать один из вышеупомянутых decimal(8,0)-cum-date поля, где я беру текущую дату, добавляю / вычитаю несколько дней из нее и преобразую ее в decimal(8,0) значение.

Я делаю это путем создания нескольких файлов SQL. Один содержит create table оператор для одной таблицы и одной содержит кучу insert заявления, включающие данные в эту таблицу. JUnit выполняет их для настройки контекста, а затем запускает фактические модульные тесты для контекста. Любой, кто использует JUnit и Spring, вероятно, знаком с этой настройкой.

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

Рукой.

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

Я хотел бы рамки, которые могут читать / анализировать эти create table операторы или извлекать данные схемы из созданных таблиц, и, возможно, потребуется дополнительная настройка, сообщающая, что эти поля в таблице B на самом деле являются FK для составного PK в таблице A.

Затем, если я хотел бы создать файл XML, который имеет что-то вроде:

<table_A field1="value" field2="value" pkField1="value" pkField2="value">
  <table_B field1="value" field2="value" pkField3="value" />
  <table_B field1="value" field2="value" pkField3="otherValue" timeField="+5 minutes"/>
</table_A>

и пусть он создаст одну запись в таблице A, при необходимости запишите значения PK, затем создайте две записи в таблице B с соответствующими значениями FK, а вторая запись в таблице B будет иметь time поле на 5 минут позже предыдущего. Мне не нужно явно указывать значения ссылочных полей в той или иной таблице, если я не хочу / не хочу. Система может автоматически генерировать поля по мере необходимости и переносить их в FK по мере необходимости.

Я хотел бы иметь возможность вкладывать это сколь угодно много уровней. С макушки головы я могу представить себе:

<table_a ...>
  <table_b ... />
  <table_b ... />
  <table_b ... />
  <table_c ... />
  <table_c ... />
  <table_d ...>
    <table_e ...>
      <table_f ...>
        <table_g ... />
        <table_g ... />
        <table_h ...>
          <table_i ... />
          <table_i ... />
        </table_h>
      </table_f>
    </table_e>
  </table_d>
</table_a>

в одном из моих существующих проектов.

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

Раньше мы много делали с фиктивными объектами, которые заменяли операции с базами данных на этапе модульного тестирования. Мы столкнулись с проблемами, когда код перешел на этап практического тестирования и должен был взаимодействовать с базами данных. Следовательно, ложных объектов недостаточно; данные ДОЛЖНЫ быть записаны в базы данных, при этом система должна гарантировать, что все PK и FK правильно ссылаются друг на друга.

Вкратце, вопрос: кто-нибудь знает структуру, которая обеспечивает все вышеперечисленное? В том числе умение делать дату / время по математике? И конвертировать в другие форматы?

2 ответа

Я не уверен, что это полностью избавит вас от сложных тестовых данных, но я думаю, что DBUnit хотя бы немного облегчит это. Это стоит посмотреть и попробовать.

Я не знаю инструмента, который точно соответствует требованиям, однако, вы смотрели на Генератор данных SQL Red Gate? Red Gate делают очень хорошие инструменты SQL.

Я думаю, что ваша проблема с фиктивными объектами в модульном тестировании:

Следовательно, ложных объектов недостаточно; данные ДОЛЖНЫ быть записаны в базы данных, при этом система должна гарантировать, что все PK и FK правильно ссылаются друг на друга.

может быть улучшена. Если бы у бизнес-объектов была подходящая проверка, основанная на объектных отношениях, то модульные тесты были бы намного полезнее.

Другие вопросы по тегам