Не уверен, что этот ответ является строго релевантным, но может быть полезным.
Недавно я поиграл с библиотекой 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 с соответствующими параметрами, и это решит последнюю проблему