如何从我的代码中运行NUnit

16

我想使用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数据结构,我也遇到了同样的错误。

为了完整起见,我正在使用最新版本的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
你能否构建一个小而完整的程序+插件,并展示代码以复制问题?或者,至少能否发布您尝试测试的插件的类文件? - Lasse V. Karlsen
你的插件是否是使用不同版本的 NUnit 编译的?根据你在问题描述中所写,我认为并不是这个原因,但如果是的话,它会导致属性类型不兼容。 - Lasse V. Karlsen
如果我执行 Console.WriteLine(loc),它将输出控制台 exe 的名称。我尝试加载类 dll,但出现“拒绝访问”的错误。然后当我执行 Console.WriteLine(result.ResultState) 时,它会打印“Inconclusive”。你如何获得“没有 textfixture”这个消息?还有,你如何检查它确实正在加载你的测试 dll?我可能在某些方面遗漏了明显的东西。 - Kinjal Dixit
3个回答

14

以下代码有助于解决问题。

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)” - ceztko
当我尝试在自己的程序集中运行测试时,出现了一个错误,说缺少nunit.core。我已经从NuGet添加了“NUnit”和“NUnit Test Adapter”包,尽管nunit.core出现在引用列表中,但代码仍然找不到它。 - Ziv

10

我已经在NUnit论坛上发布了我的问题,Charlie给了我一个提示,告诉我如何找到问题所在。 我认为将其发布在这里可能是个好主意,这样其他人就可以避免花费大量时间来解决同样的问题。 解决方案是首先使用以下行初始化核心服务:

CoreExtensions.Host.InitializeService();

谢谢大家。


2

我也曾经遇到过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(包括你的),这样就无法捕获输出。你有任何想法如何设置事件监听器来捕获输出吗? - Justin
“TestResult”的输出不够吗?你缺少什么? - Martin Buberl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接