Модульное тестирование на C #: интеграция NUNIT / MBUNIT с Microsoft PEX - PullRequest
1 голос
/ 21 октября 2011

C # Unit-Testing: Как интегрировать NUNIT / MBUNIT с Microsoft PEX (Параметризованное модульное тестирование).После того, как я просмотрел несколько видеороликов о Microsoft PEX, мне стало интересно, смогу ли я добавить тестирование PEX в свой тестовый проект NUNIT, а также добавить их в ночные сборки.Это возможно?

1 Ответ

3 голосов
/ 01 декабря 2011

Да, это возможно.

Мы запускаем довольно обычную установку (стиль правительства без передовых границ) с CruiseControl.Net работает NAnt работает MSBuild, NUnit , Кодовые контракты , Pex .Тесты генерируются с помощью графического интерфейса Pex Visual Studio (Professional edition), а затем сгенерированные файлы регистрируются в нашем SVN.На сервере нет дополнительного шага Pex, но он по-прежнему выполняет все тесты NUnit как обычный набор тестов.Поскольку мы используем Code Contracts, шаг после сборки Code Code все еще необходимо выполнить.

При запуске Pex в Visual Studio для создания параметризованных тестов, он позволит вам выбрать, какую инфраструктуру тестирования использовать.Для нового проекта выберите NUnit и при появлении запроса перейдите в папку, содержащую nunit.framework.dll, связанную с вашим проектом.

Пока (по крайней мере, пока все в моем отделе не привыкли к Pex), мы разделилирукописные тесты из сгенерированных тестов Pex, разделив их на два тестовых проекта на проект кода.Например, Product.XYZ имеет как Product.XYZ.Tests (обычные рукописные тесты NUnit), так и Product.XYZ.PexTests (полностью сгенерированный проект с только сгенерированными тестами).В рукописных тестах мы записываем ожидаемые (на основе бизнес-кейса) входные данные и результаты, а затем используем Pex, чтобы убедиться, что мы не пропустили какие-либо потенциально опасные пред- или постусловия.Оба набора тестов автоматически выполняются на машинах разработчика ReSharper и сервере сборки CCNet, плюс мы используем оба для проверки покрытия кода с использованием OpenCover .

Использование Pexи кодовые контракты без их установки на сервере сборки

Ниже приведены некоторые заметки, которые я пишу, пока они свежие.Может быть перемещен или удален.

Обратите внимание, что нет необходимости запускать установщик для Pex или Code Contracts на сервере сборки.Это помогает, если у вас скупые системные администраторы или проекты, которые могут использовать конфликтующие версии Pex или Code Contracts. Все еще Moles должен быть установлен на сервере сборки , поэтому пропустите это при использовании Moles.

  1. Пусть Pex сгенерирует тестовый проект NUnit Product.XYZ.PexTests длявы.Сгенерируйте также некоторые (только один или два для начала) параметризованных тестов метода Pex, и позвольте Pex генерировать .g.cs файлы с фактическими тестами NUnit.
  2. Создайте локальную копию Microsoft.Pex.Framework.dll для вашего решенияи повторно добавьте ссылку на проект Product.XYZ.PexTests для вашей локальной копии.Удалите ваши .moles и ссылки на Moles, Microsoft.ExtendedReflection.dll, Microsoft.Moles.Framework.dll.
  3. Скопируйте установленные файлы Code Contracts в папку инструментов сборки вашего решения.(Вы можете очистить некоторые неиспользуемые файлы не для сборки позже.)
  4. Установите переменную CodeContractsInstallDir, чтобы она указывала на вашу папку Code Contracts (включая косую черту) перед сборкой (например, в вашем скрипте сборки).
  5. Импорт Microsoft.CodeContracts.targets (см. Ниже) после других тегов <Import /> в файле Product.XYZ.csproj проекта вашего кода.
  6. (Необязательно) Проверка кода сборки Контрактов на время сборки до </Project> вашего кодаProduct.XYZ.csproj проекта (см. XML ниже).Возможно, вы захотите переместить проверку в зависимости от того, включена ли проверка времени выполнения Code Contracts только для некоторых сборок.
  7. Проверьте настройку Pex, собрав и выполнив тесты на сервере сборки.

Кодовые контракты строят целевой импорт

<Import Project="$(CodeContractsInstallDir)MsBuild\v4.0\Microsoft.CodeContracts.targets" />

Проверка кодовых контрактов из userdoc.pdf глава 5.1.3

<PropertyGroup>
  <CompileDependsOn>$(CompileDependsOn);CheckForCodeContracts</CompileDependsOn>
</PropertyGroup>
<Target Name="CheckForCodeContracts" Condition="'$(CodeContractsImported)' != 'true'">
  <Error Text="Project requires Code Contracts" />
</Target>

...