簡體   English   中英

ASP.Net中的NUnit引擎

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM