Вы добавляете модульные тесты в один проект или другой проект?

Вы добавляете модульные тесты в одном проекте для удобства или размещаете их в отдельной сборке?

Если вы поместите их в отдельную сборку, как мы, мы получим ряд дополнительных проектов в решении. Это отлично подходит для модульного тестирования во время кодирования, но как вы освобождаете приложение без всех этих дополнительных сборок?

На мой взгляд, модульные тесты должны быть размещены в отдельной сборке из производственного кода. Вот лишь несколько минусов размещения модульных тестов в тех же assemblyх или assemblyх, что и производственный код:

  1. Модульные тесты поставляются с производственным кодом. Единственное, что поставляется с кодом продукта, – это производственный код.
  2. Ассембли будут излишне раздуты с помощью модульных тестов.
  3. Модульные тесты могут влиять на процессы сборки, такие как автоматическая или непрерывная assembly.

Я вообще не знаю никаких профи. Наличие дополнительного проекта (или 10) не является con.

Редактировать: дополнительная информация о сборке и доставке

Я бы также рекомендовал, чтобы в любом автоматическом процессе сборки выполнялись производственные и модульные тесты в разных местах. В идеальном случае процесс сборки единичного теста выполняется только в том случае, если производственный код строит и копирует файлы продуктов в каталог единиц тестирования. Выполнение этого способа приводит к тому, что фактические биты разделяются для доставки и т. Д. Кроме того, довольно просто запустить автоматическое тестирование модhive на данный момент во всех тестах в конкретном каталоге.

Резюмируем, вот общая идея ежедневной сборки, тестирования и доставки бит и других файлов:

  1. Производственные сборки запускаются, помещая производственные файлы в определенный «производственный» каталог.
    1. Стройте только производственные проекты.
    2. Скопируйте скомпилированные биты и другие файлы в каталог «production».
    3. Копирование битов и других файлов в каталог кандидат-релиз, а также каталог рождественских выпусков, будет «Release20081225».
  2. Если производственная assembly завершается успешно, выполняется assembly тестов модhive.
    1. Скопируйте производственный код в каталог «tests».
    2. Постройте модульные тесты в каталог «tests».
    3. Запустите единичные тесты.
  3. Отправляйте уведомления о сборке и результаты модульных тестов разработчикам.
  4. Когда принимается кандидат на выпуск (например, Release20081225), отправляйте эти биты.

Отдельный проект, но в том же решении. (Я работал над продуктами с отдельными решениями для тестового и производственного кода – это ужасно. Вы всегда переключаетесь между ними.)

Причины для отдельных проектов, как утверждают другие. Обратите внимание: если вы используете тесты, основанные на данных, вы можете получить довольно значительное количество раздумий, если вы включите тесты в сборку.

Если вам нужен доступ к внутренним членам производственного кода, используйте InternalsVisibleTo .

Я не понимаю частое возражение против развертывания тестов с производственным кодом. Я привел команду на небольшой микрокап (вырос с 14 до 130 человек). У нас было полдюжины или около того Java-приложений, и мы убедились, что EXTREMELY value можно развернуть тесты в поле для их выполнения на конкретной машине, которая демонстрирует необычное поведение. Случайные проблемы возникают в поле, и возможность опрокидывания нескольких тысяч тестов в тайне с нулевыми затратами неоценима и часто диагностируется проблемы в минутах … включая проблемы с установкой, проблемы с помехоустойчивостью ОЗУ, проблемы, связанные с машиной, проблемы с плохой сетью, и т. д. и т. д. Я считаю, что невероятно ценно проводить тесты в поле. Кроме того, случайные проблемы появляются в произвольные моменты времени, и хорошо, что силовые тесты, которые сидят там, уже ждут, чтобы их можно было выполнить в момент уведомления. Место на жестком диске дешево. Точно так же, как мы пытаемся объединить данные и функции (дизайн OO), я думаю, что есть что-то принципиально ценное в совместном тестировании кода и тестов (функция + тесты, которые проверяют функции).

Я хотел бы поместить свои тесты в тот же проект в C # /. NET / Visual Studio 2008, но я до сих пор не исследовал это достаточно для его достижения.

Одно большое преимущество сохранения Foo.cs в том же проекте, что и FooTest.cs, заключается в том, что разработчикам постоянно напоминают, когда class пропускает тест для родного брата! Это стимулирует лучшие методы кодирования, основанные на опыте … дыры более очевидны.

