C# 如何从我的代码运行NUnit

C# 如何从我的代码运行NUnit,c#,nunit,C#,Nunit,我希望使用NUnit在插件中运行单元测试,但它需要在应用程序的上下文中运行。为了解决这个问题,我尝试开发一个运行NUnit的插件,它将在应用程序的上下文中执行我的测试 我没有找到关于这个主题的具体文档,所以我在这里和那里挖掘了一段信息,并得出了以下代码(与我在StackOverflow中找到的代码类似): 结果变量表示“没有TestFixture”,尽管我确信它确实存在。事实上,我的测试文件包含两个测试 使用我发现的另一种方法,下面的代码对其进行了总结: TestSuiteBuilder bui

我希望使用NUnit在插件中运行单元测试,但它需要在应用程序的上下文中运行。为了解决这个问题,我尝试开发一个运行NUnit的插件,它将在应用程序的上下文中执行我的测试

我没有找到关于这个主题的具体文档,所以我在这里和那里挖掘了一段信息,并得出了以下代码(与我在StackOverflow中找到的代码类似):

结果变量表示“没有TestFixture”,尽管我确信它确实存在。事实上,我的测试文件包含两个测试

使用我发现的另一种方法,下面的代码对其进行了总结:

TestSuiteBuilder builder = new TestSuiteBuilder();
TestSuite testSuite = builder.Build( package );

// Run tests
TestResult result = testSuite.Run( new NullListener(), NUnit.Core.TestFilter.Empty );
我看到nunit数据结构只有一次测试,我也有同样的错误

为了完整起见,我使用的是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 );
    }
}

我在NUnit论坛上发布了我的问题,Charlie给了我一个如何发现问题的提示。我认为把它贴在这里可能是个好主意,这样其他人就可以避免花很多时间在上面。解决方案是首先使用以下行初始化核心服务:

CoreExtensions.Host.InitializeService();

谢谢大家。

我在使用
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
必须位于测试程序集所在的文件夹中。

下面的代码有助于解决此问题

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

你能建立一个小的,但完整的程序+插件,并向我们展示代码,复制问题吗?或者,至少,你可以发布你要测试的插件的类文件吗?可能是你的插件是用不同的NUnit版本编译的吗?我想这不是你在问题中写的,但是。。。它会使属性类型不兼容。如果我使用Console.WriteLine(loc),它会打印Console exe的名称。我试图加载类dll,但得到“访问被拒绝”。然后,当我执行Console.WriteLine(result.ResultState)时,它会打印“不确定”。你是如何得到“没有textfixture”的信息的?另外,如何检查它是否正在加载测试dll。我可能在这里遗漏了一些明显的内容。您应该传递到remoteTestRunner。运行某种类型的事件侦听器以捕获测试用例运行的输出。我在网上看到的每个示例都使用NullListener(包括您的),它不会捕获输出。您知道如何设置事件侦听器来捕获输出吗?“TestResult”的输出还不够吗?你错过了什么?从NUnit 2.6.3开始对我有效。要诊断运行测试中的一些问题,也可以使用编写结果:
newXMLResultWriter(@“C:\Temp\TestResult.xml”).SaveTestResult(result)
在我自己的程序集中运行测试时,我会收到一个错误,说nunit.core丢失。我已经从nuget添加了
NUnit
NUnit测试适配器
包,即使NUnit.core出现在引用列表中,代码也找不到它。。
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 );
    }
}