Расширение 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 с соответствующими параметрами, и это решит последнюю проблему

Другие вопросы по тегам