Модульный тест, NUnit или Visual Studio?

114

Я использую Visual Studio (иногда resharper) для запуска своего модульного теста.

Я слышал о NUnit, но многого о нем не знаю ...

Должен ли я заботиться об этом? Может ли он предложить что-то лучше, чем визуальная студия?

Стоит ли использовать NUnit и почему?

Тим
источник
12
также рассмотрите xunit, однако, что бы вы ни делали, посмотрите TestDriven.net
Ян Рингроуз
См. Также stackoverflow.com/questions/707444/…
Дэвид Шмитт
попробуйте xunit.net. Это удобный фреймворк для модульного тестирования приложения .net с открытым исходным кодом.
Мукеш Арора

Ответы:

100

У NUnit мало преимуществ перед MS-Test

  1. Атрибут Suite - может агрегировать тесты и выполнять их отдельно (например, полезно для больших проектов с быстрыми и медленными тестами)
  2. Читаемый метод Assert, например Assert.AreEqual(expected, actual)vsAssert.That(actual, Is.EqualTo(expected))
  3. NUnit имеет частые обновления версий - MS-Test имеет только одно обновление для каждой версии VS.
  4. Многие интегрированные раннеры, включая Resharper и TestDriven.NET
  5. Утверждение ожидаемого сообщения об исключении - может быть выполнено с использованием атрибута в NUnit, но должно быть выполнено с помощью Try-Catch в MS-Test
  6. [TestCase]! NUnit позволяет проводить параметризованные тесты.
Елисей
источник
32
Исключение также может быть заявлено с помощью атрибута в MS-Test: ExpectedExceptionAttribute.
Стефан Штайнеггер,
9
Я бы использовал NUnit с Assert.Throws <> (), потому что это соответствует принципу AAA, который не используется для атрибута.
Оливер Ханаппи,
25
№3 - это не функция, это проблема, а №5 - 100% ложь; MS Test имеет атрибут ExpectedException и всегда имел .
Randolpho
4
@Elisha Насколько я помню, они намеренно не поддерживали проверку текста сообщений, потому что текст не считается значимым и может быть произвольным. То есть это не влияет на выполнение программы.
Роб Кент,
7
«№3 - это не особенность, это проблема» - не похоже на очень гибкий образ мышления ...
SamuelKDavis
72

С моей точки зрения текущего (после 8 месяцев развития с около 10 разработчиков в среднем) я бы посоветовал против использования MSTest по следующим причинам

  • Сам по себе фреймворк довольно медленный. Я не имею в виду тестовый код, который вы пишете - он находится под вашим контролем. Я имею в виду, что фреймворк, выполняющий эти тесты, работает медленно, независимо от того, работает ли он с набором тестов, отдельными тестами и т. Д.
  • Необходимость хранить файл тестовых метаданных, что всегда приводит к осложнениям, когда над ним работают несколько разработчиков (например, воссоздают метаданные и т. Д.). Для любого другого набора тестов не нужен файл метаданных. Приятно организовывать тесты, но вы можете добиться того же с помощью пространств имен, классов и имен методов.
  • При непрерывной интеграции, если вы хотите запускать модульные тесты на своем компьютере сборки, вам необходимо установить Visual Studio на этом компьютере.

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

FLQ
источник
6
+1, избегайте MSTest, если у вас нет выбора. Лучше использовать различные фреймворки с открытым исходным кодом (xUnit, NUnit, MbUnit и т. Д.).
Браннон
49

Вот мой опыт работы с MS Test

  • Мы запускаем MS Test примерно с 3800 Test.
  • Чтобы тесты только начали выполняться, требуется очень много времени, что болезненно при запуске одиночных тестов.
  • Для выполнения тестов требуется около 1 ГБ памяти. Нет, в наших тестах это не связано с утечкой памяти. Часто мы сталкиваемся с OutOfMemoryExceptions.
  • Поскольку он использует столько ресурсов, мы начинаем выполнять тесты из командных файлов. Так для чего нужна вся интеграция?
  • Глючит и нестабильно:
    • Например, если вы удалите атрибут [Игнорировать] из теста, он не распознает его, потому что где-то кэширует информацию о тестах. Вам нужно обновить список тестов, что иногда решает проблему, или перезапустить VS.
    • Он случайным образом не копирует ссылочные сборки в исходный каталог.
    • Элементы развертывания (используемые дополнительные файлы) просто не работают должным образом. Они игнорируются случайным образом.
  • В файлах vsmdi и testrunconfig есть скрытая (не видимая в тестовом коде) информация. Если вас это не волнует, это может не сработать.
  • Функционально он может быть сопоставим с NUnit, но это очень дорого, если вы рассматриваете возможность использования версии VS-тестера.

Дополнение: Сейчас у нас еще несколько тестов, даже не могу сказать сколько. Их все больше невозможно запускать из Visual Studio из-за OutOfMemoryExceptions и других проблем нестабильности. Запускаем тесты из скриптов. Было бы легко просмотреть результаты тестирования в Visual Studio, но когда решение открыто, VS дает сбой (каждый раз). Поэтому нам нужно искать неудачные тесты с помощью текстового поиска. Больше нет преимущества интегрированного инструмента.


