Введение
Что требуется от UT фреймворка? Да не так много, на самом деле. Надо просто иметь возможность писать тесты и выполнять утверждения (assert). Это умеют делать все UTF без исключения, что несколько осложняет выбор, не правда ли? :)
Как разработчик на .NET я рассматривал 3 альтернативы: MS Tests, встроенные в Visual Studio, NUnit и xUnit.
MS Tests
Вполне очевидный выбор для разработчиков .NET. Тестовая среда полностью интегрирована в среду разработки, а значит, есть возможность создания, выполнения тестов и просмотре результатов прямо из IDE. Более того, в студию 2008 и 2010 встроена возможность просмотра процента покрытия кода тестами. Очень классная фича, если заниматься тестами серьезно. Казалось бы, что может быть лучше?
К сожалению, у студийных тестов есть один, но крайне важный недостаток: они очень медленно запускаются. Запуск даже одного теста при скомпилированном проекте на моем не слабом ноутбуке (Acer Aspire 8735G) занимает около 15 секунд. Если набор тестов увеличить до 20, то время увеличивается до 30 секунд.
Не только я один жалуюсь на это. В интернете полно сообщений с описанием схожих проблем. Значительное время на запуск тестов необходимо студии для выполнения деплоймента тестов. Понимая эту особенность, я попытался увеличить производительность запуска тестов подкрутив настройка конфигуратора запуска тестов, но успеха не достиг.
Из-за этой особенности использовать MS Tests крайне неудобно и несмотря на все преимущества тесной интеграции с IDE я отказался от использования этого UTF.
xUnit
Использовать xUnit меня вдохновил Андрей Бибичев на своем семинаре о TDD. XUnit является open source платформой и очень похожа на NUnit. На сайте xUnit говорят, что идея проекта заключалась в преодолении некоторых проблем, которые присущи NUnit. Могу сказать, что это им удалось!
XUnit UTF присущ очень простой и чистый синтаксис. Не нужно помечать классы специальным атрибутом TestFixture. SetUp и TearDown атрибуты отсутствуют, поскольку среда xUnit инстанцирует новый инстанс класса при запуске каждого теста. Тесты запускаются не в пример быстрее, чем в MS Tests. Более того, существует множество проектов-дополнений к xUnit. Например, проект для поддержки BDD стиля написания тестов.
Недостатки были обнаружены позже.
Первое, что мне не понравилось, это отсутствие интеграции с JetBrains ReSharper по умолчанию. Не всем разработчикам нравится запускать тесты из студии, но на мне это кажется самым удобным способом работы в стиле TDD. Есть проект, который позволяет запускать тесты прямо из студии, используя ReSharper, но его необходимо скачивать и устанавливать.
Кроме этого отсутствует возможность определения процента покрытия кода тестами. Конечно, для этого есть другие инструменты вроде NCover или TestDriven.net, но они платные. Бесплатные же проекты не дотягивают по уровню до вышеприведенных. Справедливости ради отмечу, что есть бесплатные релизы этих продуктов, но я их не пробовал.
Интеграция с MSBuild и CruiseControl также показалась мне сложной. Конечно, есть статьи, которые рассказывают что и как сделать, но все это необходимо делать вручную.
Иными словами, я почувствовал, что xUnit - не "мейн стрим". Коммьюнити xUnit не так велико и сторонние продукты не часто поддерживают xUnit. Все это выливается в необходимость вручную настраивать окружение, что требует времени.
NUnit
NUnit имеет давнюю историю и является портом JUnit на платформу .NET. Когда я только начинал пробовать свои силы в UT я пробовал использовать NUnit, и он мне не понравился. Но с тех пор прошло больше 2-х лет, и я взглянул на "старого друга" под другим углом.
У NUnit более традиционный синтаксис объявления тестов и проверки утверждений. Со временем, ребята, работающие над NUnit, внесли весьма важные изменения, касающиеся процесса тестирования. Например, добавили поддержку конструкции Assert.Throws.
Однако, я так не нашел информацию из "официальных" источников, которые бы подтверждали, что теперь NUnit среда инстанцирует новый класс для каждого тест-метода. Именно за эту особенность различные эксперты, например, автор книги xUnit Test Patterns Gerard Meszaros, критиковали NUnit. Если ты, читатель, имеешь под рукой ссылку на эту тему, то был бы очень признателен, если ты оставишь ее в комментариях к статье.
Проект активно развивается и является стандартом de facto в индустрии open source проектов для .NET. Поддержка тестов NUnit по умолчанию интегрирована в JetBrains ReSharper. Существует проект для интеграции MS Test среды с тестами NUnit, что позволяет не только запустить тесты из MS Visual Studio 2008, но рассчитать покрытие кода! И, конечно, интеграция NUnit с NAnt уже есть, и тратить время на дополнительную конфигурацию практически не нужно.
Выводы
Каждый выбирает по себе, но моя текущая среда для тестирования выглядит так:
- NUnit используется для описания тестов
- ReSharper используется для запуска тестов on the fly
- NUnitForVS используется для просмотра покрытия кода тестами из Visual Studio
- Assert extension методы используются для выполнения утверждений (BDD style). Это позволяет сделать тесты не только более лаконичными, но и ослабить зависимость тестов от конкретной UTF. Именно благодаря этому подходу, переход от xUnit к NUnit занял около получаса.
P.S. Уже после написания статьи обнаружил, что NUnit позволяет запускать MS Tests из NUnit среды, тем самым уменьшая время необходимое для запуска тестов. Это еще раз подтверждает, что нет предела совершенству, и изучение различных способов организации рабочего пространства для UT будет продолжено. New articles are coming soon! :)
Комментариев нет:
Отправить комментарий