ASP.Net中的NUnit引擎

本文关键字:引擎 NUnit 中的 Net ASP | 更新日期: 2023-09-27 18:03:57

下午好,

对于我目前的项目,我试图创建一个NUnit运行器,将托管在我们的开发服务器。对于一个快速版本,我使用ASP。. NET Webforms + NuGet最新版本的NUnit(目前为3.4.1,Engine + Core)。我正在遵循这篇文章中关于如何从代码中运行测试的建议。

当加载我的应用程序时,我得到以下异常:

无法加载文件或程序集'nunit.framework'或其依赖项之一。系统找不到指定的文件

描述:当前web请求执行过程中出现未处理的异常。请查看堆栈跟踪以获得有关错误及其在代码中的起源的更多信息。

异常详细信息:System.IO.FileNotFoundException:无法加载文件或程序集'nunit.framework'或其依赖项之一。系统找不到指定的文件

Source Error: 
Line 33:             {
Line 34:                 // execute the tests            
Line 35:                 XmlNode result = runner.Run(null, emptyFilter);
Line 36:                 lblTest.Text = result.InnerText;
Line 37:             }

我的NUnit库位于Web应用程序的二进制文件夹中,所以我不知道为什么无法从那里找到' NUnit .framework'。

这是我实际使用的运行程序代码:

using NUnit.Engine;
using NUnit.Framework;
using System;
using System.Reflection;
using System.Xml;
namespace NunitWebRunner
{
    public partial class _default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // set up the options
            string path = Assembly.GetExecutingAssembly().Location;
            TestPackage package = new TestPackage(path);
            package.AddSetting("WorkDirectory", Environment.CurrentDirectory);
            // prepare the engine
            ITestEngine engine = TestEngineActivator.CreateInstance();
            var _filterService = engine.Services.GetService<ITestFilterService>();
            ITestFilterBuilder builder = _filterService.GetTestFilterBuilder();
            TestFilter emptyFilter = builder.GetFilter();
            using (ITestRunner runner = engine.GetRunner(package))
            {
                // execute the tests            
                XmlNode result = runner.Run(null, emptyFilter);
                lblTest.Text = result.InnerText;
            }
        }
    }
    [TestFixture]
    public class TemplateTestClass
    {
        [Test]
        public void TestThatPasses()
        {
            Assert.IsTrue(true);
        }
        [Test]
        public void TestThatFails()
        {
            Assert.AreEqual(4, 5);
        }
        [Test]
        [Ignore("Ignored")]
        public void IgnoredeTest()
        {
            Assert.IsTrue(false);
        }
    }
}

知道发生了什么,或者我该如何修复它使其工作吗?

ASP.Net中的NUnit引擎

重复我在单元讨论列表中的回答,该问题几乎与此处同时发布。在很多圈子里,这样的帖子被认为是粗鲁的。它迫使我们这些回答问题的人做双倍的工作,以便看到问题的人也能找到答案。


"作为第一个问题…你是想创造一个跑步者还是你自己只是想要一个自动执行的测试?您的示例是自动执行的测试,但也许您只是为了示例而这样做。如果你想要的是一个自动执行的测试,那么我们有NUnitLite

"哦,如果你正在创建你自己的跑步者,你应该使用引擎正如你所做的。(第二种方法是你在SO问题中提到的是错误的-它将在简单的情况下工作,但会遇到问题最终,因为这不是主机运行器的设计。)

"使用过滤器可以使代码更简单。只需使用TestFilter。空运行所有测试时。

"你的TestPackage使用所有的默认设置,除了WorkDirectory。这意味着NUnit将尝试通过创建来运行测试创建一个单独的进程,并使用NUnit测试代理启动它。这可能不是你想要的。使用的"ProcessModel"设置"单个"在当前进程中运行测试。你可能还需要一个如果你不想让NUnit创建一个为测试分离域。两种方法都试试。

"祝你好运!"


我将添加一些进一步的注释…

在你链接的SO帖子中建议的第一种方法有正确的想法,但不完整,因为它完全依赖于引擎的默认设置。

建议的第二种方法似乎是有效的,直到您尝试在同一个程序中运行多次。控制台运行程序Main不打算以Main以外的任何形式调用。

当你问别人关于你正在做的一件不寻常的事情时,如果你能解释你为什么这么做,通常会对别人有帮助。

经过单元讨论组的讨论,这个问题的解决方案真的很简单。

Charlie在上面评论说,问题在于代码中使用的当前配置。应该设置"ProcessModel"answers"DomainUsage",而不是使用"WorkingDirectory",以便在ASP.NET等Web环境中执行NUnit运行器不会出现问题。

你可以在下面找到标记此线程为已回答的代码。

using NUnit.Engine;
using NUnit.Framework;
using System;
using System.Reflection;
using System.Xml;
namespace NunitWebRunner
{
    public partial class _default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // set up the options
            string path = Assembly.GetExecutingAssembly().Location;
            TestPackage package = new TestPackage(path);
            package.AddSetting("ProcessModel", "Single");
            package.AddSetting("DomainUsage", "None");
            // prepare the engine
            ITestEngine engine = TestEngineActivator.CreateInstance();
            var _filterService = engine.Services.GetService<ITestFilterService>();
            ITestFilterBuilder builder = _filterService.GetTestFilterBuilder();
            TestFilter emptyFilter = builder.GetFilter();
            using (ITestRunner runner = engine.GetRunner(package))
            {
                // execute the tests            
                XmlNode result = runner.Run(null, emptyFilter);
                lblTest.Text = result.InnerText;
            }
        }
    }
    [TestFixture]
    public class TemplateTestClass
    {
        [Test]
        public void TestThatPasses()
        {
            Assert.IsTrue(true);
        }
        [Test]
        public void TestThatFails()
        {
            Assert.AreEqual(4, 5);
        }
        [Test]
        [Ignore("Ignored")]
        public void IgnoredeTest()
        {
            Assert.IsTrue(false);
        }
    }
}