NUnit扩展

时间:2011-07-12 12:39:05

标签: nunit nunit-2.5

大家好我对NUnit Extension(2.5.10)有疑问。 我想要做的是写一些额外的测试信息 数据库。为此,我使用Event创建了NUnit扩展 听众。 我遇到的问题是公共空白 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 个答案:

答案 0 :(得分:1)

我设法通过简单地删除我的扩展来解决问题 从NUnit 2.5.10 \ bin \ net-2.0 \ addins文件夹中组装。在这一刻 一切都按预期工作,但我不知道如何。我以为你 必须在addins文件夹中包含扩展/插件程序集。 我通过NUnit.exe打开解决方案来运行测试。我的扩展 项目是我正在测试的解决方案的一部分。我也向NUnit提出了这个问题并得到了以下解释:

最有可能的是,你的插件被加载了两次。为了更容易测试插件,除了搜索addins目录外,NUnit还会搜索每个测试程序集中要加载的插件。通常,当您确信您的插件有效时,应将其从测试程序集中删除并将其安装在addins文件夹中。这使得它可用于使用NUnit运行的所有测试。 OTOH,如果你真的只想让插件申请某个项目,那么你可以将它留在测试程序集中,而不是将其作为永久插件安装。 http://groups.google.com/group/nunit-discuss/browse_thread/thread/c9329129fd803cb2/47672f15e7cc05d1#47672f15e7cc05d1

答案 1 :(得分:0)

不确定这个答案是否严格相关,但可能有用。

我最近正在使用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方法的问题,这些方法仅在TestSuite运行时在NUnit中调用(而不是自己运行测试方法)。

这两个似乎都是NUnit的问题,虽然如果你不想单独构建包装测试,我认为你可以用适当的参数调用suite.Run,​​这将解决后一个问题