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);
}
}
}
知道发生了什么,或者我该如何修复它使其工作吗?
重复我在单元讨论列表中的回答,该问题几乎与此处同时发布。在很多圈子里,这样的帖子被认为是粗鲁的。它迫使我们这些回答问题的人做双倍的工作,以便看到问题的人也能找到答案。
"作为第一个问题…你是想创造一个跑步者还是你自己只是想要一个自动执行的测试?您的示例是自动执行的测试,但也许您只是为了示例而这样做。如果你想要的是一个自动执行的测试,那么我们有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);
}
}
}