Создание тестовых данных в базах данных из 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 ответа
Я не знаю инструмента, который точно соответствует требованиям, однако, вы смотрели на Генератор данных SQL Red Gate? Red Gate делают очень хорошие инструменты SQL.
Я думаю, что ваша проблема с фиктивными объектами в модульном тестировании:
Следовательно, ложных объектов недостаточно; данные ДОЛЖНЫ быть записаны в базы данных, при этом система должна гарантировать, что все PK и FK правильно ссылаются друг на друга.
может быть улучшена. Если бы у бизнес-объектов была подходящая проверка, основанная на объектных отношениях, то модульные тесты были бы намного полезнее.