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

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

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

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

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


person Tim    schedule 12.10.2009    source источник
comment
также рассмотрите xunit, однако, что бы вы ни делали, посмотрите TestDriven.net   -  person Ian Ringrose    schedule 12.10.2009
comment
См. Также stackoverflow.com/questions/707444/   -  person David Schmitt    schedule 17.02.2010
comment
попробуйте xunit.net. Это хороший фреймворк для модульного тестирования приложения .net с открытым исходным кодом.   -  person Mukesh Arora    schedule 14.04.2019


Ответы (10)


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

  1. Атрибут Suite - может агрегировать тесты и выполнять их отдельно (например, полезно для больших проектов с быстрыми и медленными тестами)
  2. Читаемый метод Assert, например Assert.AreEqual(expected, actual) против Assert.That(actual, Is.EqualTo(expected))
  3. NUnit имеет частые обновления версий - MS-Test имеет только одно обновление для каждой версии VS.
  4. Множество интегрированных бегунов, включая Resharper и TestDriven.NET
  5. Утверждение ожидаемого сообщения об исключении - может быть выполнено с использованием атрибута в NUnit, но должно быть выполнено с помощью Try-Catch в MS-Test
  6. [TestCase]! NUnit позволяет проводить параметризованные тесты.
person Elisha    schedule 12.10.2009
comment
Исключение также может быть заявлено с помощью атрибута в MS-Test: ExpectedExceptionAttribute. - person Stefan Steinegger; 12.10.2009
comment
Я бы использовал NUnit с Assert.Throws ‹› (), потому что это соответствует принципу AAA, который не реализован для атрибута. - person Oliver Hanappi; 12.10.2009
comment
@Stefan Steinegger, MSTest имеет ожидаемый атрибут исключения, но не может проверить текст сообщения - person Elisha; 16.10.2009
comment
У NUnit есть автономный бегун, который легко и легко установить. - person Ruben Bartelink; 17.12.2009
comment
№3 - это не функция, это проблема, а №5 - 100% ложь; MS Test имеет атрибут ExpectedException, и всегда имеет. - person Randolpho; 17.12.2009
comment
@Randolpho, ExpectedException существует, но не поддерживает утверждение сообщения. Отсутствует только утверждение сообщения об исключении, а не само выброшенное исключение. Я могу утверждать, используя атрибут MS-Test, если было выбрано исключение, но если я хочу убедиться, что оно содержит правильное сообщение, это необходимо сделать с помощью try-catch. - person Elisha; 17.12.2009
comment
@Elisha Насколько я помню, они намеренно не поддерживали проверку текста сообщений, потому что текст не считается значимым и может быть произвольным. То есть это не влияет на выполнение программы. - person Rob Kent; 20.09.2011
comment
# 3 - это не особенность, это проблема - звучит не очень гибко ... - person SamuelKDavis; 05.01.2015
comment
Какое из этих выражений в пункте 2 является NUnit, а какое - MSTest? - person kdbanman; 21.07.2015
comment
Assert.That (фактический, Is.EqualTo (ожидаемый)) - Nunit, другой - MSTest. - person Elisha; 24.07.2015

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

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

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

person flq    schedule 12.10.2009
comment
+1, избегайте MSTest, если у вас нет выбора. Лучше использовать различные фреймворки с открытым исходным кодом (xUnit, NUnit, MbUnit и т. Д.). - person Brannon; 17.12.2009

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

  • Мы запускаем MS Test примерно с 3800 Test.
  • Чтобы тесты только начали выполняться, требуется очень много времени, что болезненно при запуске одиночных тестов.
  • Для выполнения тестов требуется около 1 ГБ памяти. Нет, это не связано с утечкой памяти в наших тестах. Часто мы сталкиваемся с OutOfMemoryExceptions.
  • Поскольку он использует столько ресурсов, мы начинаем выполнять тесты из командных файлов. Так для чего нужна вся интеграция?
  • It is buggy and unstable:
    • For instance, if you remove the [Ignore] Attribute from a test, it does not recognize it, because it caches information about tests somewhere. You need to refresh the testlist, which sometimes solves the problem, or restart 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.

person Stefan Steinegger    schedule 12.10.2009
comment
Недавно я начал запускать их без отладки, это делает их намного быстрее и намного больше похоже на то, как можно использовать NUnit, но это все еще отстой. Похоже, что низкая производительность связана с тем, что Visual Studio делает странные вещи при отладке. (То есть используйте ctrl + F5, а не просто F5 - вы все равно получите хорошую интеграцию с VS) - person Arafangion; 13.12.2010
comment
Хороший ответ, сэкономил мое время - person FindOutIslamNow; 30.09.2017

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

http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=nunitit&DownloadId=61802

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

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

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

person bastijn    schedule 12.10.2009

Самым большим преимуществом MS-Test перед NUnit является то, что MS-Test может генерировать фиктивные объекты с помощью Reflection. Я нашел это очень полезным

person Maciej    schedule 15.10.2009
comment

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

person Per Erik Stendahl    schedule 12.10.2009
comment
Не забывайте экспресс-версии Visual Studios. - person chobo2; 15.10.2009
comment
Шаг после сборки в проекте сборки модульного теста - \ path \ to \ nUnit $ (TargetFileName) - person Steve Gilham; 15.10.2009

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

person Vinay Pandey    schedule 12.10.2009

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

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

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

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

person Mourad Samy    schedule 06.06.2018

Если вы используете 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");

        }
    }
}
person Nipuna Prashan    schedule 17.07.2014
comment
Конечно, вы не должны использовать NUnit, это просто фреймворк, никто не заставляет вас его использовать. Вы даже можете написать свой, если вам скучно. - person HimBromBeere; 20.05.2016