Расширение NUnit - PullRequest
       42

Расширение NUnit

5 голосов
/ 12 июля 2011

Привет всем У меня есть вопрос, касающийся расширения NUnit (2.5.10). Что я пытаюсь сделать, это написать дополнительную информацию о тесте в база данных. Для этого я создал расширение NUnit, используя Event Слушатели. Проблема, с которой я сталкиваюсь, заключается в том, что общественная пустота TestFinished (TestResult result) метод вызывается дважды в во время выполнения. И мой код, который пишет в базу данных в этом методе и это оставляет меня с дубликатами записей в базе данных. вопрос: это ожидаемое поведение? Могу ли я что-то сделать с Это? Код расширения указан ниже. Спасибо.

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 ]

1 голос
/ 13 июля 2011

Мне удалось решить проблему, просто удалив мою сборку расширений из папки 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#47672f15e7cc05d1

0 голосов
/ 26 марта 2012

Не уверен, что этот ответ является строго релевантным, но может быть полезным.

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

...