Поместите модульные тесты в том же проекте, что и код, чтобы добиться лучшей инкапсуляции.

Вы можете легко протестировать внутренние методы, что означает, что вы не будете публиковать методы, которые должны были быть внутренними.

Также очень приятно, чтобы модульные тесты были близки к коду, который вы пишете. Когда вы пишете метод, вы можете легко найти соответствующие модульные тесты, потому что они находятся в одном проекте. Когда вы создаете сборку, которая включает в себя unitTests, любые ошибки в модуле unitTest предоставят вам компилятор, поэтому вы должны сохранить свой unittest в актуальном состоянии, просто для его сборки. Устранение в отдельном проекте может заставить некоторых разработчиков забыть о создании проекта unittest и пропустить неполные тесты на некоторое время.

И вы можете удалить модульные тесты из производственного кода, используя tags компиляции (IF #Debug).

Автоматические тесты интеграции (сделанные i NUnit) должны быть в отдельном проекте, поскольку они не принадлежат ни одному проекту.

Мои модульные тесты всегда идут в отдельном проекте. Фактически, для каждого проекта, который у меня есть в моем решении, есть отдельный тестовый проект, который идет вместе с ним. Код тестирования не является кодом приложения и не должен смешиваться с ним. Одно из преимуществ сохранения их в отдельных проектах – по крайней мере, с использованием TestDriven.Net – заключается в том, что я могу щелкнуть правой кнопкой мыши по тестовому проекту и запустить все тесты в этом проекте, протестировав всю библиотеку кода приложения одним щелчком мыши.

Если используется инфраструктура NUnit , есть еще одна причина, чтобы поставить тесты в один и тот же проект. Рассмотрим следующий пример производственного кода, смешанного с модульными тестами:

 public static class Ext { [TestCase(1.1, Result = 1)] [TestCase(0.9, Result = 1)] public static int ToRoundedInt(this double d) { return (int) Math.Round(d); } } 

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

Обновление : я знаю, что такое использование атрибута TestCase не было тем, что разработчики NUnit задумали, но почему бы и нет?

Я колеблюсь между тем же проектом и разными проектами.

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

При сдаче тестов в одном проекте мне легче переключаться между тестами и тестируемым кодом, а также проще реорганизовывать / перемещать их.

Я поместил их в отдельные проекты. Имя сборки зеркально отображает пространство имен, как общее правило для нас. Так что если есть проект под названием Company.Product.Feature.sln, он имеет выход (имя сборки) Company.Product.Feature.dll. Испытательный проект – Company.Product.Feature.Tests.sln, уступая Company.Product.Feature.Tests.dll.

Лучше всего держать их в одном решении и контролировать вывод через Configuration Manager. У нас есть именованная конфигурация для каждого из основных ветвей (Development, Integration, Production) вместо использования Debug и Release по умолчанию. После настройки конфигурации вы можете включить или исключить их, щелкнув флажок «Построить» в Configuration Manager. (Чтобы получить Configuration Manager, щелкните его правой кнопкой мыши и перейдите в Configuration Manager.) Обратите внимание, что я нахожу, что CM в Visual Studio время от времени ошибочно. Пару раз мне приходилось входить в файлы проекта и / или решения, чтобы очистить цели, которые он создал.

Кроме того, если вы используете Team Build (и я уверен, что другие инструменты сборки .NET одинаковы), вы можете затем связать сборку с именованной конфигурацией. Это означает, что, если вы не создаете модульные тесты для своей сборки «Производство», например, проект сборки также может быть осведомлен об этом параметре, а не создавать их, поскольку они были помечены как таковые.

Кроме того, мы использовали кадры XCopy с машины сборки. Сценарий просто опустил бы копирование чего-либо с именем * .Tests.Dll из развертывания. Это было просто, но работало.

Я бы сказал, держать их отдельно.

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

Я действительно вдохновлен модульной модуляцией библиотеки Flood NN Робертом Лопесом. Он использует другой проект для каждого отдельного тестируемого classа и имеет одно решение, содержащее все эти проекты, а также основной проект, который компилирует и запускает все тесты.

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

Я знаю, что это очень старый вопрос, но я хотел бы добавить свой опыт там. Недавно я изменил привычку тестирования модhive от отдельных проектов к одному.

Зачем?

Во-первых, я очень склонен хранить основную структуру папок проекта так же, как в тестовом проекте. Итак, если у меня есть файл в разделе « Providers > DataProvider > SqlDataProvider.cs то я Providers > DataProvider > SqlDataProvider.cs же структуру в своих модульных тестовых проектах, как « Providers > DataProvider > SqlDataProvider.Tests.cs

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

Во-вторых, не всегда очень легко перемещаться из classа, который должен быть протестирован в единый тестовый class. Это еще сложнее для JavaScript и Python.

Недавно я начал практиковать это, каждый отдельный файл, который я создал (например, SqlDataProvider.cs ) Я создаю еще один файл с суффиксом Test, например SqlDataProvider.Tests.cs

Вначале кажется, что он раздувает файлы и ссылки на библиотеки, но в долгосрочной перспективе вы исключите синдром движущегося файла с первого взгляда, а также убедитесь, что каждый отдельный файл, являющийся кандидатами на тестирование, будет иметь пару файлов с суффиксом .Tests . Это дает вам возможность прыгать в тестовый файл (потому что он бок о бок) вместо того, чтобы просматривать отдельный проект.

Вы даже можете написать бизнес-правила для сканирования через проект и определить class, который не имеет файла .Tests, и сообщить об этом владельцу. Кроме того, вы можете легко сказать своему тестируемому бегуну, чтобы он .Tests classы .Tests .

Специально для Js и Python вам не нужно будет импортировать ваши ссылки с другого пути, вы можете просто использовать тот же путь к тестируемому целевому файлу.

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

Отдельные проекты, хотя я делюсь с самим собой, должны ли они делиться тем же svn. На данный момент я предоставляю им отдельные хранилища svn, один из которых называется

«MyProject» – для самого проекта

и один вызвал

«MyProjectTests» – для тестов, связанных с MyProject.

Это довольно чистое и имеет то преимущество, которое совершает проект и совершает тесты, довольно раздельные. Это также означает, что вы можете передать svn проекта, если это необходимо, без необходимости выпускать тесты. Это также означает, что вы можете иметь каталоги ветвей / туловищ / тегов для своих тестов и для своего проекта.

Но я все больше склонен иметь что-то вроде следующего, в одном репозитории svn, для каждого проекта.

 Мой проект
 | \ Магистральные
 |  | \ Code
 |  \ тесты
 | \ Теги
 |  | \ 0,1
 |  |  | \ Code
 |  |  \ тесты
 |  \ 0,2
 |  | \ Code
 |  \ тесты
 \Ветви
   \ MyFork
    | \ Code
     \Контрольная работа

Мне было бы интересно узнать, что другие люди думают об этом решении.

  • Окончательный метод издевательств
  • Запуск PostgreSQL только в памяти
  • Смыкая свободную функцию
  • Как проверить частную функцию или class с частными методами, полями или внутренними classами?
  • Управление порядком выполнения модульных тестов в Visual Studio
  • Visual Studio 2015 или 2017 не обнаруживает модульные тесты
  • Единичное тестирование DbContext
  • Можно ли издеваться над .NET HttpWebResponse?
  • Как использовать Assert для проверки того, что было выбрано исключение?
  • Настройка IntelliJ IDEA для модульного тестирования с помощью JUnit
  • Как вы издеваетесь над коллекцией объектов сеанса с помощью Moq
  • Interesting Posts

    Что объединяет повторяющиеся наборы информации о строках в новые объекты, вызываемые при нормализации базы данных?

    Как сгенерировать все пары из двух векторов в MATLAB с помощью векторизованного кода?

    Недействительный BOOT.INI (двойной загрузочный XP с 7)

    Космические лучи: какова вероятность того, что они повлияют на программу?

    Инвертирование вращения в 3D, чтобы объект всегда стоял перед камерой?

    Как вы получаете встроенный инструмент сравнения Eclipse, чтобы игнорировать различия в пробелах?

    Qt5. Вставить объект QWidget в QML

    Как вы клонируете repository Git в определенную папку?

    Поиск инструмента для отображения IP-пакетов (и проведения анализа), отправленных / полученных с / на мой компьютер (хотите отладить, почему не удается подключить сетевой диск)

    Исходный код для Mac OS X Обновления Java

    Как определить состояние Wi-Fi-модема

    В чем смысл запланированного модификатора доступа к закрытой защите?

    Возможно ли открыть текущего владельца папки?

    Как точно работает понимание генератора?

    Как я могу определить, какую именно версию сервера Exchange я подключаю к Outlook?

    Давайте будем гением компьютера.