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