Вы спрашиваете плюсы и минусы двух разных вещей (каковы плюсы и минусы езды на лошади против мотоцикла?)
Конечно, оба являются «автоматизированными тестами» (~ езда), но это не значит, что они являются альтернативой (вы не ездите на лошади за сотни миль, и вы не ездите на мотоцикле в закрытом помещении). -месть грязных мест)
Юнит-тесты тестируют наименьшую единицу кода, обычно это метод. Каждый модульный тест тесно связан с методом, который он тестирует, и, если он хорошо написан, он связан (почти) только с этим.
Они прекрасно подходят для разработки нового кода и рефакторинга существующего кода. Они замечательно обнаруживают проблемы задолго до того, как система готова к интеграционным тестам. Обратите внимание, что я написал guide , и вся разработка, основанная на тестировании, относится к этому слову.
Нет смысла проводить ручные юнит-тесты.
Как насчет рефакторинга, который, кажется, является вашей главной заботой? Если вы проводите рефакторинг только реализации (содержимого) метода, но не его существования или «внешнего поведения», модульный тест все еще действителен и невероятно полезен (вы не можете представить, насколько он полезен, пока не попробуете).
Если вы проводите более интенсивный рефакторинг, меняете существование или поведение методов, тогда да, вам нужно написать новый модульный тест для каждого нового метода и, возможно, выбросить старый. Но написание модульного теста, особенно если вы пишете его перед самим кодом, поможет прояснить структуру (т. Е. что должен делать метод, а что не должно) без будучи сбит с толку деталями реализации (т. е. как метод должен делать то, что ему нужно).
Автоматические интеграционные тесты тестируют самый большой блок кода, как правило, все приложение.
Они отлично подходят для тестирования вариантов использования , которые вы не хотите проверять вручную. Но у вас также могут быть ручные интеграционные тесты, и они настолько же эффективны (только менее удобны).
Начиная новый проект сегодня, нет никакого смысла в том, чтобы не проводить модульные тесты, но я бы сказал, что для существующего проекта, такого как ваш, не имеет особого смысла писать их для всего, что у вас уже есть, и это работа.
В вашем случае, я бы предпочел использовать подход "золотая середина":
- меньшие интеграционные тесты, которые проверяют только те разделы, которые вы собираетесь реорганизовать. Если вы проводите рефакторинг целиком, тогда вы можете использовать свои текущие интеграционные тесты, но если вы рефакторинге только, скажем, генерации XML, нет смысла требовать наличия базы данных, поэтому я бы написал простой и маленький тест интеграции XML.
- куча юнит-тестов для нового кода, который вы собираетесь написать. Как я уже писал выше, модульные тесты будут готовы, как только вы «возитесь с чем-то промежуточным», убедившись, что ваш «беспорядок» куда-то уходит.
На самом деле ваш Интеграционный тест только убедится, что ваш "беспорядок" не работает (потому что в начале он не будет работать, верно?), Но не даст вам никакой подсказки по
- почему не работает
- если ваша отладка "путаницы" действительно что-то исправляет
- если ваша отладка "беспорядка" ломает что-то еще
Интеграционные тесты дадут подтверждение в конце, только если все изменение было успешным (и ответ будет «нет» в течение длительного времени). Интеграционные тесты не окажут вам никакой помощи во время самого рефакторинга, что сделает его более сложным и, возможно, разочаровывающим. Для этого вам нужны юнит-тесты.