Другое обновление : сейчас мы используем VS 2013. Много чего изменилось. Они переписали средство запуска тестов MS Test в третий раз с нашего старта. Это вызвало множество критических изменений, но ни одна новая версия не улучшила ничего. Мы рады, что не использовали необычные функции MS Test, потому что все они больше не поддерживаются. Это действительно обидно. Мы по-прежнему используем сценарии для создания и запуска всех модульных тестов, потому что это удобнее. Visual Studio потребовалось несколько минут для запуска тестов (время измеряется после компиляции до первого запуска теста). Вероятно, они исправят это с помощью обновления, и это может быть конкретной проблемой нашего проекта. Однако Resharper работает намного быстрее при выполнении тех же тестов.

Вывод : По крайней мере, в сочетании с Resharper, MS Test полезен. И я надеюсь, что они наконец-то узнают, как следует писать средство запуска тестов, и не будут вносить таких критических изменений при следующем обновлении Visual Studio.

Стефан Штайнеггер
источник
Недавно я начал запускать их без отладки, это делает их намного быстрее и больше похоже на то, как можно использовать NUnit, но это все еще отстой. Похоже, что низкая производительность связана с тем, что Visual Studio делает странные вещи при отладке. (То есть используйте «ctrl + F5», а не просто «F5» - вы все равно получите хорошую «интеграцию» с VS)
Арафангион
Хороший ответ, сэкономил мое время
FindOutIslamNow
18

NUnit можно использовать в сочетании с Visual Studio. Это фреймворк, а не отдельная программа. Так что вы можете посмотреть, подходит ли вам это :).

альтернативный текст http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=nunitit&DownloadId=61802

«После установки плагина вы найдете новое подменю в меню инструментов».

См. Http://nunitit.codeplex.com/ для получения дополнительной информации об импорте.

Также многое можно найти с помощью поиска SO. В этом разделе перечислены преимущества NUnit, например, перед стандартным тестированием MS.

bastijn
источник
3

NUnit работает со стандартной версией VS.

Пер Эрик Стендаль
источник
1
Не забывайте экспресс-версии Visual Studios.
chobo2,
Шаг после сборки в проекте сборки модульного теста - \ path \ to \ nUnit $ (TargetFileName)
Стив Гилхэм,
1

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

Виней Пандей
источник
1

NUnit - это фреймворк для модульного тестирования, который также поддерживается resharper. Я думаю, вы используете фреймворк модульного тестирования Microsoft, поэтому NUnit - просто альтернатива продукту Microsoft;)

Вот ссылка на домашнюю страницу NUnit: http://nunit.org

Оливер Ханаппи
источник
Значит, вы имеете в виду, что nunit не предлагает ничего, кроме фреймворка для модульного тестирования Microsoft?
Тим,
Это так, см. Мою ссылку, например, в моем сообщении (выше).
bastijn
Я использую NUnit и ничего не знаю о фреймворке модульного тестирования Microsoft, поэтому не могу сказать, что лучше. Я думаю, что есть хороший шанс, что вы найдете здесь тему о различиях в SO.
Оливер Ханаппи,
Он предоставляет некоторые полезные конструкции, такие как [TestCase] ​​для запуска одного метода тестирования с разными аргументами, [Theory] - для создания более сложных спецификаций и другие. Он также поддерживает очень удобный синтаксис утверждений. И, наконец, что не менее важно, он используется гораздо шире, чем MSTest, поэтому у вас будет больше шансов получить поддержку / информацию, если у вас возникнут проблемы.
Elder_george
0

В NUnit тесты не выполняются параллельно. Скорее кажется, что все тесты выполняются в одном потоке. В MSTest каждый тест создается в отдельном потоке, в результате чего прогоны чередуются. Следовательно, если успех теста A зависит от теста B, он, скорее всего, не удастся, так как тест B, скорее всего, начнет выполняться во время выполнения теста A.

Мурад Сами
источник
-12

Если вы используете Visual Studio, вам необходимо использовать NUnit для выполнения модульного теста, а если вы используете java (Netbeans), вы должны использовать JUnit для модульного теста.

Вот пример простого модульного теста калькулятора

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SimpleCalculator;
using NUnit.Framework;

namespace CalculatorTest
{
    [TestFixture]
    public class Class1
    {
        public Calculator _calculator;
        [TestFixtureSetUp]
        public void Initialize()
        {
            _calculator = new Calculator();
        }
        [Test]
        public void DivideTest()
        {
            int a = 10;
            int b = 2;
            int expectedValue = a / b;
            int actualvalue = _calculator.Divide(a, b);
            Assert.AreEqual(expectedValue, actualvalue,"Failure");

        }
    }
}
Нипуна Прашан
источник
4
Конечно, вам не обязательно использовать NUnit, это просто фреймворк, никто не заставляет вас его использовать. Вы даже можете написать свой, если вам скучно.
HimBromBeere