На работе мы обнаружили, что наш набор тестов дошел до такой степени, что это слишком медленно, чтобы работать многократно, что мне действительно не нравится. Это не менее 5 минут по всему пакету, и более 3 минут - только для объектных тестов данных. Поэтому мне интересно узнать, как люди проводят тестирование.Как вы обрабатываете приложения, которые сильно зависят от баз данных?
На данный момент у нас есть единственный сервер базы данных с живой схемой и схемой _test. Когда тест запускается, он сначала запускает SQL-скрипт, в котором говорится, как заполнять тестовую базу данных (и очищать старые данные, которые могут мешать). Это происходит практически для всех тестов. Из того, что я вижу, это самое большое узкое место в наших тестах - я только что профилировал один тест, и для настройки базы данных требуется около 800 мс, а затем каждый последующий тест проходит около 10 мс.
Я пытался найти какое-то решение, и вот что я нашел до сих пор:
Есть тест схема заселена один раз, и откатить изменения в конце каждого теста.
Это, кажется, самое простое решение, но это означает, что нам нужно будет добавить некоторые специальные материалы для проверки вещей, зависящих от отката (т. Е. Тестов обработки ошибок).
Mock база данных, где это возможно
Мы могли бы установить базу данных для объекта данных, тестируется, но издеваться ничего она зависит. Для меня это не кажется блестящим по двум причинам. Во-первых, когда мы устанавливаем базу данных вверх, мы по-прежнему (обычно) получаем гораздо больше строк из-за зависимостей внешнего ключа. Во-вторых, большинство моделей объектов данных действительно не взаимодействуют с другими, они просто делают JOINs.
Выполнить ту же систему, но использовать отвалы и RamFs
Вместо запуска большого запроса SQL мы вместо того, чтобы загрузить дамп базы данных. Тест-сервер будет работать на разделе RAMFS и, надеюсь, принесет некоторые преимущества по скорости.
Я не могу проверить это, потому что я на OSX, и из того, что я вижу, нет поддержки ramfs.
Есть некоторые другие варианты вокруг, как с помощью SQLite, но это не вариант для нас, как мы зависим от некоторых специфических расширений PostgreSQL.
Halp! :)
«сильно зависимый» всегда является плохим словом, когда дело доходит до тестирования. Сделайте свое приложение не сильно зависимым от вещей, и внезапно становится более надежным * и * легче тестировать.Только уровень абстракции базы данных должен нуждаться в тестировании против реальной базы данных; остальная часть вашего приложения может быть протестирована против слоя поддельной абстракции. – jrockway