Расширение NUnit
Привет всем У меня есть вопрос, касающийся расширения NUnit (2.5.10). То, что я пытаюсь сделать, это написать дополнительную информацию о тесте в базу данных. Для этого я создал расширение NUnit, используя Event Listeners. Проблема, с которой я сталкиваюсь, заключается в том, что публичный метод void TestFinished(результат TestResult) вызывается дважды во время выполнения. И мой код, который пишет в базу данных, находится в этом методе, и это оставляет меня с дублирующимися записями в базе данных. Вопрос: это ожидаемое поведение? Могу ли я что-нибудь с этим сделать? Код расширения указан ниже. Благодарю.
using System;
using NUnit.Core;
using NUnit.Core.Extensibility;
namespace NuinitExtension
{
[NUnitAddinAttribute(Type = ExtensionType.Core,
Name = "Database Addin",
Description = "Writes test results to the database.")]
public class MyNunitExtension : IAddin, EventListener
{
public bool Install(IExtensionHost host)
{
IExtensionPoint listeners = host.GetExtensionPoint("EventListeners");
if (listeners == null)
return false;
listeners.Install(this);
return true;
}
public void RunStarted(string name, int testCount){}
public void RunFinished(TestResult result){}
public void RunFinished(Exception exception){}
public void TestStarted(TestName testName){}
public void TestFinished(TestResult result)
{
// this is just sample data
SqlHelper.SqlConnectAndWRiteToDatabase("test", test",
2.0, DateTime.Now);
}
public void SuiteStarted(TestName testName){}
public void SuiteFinished(TestResult result){}
public void UnhandledException(Exception exception){}
public void TestOutput(TestOutput testOutput){}
}
}
2 ответа
Мне удалось решить эту проблему, просто удалив мою сборку расширений из папки NUnit 2.5.10\bin\net-2.0\addins. На данный момент все работает как положено, но я не уверен, как. Я думал, что у вас должна быть сборка расширения / надстройки внутри папки надстроек. Я запускаю тесты, открывая решение через NUnit.exe. Мой проект расширения является частью решения, которое я тестирую. Я также поднял эту проблему с парнями из NUnit и получил следующее объяснение:
Скорее всего, ваш аддин загружался дважды. Чтобы упростить тестирование надстроек, NUnit ищет в каждой тестовой сборке надстройки, которые нужно загрузить, в дополнение к поиску в каталоге надстроек. Обычно, когда вы уверены, что ваше дополнение работает, вы должны удалить его из тестовой сборки и установить в папку дополнений. Это делает его доступным для всех тестов, которые выполняются с использованием NUnit. OTOH, если вы действительно хотите, чтобы надстройка применялась только для определенного проекта, вы можете оставить его в тестовой сборке, а не устанавливать его как постоянное дополнение. http://groups.google.com/group/nunit-discuss/browse_thread/thread/c9329129fd803cb2/47672f15e7cc05d1
Не уверен, что этот ответ является строго релевантным, но может быть полезным.
Недавно я изучал библиотеку NUnit, чтобы прочитать тесты NUnit, чтобы их можно было легко перенести в нашу собственную систему приемочных испытаний.
Оказывается, мы, вероятно, не будем придерживаться этого, но подумали, что было бы полезно поделиться своим опытом, выясняющим, как использовать код NUnit:
Он отличается тем, что запускается не консолью NUnit или Gui Runner, а только нашим собственным консольным приложением.
public class NUnitTestReader
{
private TestHarness _testHarness;
public void AddTestsTo(TestHarness testHarness)
{
_testHarness = testHarness;
var package = new TestPackage(Assembly.GetExecutingAssembly().Location){AutoBinPath = true};
CoreExtensions.Host.InitializeService();
var testSuiteBuilder = new TestSuiteBuilder();
var suite = testSuiteBuilder.Build(package);
AddTestsFrom(suite);
}
private void AddTestsFrom(Test node)
{
if (!node.IsSuite)
AddTest(node);
else
{
foreach (Test test in node.Tests)
AddTestsFrom(test);
}
}
private void AddTest(Test node)
{
_testHarness.AddTest(new WrappedNUnitTest(node, TestFilter.Empty));
}
}
Вышесказанное читает тесты NUnit из текущей сборки, оборачивает их, а затем добавляет их в наш внутренний тестовый комплект. Я не включил эти классы, но они не очень важны для понимания того, как работает код NUnit.
Действительно полезная часть информации здесь - это статический элемент для InitialiseService, который потребовалось немало для выяснения, но он необходим для загрузки базового набора считывателей тестов в NUnit. Вы должны быть немного осторожнее при рассмотрении тестов в NUnit, а также в том, что они включают в себя неудачные тесты (которые, как я полагаю, не работают из-за большого количества статических элементов) - поэтому то, что выглядит как полезная документация, фактически вводит в заблуждение.
Кроме того, вы можете запустить тесты, реализовав EventListener. Мне было интересно получить взаимно-однозначное соответствие между нашими тестами и тестами NUnit, чтобы каждый тест выполнялся самостоятельно. Для достижения этого вам просто нужно реализовать TestStarted и TestFinished для ведения журналов:
public void TestStarted(TestName testName)
{
}
public void TestFinished(TestResult result)
{
string text;
if (result.IsFailure)
text = "Failure";
else if (result.IsError)
text = "Error";
else
return;
using (var block = CreateLogBlock(text))
{
LogFailureTo(block);
block.LogString(result.Message);
}
}
У этого подхода есть пара проблем: Унаследованные тестовые базовые классы из других сборок с методами SetUp, которые делегируются тем в текущей сборке, не вызываются. У него также есть проблемы с методами TestFixtureSetup, которые вызываются только в NUnit, когда TestSuites запущены (в отличие от запуска методов тестирования самостоятельно).
Обе эти проблемы, похоже, являются проблемами с NUnit, хотя, если вы не хотите создавать обернутые тесты по отдельности, я думаю, вы можете просто вызвать вызов suite.Run с соответствующими параметрами, и это решит последнюю проблему