NUnit лучшая практика - PullRequest
       22

NUnit лучшая практика

4 голосов
/ 07 апреля 2009

Среда: (приложение C # WinForms в Visual Studio Professional 2008)

Я немного покопался в поисках рекомендаций по лучшим практикам NUnit. Как сольный программист, работающий в относительно изолированной среде, я надеюсь, что коллективная мудрость здесь может мне помочь.

У Скотта Уайта есть несколько хороших отправных точек здесь но я не уверен, что полностью согласен со всем, что он сказал - особенно с пунктом 2. Мои инстинкты говорят мне, что тест ближе к коду Если вы будете проходить тестирование, тем более вероятно, что вы получите полное тестовое покрытие. В комментариях к сообщению Скотта в блоге есть замечание, что тестирование общедоступного интерфейса некоторыми считается лучшей практикой, но я бы сказал, что тестовая среда не является типичным потребителем класса.

Что вы можете порекомендовать в качестве лучших практик для NUnit?

Ответы [ 3 ]

6 голосов
/ 07 апреля 2009

Если под пунктом 2 вы подразумеваете «папку bin для каждого решения» - я вижу вашу точку зрения. Лично я бы просто добавил ссылку на каждый тестовый проект. Если, с другой стороны, вы действительно имеете в виду (1b) «не помещайте свои тесты в ту же сборку, что и ваш код», я от всего сердца согласен с ним и не согласен с вами. Ваши тесты должны отличаться от вашего производственного кода, чтобы улучшить ясность кода и его организацию. Хранение тестовых классов отдельно помогает следующему программисту понять это легче. Если вам нужен доступ к внутренним компонентам в ваших тестах - и вы можете это сделать, поскольку внутренние методы являются «открытыми» для сборки, вы можете использовать конструкцию InternalsVisibleTo в файле Assembly.cs.

Я бы тоже порекомендовал, чтобы в общем случае достаточно было модульного тестирования только открытого интерфейса кода. При правильном выполнении (с использованием TDD) закрытые методы вашего кода будут просто рефакторингом предыдущего общедоступного кода и будут иметь достаточный охват тестами через общедоступные методы. Конечно, это правило, а не закон, поэтому могут возникнуть ситуации, когда вы захотите протестировать частный метод. В этих случаях вы можете создать метод доступа и использовать отражение для вызова частного метода.

Еще одна рекомендация, которую я хотел бы сделать, - использовать модульное тестирование и покрытие кода в тандеме. Покрытие кода может быть полезной эвристикой, чтобы определить, когда вам нужно больше тестов. Отсутствие охвата следует использовать в качестве руководства, чтобы указать, где может потребоваться дополнительное тестирование. Это не означает, что вам нужно 100% покрытие - некоторый код может быть достаточно простым, чтобы не требовать модульного теста (например, автоматических свойств), и они могут не затрагиваться вашими существующими тестами.

У меня была пара проблем со статьей. Вероятно, самым большим является отсутствие абстракции от базы данных для модульных тестов. Вероятно, есть некоторые интеграционные тесты, которые должны идти против db - возможно, при тестировании функциональности триггера или ограничения, если вы не можете убедить себя в их правильности в противном случае. В целом, однако, я считаю, что вы должны реализовать свой доступ к данным в виде интерфейсов, а затем смоделировать фактические реализации в своих модульных тестах, чтобы не было необходимости фактически подключаться к базе данных. Я обнаружил, что мои тесты выполняются быстрее, и поэтому я выполняю их чаще, когда делаю это. Создание «поддельного» интерфейса базы данных может занять некоторое время, но его можно использовать повторно, если вы придерживаетесь того же шаблона проектирования для доступа к данным.

Наконец, я бы порекомендовал использовать nUnit с TestDriven.Net - очень полезный плагин, независимо от того, используете ли вы nUnit или MSTest. Делает его очень удобным для запуска или отладки тестов с помощью контекстного меню, вызываемого правой кнопкой мыши.

5 голосов
/ 07 апреля 2009

Мои инстинкты говорят мне, что чем ближе тест для кода, который тестируется более вероятно, что вы получите полный тестовое покрытие. В комментариях к Сообщение Скотта в блоге - это замечание, которое просто тестирование публичного интерфейса некоторые считают лучшей практикой, но Я бы сказал, что тестовые рамки не типичный потребитель класса.

Если ваш код не может быть протестирован с использованием только общедоступных точек входа, значит, у вас проблема с дизайном. Вы должны прочитать больше о принципах TDD и SOLID (особенно принцип единой ответственности и инверсия зависимостей). Тогда вы поймете, что следующий подход TDD поможет вам написать более тестируемый, гибкий и обслуживаемый код без необходимости использования таких «хаков», как тестирование приватных частей классов.

Я также настоятельно рекомендую прочитать Справочник Google по тестируемости Miško Hevery , в нем множество примеров кода, охватывающих эти темы.

0 голосов
/ 07 апреля 2009

Я нахожусь в довольно похожей ситуации, и этот вопрос описывает, что я делаю keep-your-source-close-and-your-unit-tests-ближе . Мало кто был в восторге от моего подхода, но он отлично работает для меня.

...