2010-05-09 73 views
14

我想使用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的数据结构,只有1测试和我有同样的错误。

为了完整起见,我使用了最新版本的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

你可以建立一个小的,但是完整的程序+插件,并告诉我们的代码,即复制的问题?或者,至少,你可以发布你想要测试的插件的类文件吗? – 2010-05-09 18:15:25

+0

难道你的插件是用不同的NUnit版本编译的?我认为这不是来自您在问题中所写的内容,而是......它会使属性类型不兼容。 – 2010-05-09 18:19:44

+0

如果我使用Console.WriteLine(loc),它将打印控制台exe的名称。我试图加载类的DLL,我得到了“访问被拒绝”。然后当我做Console.WriteLine(result.ResultState)它打印“不确定”。你如何得到“没有textfixture”的消息?另外你如何检查它是否事实上加载你的测试DLL。我可能会忽略这里显而易见的东西。 – 2010-05-09 20:24:45

回答

9

我已经发布了我的问题在NUnit的论坛和查理告诉我如何找到问题小费。我认为在这里发布它可能是个好主意,这样其他人就可以避免花费大量时间。解决方法是首先用以下行初始化核心服务:

CoreExtensions.Host.InitializeService(); 

谢谢大家。

1

我在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必须与你的测试程序集的文件夹中。

+0

你应该通过remoteTestRunner.Run某种事件监听器来捕获测试用例运行的输出。我在网上看到的每个例子都使用NullListener(包括你的),它不会捕获输出。你有什么想法如何设置一个事件监听器来捕获输出? – Justin 2011-08-22 19:12:36

+0

“TestResult”的输出不够吗?你错过了什么? – 2011-08-22 20:44:42

13

下面的代码的帮助来解决问题

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); 
    } 
} 
+0

适用于NUnit 2.6.3以来的版本。为了诊断运行测试中的一些问题,编写结果也是有用的:'new XmlResultWriter(@“C:\ Temp \ TestResult.xml”)。SaveTestResult(result)' – ceztko 2014-04-12 11:19:26

+0

当试图在我自己的程序集中运行测试时,一个错误说nunit.core丢失。我已经从nuget添加了'NUnit'和'NUnit Test Adapter'软件包,即使nunit.core出现在引用列表中,代码也找不到它。 – Ziv 2015-07-05 08:22:47