2010-05-09 72 views
14

我想使用NUnit在我的插件中運行單元測試,但它需要在我的應用程序的上下文中運行。爲了解決這個問題,我試圖開發一個運行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的數據結構,只有1測試和我有同樣的錯誤。

爲了完整起見,我使用了最新版本的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

你可以建立一個小的,但是完整的程序+插件,並告訴我們的代碼,即複製的問題?或者,至少,你可以發佈你想要測試的插件的類文件嗎? – 2010-05-09 18:15:25

+0

難道你的插件是用不同的NUnit版本編譯的?我認爲這不是來自您在問題中所寫的內容,而是......它會使屬性類型不兼容。 – 2010-05-09 18:19:44

+0

如果我使用Console.WriteLine(loc),它將打印控制檯exe的名稱。我試圖加載類的DLL,我得到了「訪問被拒絕」。然後當我做Console.WriteLine(result.ResultState)它打印「不確定」。你如何得到「沒有textfixture」的消息?另外你如何檢查它是否事實上加載你的測試DLL。我可能會忽略這裏顯而易見的東西。 – 2010-05-09 20:24:45

回答

9

我已經發布了我的問題在NUnit的論壇和查理告訴我如何找到問題小費。我認爲在這裏發佈它可能是個好主意,這樣其他人就可以避免花費大量時間。解決方法是首先用以下行初始化核心服務:

CoreExtensions.Host.InitializeService(); 

謝謝大家。

1

我在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必須與你的測試程序集的文件夾中。

+0

你應該通過remoteTestRunner.Run某種事件監聽器來捕獲測試用例運行的輸出。我在網上看到的每個例子都使用NullListener(包括你的),它不會捕獲輸出。你有什麼想法如何設置一個事件監聽器來捕獲輸出? – Justin 2011-08-22 19:12:36

+0

「TestResult」的輸出不夠嗎?你錯過了什麼? – 2011-08-22 20:44:42

13

下面的代碼的幫助來解決問題

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); 
    } 
} 
+0

適用於NUnit 2.6.3以來的版本。爲了診斷運行測試中的一些問題,編寫結果也是有用的:'new XmlResultWriter(@「C:\ Temp \ TestResult.xml」)。SaveTestResult(result)' – ceztko 2014-04-12 11:19:26

+0

當試圖在我自己的程序集中運行測試時,一個錯誤說nunit.core丟失。我已經從nuget添加了'NUnit'和'NUnit Test Adapter'軟件包,即使nunit.core出現在引用列表中,代碼也找不到它。 – Ziv 2015-07-05 08:22:47