Как мне управлять устаревшими данными базы данных в модульных тестах? - PullRequest
2 голосов
/ 19 июля 2011

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

Это происходило в течение нескольких лет, и теперь мы обнаруживаем, что данные становятся оченьустаревшие, так как новые функции добавляются в продукт.

Добавление данных в базу данных тестов стало «невозможным» с помощью графического интерфейса, поскольку простые изменения могут нарушить сотни тестов - мы стали лучше писать менее хрупкие тесты, но лошадь теперь набралась.

Какую стратегию мы можем использовать для решения этой проблемы?

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

Ответы [ 2 ]

1 голос
/ 19 июля 2011

Лично я не считаю тесты, которые требуют внешних ресурсов, таких как базы данных, JMS-очереди, другие службы и т. Д., Модульными тестами.Я называю их «интеграционными тестами».

Тем не менее, иногда необходимо создать набор модульных тестов на уровне OR.Вы, вероятно, захотите проверить, как ведет себя код, когда база данных содержит данные, представляющие различные сценарии, некоторые из которых могут быть недоступны в вашей базе данных разработки.Что мне показалось наиболее полезным, так это чтобы мой модульный тест создал базу данных в памяти (например, с использованием H2) и загрузил ее с различными наборами данных, необходимыми для разных тестов.Это довольно просто с Hibernate, где вы можете разрешить создание вашей схемы на основе ваших файлов реляционного отображения.Затем вам нужно только вставить в него данные, необходимые для ваших тестовых случаев.Это здорово, потому что:

  1. Данные создаются в памяти, поэтому не влияют ни на кого, кто использует базу данных.
  2. Не ожидает, что какой-либо внешний ресурс будет доступен (например, если вашмодульные тесты не пройдены, если база данных недоступна, потому что у разработчика, который ее запускает, ушел выходной? Вероятно, нет!1010 *
0 голосов
/ 19 июля 2011

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

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

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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...