大家好我对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){}
}
}
答案 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,这将解决后一个问题