Вот сканарио:
Я работаю над объектом DAO, который использует API критериев гибернации для формирования ряда сложных запросов для выполнения определенных задач в базе данных (например, поиск по ключевым словам в нескольких полях).
Нам нужно провести модульное тестирование, чтобы убедиться, что сгенерированный запрос корректен для различных сценариев.Один из способов его проверки, который может быть предпочтительным, состоит в том, чтобы проверить правильность создания критериев гибернации, проверив его в конце и посмеявшись над взаимодействием с базой данных.Однако это нежелательно, так как, во-первых, это своего рода обман (он просто дублирует то, что будет делать код), а также он не проверяет, приводит ли сам критерий к спячке или когда он попадает в базу данных, это вызывает проблемы.
Опция, которую нужно использовать, - это запустить запрос к тестовой базе данных.Однако по историческим причинам нет статической тестовой базы данных (например, код, который будет проверяться как часть кода), и сфера полномочий моего проекта не позволяет мне приступить к ее созданию, нам приходится довольствоваться тестированием на соответствиеразделяемая база данных разработки, которая периодически обновляется производственными данными.
Когда эти обновления происходят, данные, лежащие в основе тестов, тоже могут измениться, и это сделает наши модульные тесты хрупкими.Мы можем преодолеть это, не используя точные числа в тестах, но это не совсем адекватное тестирование таким образом.
Тогда возникает вопрос: что люди делают в подобных случаях, чтобы сделать тесты менее хрупкими?Один из вариантов, который я имею в виду, - запустить собственный SQL, который выполняет тот же запрос (поведенчески - он не должен совпадать с запросом, сгенерированным hibernate), чтобы получить ожидаемое число, а затем запустить версию DAO, чтобы увидетьесли это соответствует.Таким образом, поведение запроса всегда может быть реализовано в исходном собственном SQL-коде, и вы всегда будете иметь правильные числа.
Буду весьма признателен за любые отзывы об этой или других идеях относительно управления этой ситуацией.
A.
ОБНОВЛЕНИЕ:
Что касается предложений hsqldb / h2 / derby, я знаком с ними, но компания не готовапросто идите по этому пути пока что, и делать это по частям только на одном тестовом примере не подойдет.
Что касается моего более раннего предложения, я хотел бы подробнее остановиться на этом - рассмотрим этот сценарий:
Я хочу убедиться, что мой относительно сложный поиск по ключевым словам возвращает 2100 соответствий для "Джона Смита".
Чтобы найти ожидаемое число, я бы проанализировал свою базу данных и выяснил число, используя запрос SQL,Какова обратная сторона того, что этот запрос является частью теста, так что вы всегда будете знать, что вы тестируете поведение критериев?
Таким образом, в основном вопрос заключается в следующем: если по какой-то причине вы не могли иметьстатический набор данных для тестирования, как бы вы выполняли интеграционные тесты нехрупким способом?