2009-10-12 149 views
109

我使用Visual Studio(有時是resharper)來運行我的單元測試。單元測試,NUnit還是Visual Studio?

我聽說NUnit的,但我不知道這件事情很多事情......

我應該關心它?它可以提供比視覺工作室更好的東西嗎?

我應該使用NUnit嗎?爲什麼?

+12

也考慮的xUnit一個例子,但是不管你做什麼有一個看起來TestDriven.net – 2009-10-12 12:25:00

+0

@Ian +1 TDD。 – magnus 2010-01-11 21:43:01

+0

另請參閱http://stackoverflow.com/questions/707444/nunit-vs-team-system-unit-test – 2010-02-17 09:44:22

回答

90

NUnit的具有超過MS試驗

  1. 套件屬性幾個優點 - 可以聚集試驗和分別執行它們(用於與例如快速和慢速測試大項目)
  2. 可讀Assert方法,例如Assert.AreEqual(expected, actual) vs Assert.That(actual, Is.EqualTo(expected))
  3. NUnit有頻繁的版本更新 - MS-Test每個VS版本只有一個版本。
  4. 許多集成選手包括ReSharper的和TestDriven.NET
  5. 預期異常消息斷言 - 可以通過屬性來完成在NUnit的,但必須在MS-測試
  6. [TestCase]使用的try-catch來完成! NUnit允許參數化測試。
+29

異常也可以通過MS-Test中的屬性斷言:ExpectedExceptionAttribute。 – 2009-10-12 12:11:28

+7

我將使用NUnit與Assert.Throws <>(),因爲這遵循AAA原則,這是不通過屬性的方式。 – 2009-10-12 12:26:53

+0

@Stefan Steinegger,MSTest預計的異常屬性,但它無法驗證消息文本 – Elisha 2009-10-16 14:27:18

1

NUnit是一個單元測試框架,它也支持resharper。我認爲你正在使用微軟的單元測試框架,所以NUnit的僅僅是微軟的產品替代;)

這裏是鏈接到的NUnit的主頁:http://nunit.org/index.php

+0

所以你的意思是說,nunit不會帶來任何比微軟單元測試框架更多的東西嗎? – Tim 2009-10-12 11:30:18

+0

它的確如此,請參閱我的鏈接,例如我的帖子(上圖)。 – bastijn 2009-10-12 11:34:36

+0

我使用的是NUnit,並不真正瞭解微軟的單元測試框架,所以我不能說什麼更好。我認爲你很有可能會在SO上找到一些有關這些差異的話題。 – 2009-10-12 11:35:22

18

NUnit的可以用來結合視覺工作室。這是一個框架,不是一個單獨的程序。所以你可以關心一下,看看它是否適合你:)。

alt text http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=nunitit&DownloadId=61802

「安裝插件後,你會發現在工具菜單下一個新的子菜單。」

有關導入它的更多信息,請參閱http://nunitit.codeplex.com/

另外,使用SO的搜索可以找到很多。例如,This topic列出了NUnit優於MS標準測試的優點。

1

我不知道別人,但NUnit的提供了很好的圖形界面和控制檯運行單元測試,你也可以生成NUnit測試的執行結果的報告,該報告將給出whethere測試失敗或通過細節以及您的單元測試需要幾點時間

3

NUnit與標準版的VS一起使用。

+1

不要忘記視覺工作室快遞版本。 – chobo2 2009-10-14 22:41:39

+0

單元測試程序集項目的後構建步驟 - \ path \ to \ nUnit $(TargetFileName) – 2009-10-15 06:27:30

63

從我目前的角度來看(8個月的開發與大約10名開發人員平均後)我會使用MSTest的建議,原因如下

  • 本身的框架是相當 緩慢。我的意思不是你寫的測試代碼 - 這是在你的控制之下。 我的意思是運行那些 測試框架是緩慢的,無論是運行 測試套件,單測試等
  • 需要保持一個測試元數據文件 總是導致併發症 當幾個開發人員在工作 它(重新創建例如元數據 等)。每個其他測試套件不需要 需要一個元數據文件。這是一種 很好組織你的測試,但你 可以通過 名稱空間,類和方法名稱實現相同。
  • 做持續集成,如果你想在你的生成機器上運行單元測試,你將需要在該機器上安裝Visual Studio。

換句話說,如果我必須在8個月前再次決定,我可能會採用NUnit。我可能沒有集成測試結果報告,但開發人員將擁有更加無縫的測試經驗。

+0

