【问题标题】:How to run NUnit from my code如何从我的代码运行 NUnit
【发布时间】:2010-05-09 17:52:51
【问题描述】:

我想使用 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 );

我看到只有 1 个测试的 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 版本编译的?我推测这不是您在问题中写的内容,但仍然......它会使属性类型不兼容。
  • 如果我执行 Console.WriteLine(loc),它会打印控制台 exe 的名称。我试图加载类 dll,但我得到“访问被拒绝”。然后,当我执行 Console.WriteLine(result.ResultState) 时,它会打印“不确定”。你如何得到“没有文本夹具”的消息?另外,您如何检查它是否正在加载您的测试 dll。我可能在这里遗漏了一些明显的东西。

标签: c# nunit


【解决方案1】:

以下代码有助于解决问题

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 2.6.3 开始为我工作。要诊断运行测试中的一些问题,编写结果也很有用:new XmlResultWriter(@"C:\Temp\TestResult.xml").SaveTestResult(result)
  • 尝试在我自己的程序集中运行测试时,我收到一条错误消息,提示缺少 nunit.core。我已经从 nuget 添加了 NUnitNUnit Test Adapter 包,即使 nunit.core 出现在引用列表中,代码也找不到它..
【解决方案2】:

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

CoreExtensions.Host.InitializeService();

谢谢大家。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 您应该传递给 remoteTestRunner.Run 某种事件侦听器以捕获测试用例运行的输出。我在网上看到的每个示例都使用 NullListener(包括你的),它不会捕获输出。您知道如何设置事件侦听器来捕获输出吗?
    • “TestResult”的输出还不够吗?你错过了什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多