[英]NUnit Engine in ASP.Net
下午好,
對於我當前的項目,我正在嘗試創建一個將在開發服務器中托管的NUnit Runner。 對於快速版本,我使用的是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應用程序的Binary文件夾中,所以我不知道為什么無法從那里找到“ 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);
}
}
}
對正在發生的事情有什么想法,或者我如何嘗試對其進行修復以使其起作用?
從nunit-discuss列表中重復我的答案,問題的發布時間與此處的大致相同。 @格倫·羅德里格斯(Glenn Rodriguez)這樣的多篇文章在許多圈子中被認為是不禮貌的。 這迫使回答問題的我們做雙重工作,以便看到問題的人也能夠找到答案。
“首先要問的是……您是要創建跑步者還是只想進行自我執行的測試?您的示例是自我執行的測試,但也許只是為了舉例而已。您想要的只是一個自執行的測試,那么我們就有NUnitLite可以精確執行您的示例所示。
“ OTOH,如果您要創建自己的運行程序,則應照常使用引擎。(所鏈接的SO問題中的第二種方法是錯誤的-它可以在簡單的情況下使用,但最終會遇到問題,因為那不是問題控制台運行器專為。)
“使用過濾器,您的代碼可以更簡單。在運行所有測試時,只需使用TestFilter.Empty。
“您的TestPackage使用的是WorkDirectory以外的所有默認設置。這意味着NUnit將嘗試通過創建一個單獨的進程並使用NUnit測試代理啟動它來運行您的測試。這可能不是您想要的。請使用“ ProcessModel”設置“單個”在當前進程中運行測試。如果您不希望NUnit為測試創建單獨的域,則可能還需要將“ DomainUsage”設置為“無”。
“祝好運!”
我會再添加一些評論...
您所鏈接的SO帖子中建議的第一種方法具有正確的想法,但由於它完全依賴於引擎的默認設置,因此並不完整。
建議使用第二種方法,直到嘗試在同一程序中多次運行為止。 控制台運行程序Main除Main之外,不得作為其他名稱。
當問一個關於您正在做的與眾不同的事情的問題時,如果您可以解釋您這樣做的原因,通常可以幫助人們為您提供幫助。
在Nunit-Dicussion組討論之后,解決此問題的方法確實很簡單。
查理在上面評論,問題出在代碼中使用的當前配置。 應該設置“ ProcessModel”和“ DomainUsage”,而不是使用“ WorkingDirectory”,以便可以在ASP.NET之類的Web環境中毫無問題地執行NUnit運行程序。
在下面,您可以找到將該線程標記為“ aswer”的代碼。
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);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.