Как управлять временем сборки в TDD
Привет, в моем проекте у нас есть сотни тестов. Эти тесты являются частью процесса сборки, который запускается при каждой регистрации и отправляет почту нашей группе разработчиков. Этот проект довольно большой, и его работа продолжается уже более пяти лет.
Теперь у нас так много тестовых случаев, что сборка занимает больше часа. Некоторые тестовые примеры не структурированы должным образом, и после их рефакторинга я смог существенно сократить время выполнения, но у нас есть сотни тестовых примеров и их рефакторинг по одному кажется, слишком много.
Теперь я запускаю некоторые тестовые примеры (выполнение которых занимает очень много времени) только как часть ночной сборки, а не как часть каждой регистрации.
Мне любопытно, как другие парни справляются с этим.
3 ответа
Я полагаю, что в "Эффективной работе с устаревшим кодом" он сказал, что если ваш набор тестов займет больше пары минут, он слишком сильно замедлит работу разработчиков, и тесты начнут игнорироваться. Похоже, вы попали в эту ловушку.
Работают ли ваши тесты с базой данных? Тогда это, скорее всего, ваш самый большой источник проблем с производительностью. Как правило, тестовые случаи никогда не должны делать ввод / вывод, если это возможно. Внедрение зависимостей может позволить вам заменить объект базы данных фиктивными объектами, которые имитируют часть базы данных вашего кода. Это позволяет вам тестировать код, не беспокоясь о том, правильно ли настроена база данных.
Я настоятельно рекомендую работать эффективно с устаревшим кодом Майкла Фезерса. Он обсуждает, как справиться со многими головными болями, с которыми вы, похоже, сталкиваетесь, без необходимости рефакторинга кода сразу.
ОБНОВИТЬ:
Другой возможной помощью будет что-то вроде NDbUnit. Я еще не использовал его широко, но выглядит многообещающе: http://code.google.com/p/ndbunit/
Возможно, вы могли бы подумать о том, чтобы сохранить базу данных Oracle, но запустить ее с оперативной памяти? Он не должен быть большим, потому что он будет содержать только тестовые данные.
У нас около 1000 тестов, большой процент тех, кто общается через REST и работает с базой данных. Общее время выполнения составляет около 8 минут. Час кажется чрезмерным, но я не знаю, что вы делаете и насколько сложны ваши тесты.
Но я думаю, что есть способ помочь вам. Мы используем TeamCity, и у него есть хорошая возможность иметь несколько агентов сборки. Что вы можете сделать, так это разделить ваш тестовый проект на подпроекты, каждый из которых содержит только несколько тестов. Вы можете использовать JNunit/NUnit Categories для их разделения. Затем вы должны настроить TeamCity так, чтобы каждый агент создавал только один тип подпроекта. Таким образом, вы получите параллельное выполнение тестов. С несколькими агентами (вы получаете 3 бесплатно), вы сможете получить до 20 минут, что может быть даже приемлемо. Если вы поместите каждый агент в виртуальную машину, вам могут даже не потребоваться дополнительные машины, вам просто нужно много оперативной памяти.