+1,這裏的體驗相同。 – 2009-10-12 12:13:09

+6

+1,避免MSTest,除非你沒有選擇。各種開源框架更好(xUnit,NUnit,MbUnit等)。 – Brannon 2009-12-17 09:54:55

46

這裏是我的經驗與MS測試

  • 我們正在運行MS測試與周圍3800測試。
  • 只需開始執行測試需要很長時間,這在運行單個測試時很痛苦。
  • 大約需要1GB內存來執行測試。不,這不是由於我們測試中的內存泄漏。我們經常遇到OutOfMemoryExceptions。
  • 因爲它使用了那麼多資源,所以我們開始從批處理文件執行測試。那麼整合整合有什麼好處呢?
  • 它是越野車和不穩定:
    • 舉例來說,如果你刪除[忽略]從測試屬性,它不承認它,因爲它的地方緩存有關測試的信息。您需要刷新測試列表,有時可以解決問題,或重新啓動VS.
    • 它隨機不會將引用程序集複製到out目錄。
    • 部署項目(要使用的附加文件)無法正常工作。他們被隨意忽略。
  • vsmdi和testrunco​​nfig文件中隱藏着(在測試代碼中不可見)信息。如果你不關心它,它可能無法正常工作。
  • 在功能上它可能與NUnit相當,但如果您考慮使用VS測試版,則它非常昂貴。

增加:我們現在有一些更多的測試,甚至不能說有多少。由於OutOfMemoryExceptions和其他不穩定性問題,無法從Visual Studio中運行它們。我們從腳本運行測試。在Visual Studio中查看測試結果很容易,但是當解決方案打開時,VS會崩潰(每次)。所以我們需要使用文本搜索來搜索失敗的測試。再也沒有集成工具的優勢了。


另一個更新:我們使用VS 2013現在。很多事情都改變了。自從我們開始以來,他們第三次重寫了MS Test測試跑步者。這導致了很多突變,但新版本都沒有做得更好。我們很高興我們沒有使用MS Test的奇特功能,因爲它們都不再受支持。這真是一個恥辱。我們仍然使用腳本來構建和運行所有的單元測試,因爲它更方便。 Visual Studio需要幾分鐘才能開始運行測試(編譯後的時間測量,直到第一次測試開始)。他們可能會通過更新修復它,這可能是我們項目的一個特定問題。但是,運行相同的測試時,Resharper要快得多。

結論:至少與Resharper結合使用時,MS Test很有用。我希望他們能夠最終發現測試運行者應該如何編寫,並且下次更新Visual Studio時不會做這種突破性更改。

+0

我最近開始在沒有調試的情況下運行它們,使它更快*更像NUnit的使用方式,但它仍然很糟糕。看起來糟糕的性能與Visual Studio在調試時做了些時髦的事情有關。 (也就是說,使用「ctrl + F5」而不是「F5」 - 你仍然可以很好的與VS) – Arafangion 2010-12-13 08:06:35

+0

3,800「整合」!幸運的是,想象一下29,948,NUNIT在這一點上變得非常痛苦.. – 2014-05-04 05:47:46

+0

好的回答,節省了我的時間 – FindOutIslamNow 2017-09-30 03:08:15

5

最大的優勢MS-Test通過NUnit是MS-Test可以使用反射生成模擬對象。 我發現它非常有用

+10

http://code.google.com/p/moq/,http://www.nmock.org/,http ://stackoverflow.com/questions/37359/what-c​​-mocking-framework-to-use – 2010-02-17 09:41:03

-11

如果您使用Visual Studio您必須使用NUnit進行單元測試,並且如果您正在運行java(Netbeans),則必須使用JUnit進行單元測試。

下面是一個簡單的計算器單元測試

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using SimpleCalculator; 
using NUnit.Framework; 

namespace CalculatorTest 
{ 
    [TestFixture] 
    public class Class1 
    { 
     public Calculator _calculator; 
     [TestFixtureSetUp] 
     public void Initialize() 
     { 
      _calculator = new Calculator(); 
     } 
     [Test] 
     public void DivideTest() 
     { 
      int a = 10; 
      int b = 2; 
      int expectedValue = a/b; 
      int actualvalue = _calculator.Divide(a, b); 
      Assert.AreEqual(expectedValue, actualvalue,"Failure"); 

     } 
    } 
} 
+2

當然你不*必須使用NUnit,它只是一個框架,沒有人強迫你使用它。如果你覺得無聊,你甚至可以自己寫。 – HimBromBeere 2016-05-20 10:24:38