Каков наилучший способ отладки теста NUnit?
Моя платформа: Visual С# 2008 Express Edition с NUnit 2.2.7
У меня есть решение с моим кодом в одном проекте, а мои модули NUnit тестируются в другом проекте в том же решении.
Я изо всех сил старался отлаживать и выполнять одно шаг через тесты NUnit. Я нашел несколько ссылок в Интернете, в которых предлагалось вызвать следующее:
NUnit.ConsoleRunner.Runner.Main(args);
Но это даже не компилируется - у него есть ошибка компилятора:
Ошибка 1 Тип или имя пространства имен "Бегун" не существует в namespace 'NUnit.ConsoleRunner' (есть вам не хватает ссылки на сборку?)
Я добавил каждую ссылку на сборку, которую я мог найти, без эффекта.
Наконец, это то, что я взломал вместе, и это работает, но, возможно, вы, хорошие читатели, могли бы предложить лучшее решение:
1) В моем тестовом проекте имя класса тестового примера, которое я хочу отлаживать, это MyTestClass. Он имеет метод [TestFixtureSetUp] с именем Init(), и фактический тестовый пример находится в функции [Test] MyTest()
2) В моем проекте кода у меня есть консольная программа TestProgram.cs, которая компилируется в EXE.
В TestProgram.cs я вызываю тестовые примеры следующим образом
// First instantiate the test class
MyTestClass tc = new MyTestClass();
// Call the TestFixtureSetup method
tc.Init();
// Now call the actual test
tc.MyTest();
Это работает, и я могу отлаживать и выполнять один шаг через тестовые примеры.
Если у кого-то есть лучшие предложения, использующие Visual Studio 2008 Express, не платя за дополнительные плагины, я ценю ваш совет.
Ответы
Ответ 1
Джон как хороший способ, но не более автоматический;)
Вот что я уже сказал на SO:
Вы можете создать пустой проект (например, консольное приложение), а в свойстве проекта вы можете выбрать тег DEBUG и выбрать Start External Program
. Поместите путь Нунита. Затем в параметре start аргументы командной строки выбирают DLL, содержащую все ваши тесты (моя всегда находится в nunit\bin...). Затем выберите Enable unmanaged code debugging
, и вы сможете запустить проект внутри VS и даже использовать пошаговый отладчик.
Таким образом, вам не нужен макрос или что-то, что нужно делать каждый раз, это просто нормальный F5:)
Ответ 2
Поскольку вы используете экспресс-версию Visual Studio, вы не можете использовать бесплатную надстройку TestDriven.NET. Это несчастливо, потому что это действительно лучший инструмент, который я использовал для отладки модульных тестов.
Класс Runner
можно найти в сборке nunit-console-runner.dll, поэтому не забудьте добавить ссылку на него. Я не уверен, что что-то делает, что ваша простая точка входа не работает, но, вероятно, лучше всего использовать ее для обеспечения безопасности и для будущей совместимости.
Еще один (грязный) вариант стоит упомянуть для вашего unit test для вызова Debugger.Attach()
. Я не пробовал это с экспресс-установкой, но при запуске unit test вам должно быть предложено приложить отладчик. Затем вы можете выбрать существующий экземпляр VS и отладить его.
Ответ 3
Посмотрите http://nunit.com/blogs/?p=28
Это работает.
Ответ 4
В моем магазине мы делаем это точно так же, как и вы. С другой стороны, это означает, что установка может быть не такой, как это делает NUnit. Сверху это довольно просто сделать и позволяет создать минимальную среду для воспроизведения ошибки.
Ответ 5
Я нашел несколько ссылок в Интернете, которые предложил назвать следующее: NUnit.ConsoleRunner.Runner.Main(args);
Но это даже не компилируется - оно ошибка компилятора:
JFYI
Вам нужно добавить ссылку .NET DLL на сборку nunit-console-runner в наборе DLL NUnit (у меня есть 2.2.4.0)
Похоже, класс также был переименован, но его там, если он вам нужен.
NUnit.ConsoleRunner.ConsoleUi.Main(args);
Ответ 6
Если у вас установлен ReSharper, он должен иметь возможность обнаруживать ваши приборы [Test] и размещать значок слева от каждого используемого метода и слева от каждого тестового прибора для запуска всего. Я предпочитаю этот путь.
Большинство людей на работе также имеют TestDriven.NET, которые по какой-то причине не на моей машине, поэтому они задаются вопросом, что происходит. Это довольно забавно.