Как запустить NUnit из моего кода

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

Я не нашел конкретной документации по этому вопросу, поэтому я вырыл часть информации здесь и там, и я вышел со следующим фрагментом кода (который похож на тот, который я нашел здесь в StackOverflow):

    public static void Main()
    {
        SimpleTestRunner runner = new SimpleTestRunner();
        TestPackage package = new TestPackage( "Test" );
        string loc = Assembly.GetExecutingAssembly().Location
        package.Assemblies.Add( loc );
        if( runner.Load(package) )
        {
            TestResult result = runner.Run( new NullListener() );
        }
    }

В переменной результата указано, что "нет TestFixture", хотя я точно знаю, что он есть. На самом деле мой тестовый файл содержит два теста.

Используя другой подход, который я нашел, который суммируется следующим кодом:

TestSuiteBuilder builder = new TestSuiteBuilder();
TestSuite testSuite = builder.Build( package );

// Run tests
TestResult result = testSuite.Run( new NullListener(), NUnit.Core.TestFilter.Empty );

Я видел структуры данных nunit только с одним тестом, и у меня была такая же ошибка.

Для полноты я использую последнюю версию nunit, которая составляет 2.5.5.10112.

Кто-нибудь знает, что мне не хватает? Примерный код будет оценен. Мой тестовый класс:

[TestFixture]
public class UnitTests
{
    public UnitTests()
    {
    }

    [Test]
    public void TestEqual()
    {
        long a = 10;
        long b = 10;
        Assert.AreEqual( a, b );
    }

    [Test]
    public void TestNotEqual()
    {
        long a = 10;
        long b = 11;
        Assert.AreNotEqual( a, b );
    }
}

Ответы

Ответ 1

Нижеприведенный код поможет решить проблему.

public static void Main()
{
    CoreExtensions.Host.InitializeService();
    SimpleTestRunner runner = new SimpleTestRunner();
    TestPackage package = new TestPackage( "Test" );
    string loc = Assembly.GetExecutingAssembly().Location;
    package.Assemblies.Add( loc );
    if( runner.Load(package) )
    {
        TestResult result = runner.Run( new NullListener(),
            TestFilter.Empty, false, LoggingThreshold.Off );
    }
}

Ответ 2

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

CoreExtensions.Host.InitializeService();

спасибо всем.

Ответ 3

У меня были проблемы с классом SimpleTestRunner(). В конце я программно переключился на класс RemoteTestRunner() для выполнения модульных тестов. Реализация намного проще и лучше всего работает.

TestPackage package = new TestPackage(@"C:\YourProject.Tests.dll");
RemoteTestRunner remoteTestRunner = new RemoteTestRunner();
remoteTestRunner.Load(package);
TestResult result = remoteTestRunner.Run(new NullListener());

Вам необходимо ссылаться на следующие сборки:

  • nunit.core.dll
  • nunit.core.interfaces.dll

И, конечно, nunit.framework.dll должен находиться в папке с вашей тестовой сборкой.