2009-01-30 48 views
15

我一直在創建像瘋了一樣的單元測試,並發現我經常不得不在一次測試中設置一些東西,我只是在之前的測試中破壞了它。在一個測試(例如插入測試)中創建某些內容(例如數據庫記錄)是否合理,然後將其用於以後的測試(例如刪除測試)?或者每個測試都應該完全獨立完成?它是不好的形式來指望你的NUnit單元測試的順序

你甚至可以確定在NUnit中的測試順序還是他們總是按字母順序?

注意:我具體詢問一個測試文件中的測試順序。 不是跨測試文件或以任何方式更全局。

更新:感謝大家,回答 - 有一個很多很好的答案和集團意識的是相當一致的。我選擇了約翰諾蘭的答案,因爲他提供了最完整的解釋和很多鏈接。正如你可能已經猜到的那樣,儘管我認爲它可能會像John所說的那樣「有點臭」,但我一直非常想要打破這一規則。還要感謝Fortyrunner爲單元測試添加標籤。

+1

做好回報工作並解釋您的最新思想。非常好。 – 2009-01-31 13:24:54

+0

謝謝,喬恩。我認爲這是一個社區,如果社區要發展壯大,社區需要一定程度的關注。 – 2009-01-31 21:00:31

回答

10

依靠您的測試順序表明您在測試中保持狀態。這是smelly

一種更簡潔的測試方式是您只需要依靠您想要檢查其行爲的單一功能。通常情況下,您需要讓測試方法正常運行的其他對象爲mock

考慮接近單元測試的一個好方法是Arrange, Act, Assert模式。

以下是卡爾塞甘優秀的免費eBook的片段。我已經安排了Arrange,Act和Assert。

[TestFixture] public class CarTest 
{ 
    [Test] public void SaveCarCallsUpdateWhenAlreadyExistingCar() 
    { 
     //Arrange 
     MockRepository mocks = new MockRepository(); 
     IDataAccess dataAccess = mocks.CreateMock<IDataAccess>(); 
     ObjectFactory.InjectStub(typeof(IDataAccess), dataAccess); 
     //Act 
     Car car = new Car(); 
     Expect.Call(dataAccess.Save(car)).Return(389); 
     mocks.ReplayAll(); 
     car.Save(); 
     mocks.VerifyAll(); 
     // Assert 
     Assert.AreEqual(389, car.Id); 
     ObjectFactory.ResetDefaults(); 
    } 
} 
3

我真的不會依賴測試的順序。相反,我會將常用設置代碼放入單獨的方法中,並從簡單測試和更復雜的方法中調用該方法。或者,只需在刪除測試開始時調用插入測試。

6

我認爲每個測試都完全獨立於任何其他測試。即使你可以強制測試的順序,當測試必須改變時,這將是一場維護噩夢。

11

查看test fixture setups,允許您指定在夾具中的任何測試之前執行的功能。這允許您進行一次通用設置,無論您是運行一個測試還是套件中的所有測試,它都會一直運行。

2

不幸的是,單元測試的運行順序是不可預測的,或者至少以後可能會改變。例如。單元測試框架將被改變,因此每個測試將在單獨的線程中執行。 所以從我的角度來看使用測試命令是不合理的。 另一方面,您可以創建一組小的獨立測試來測試代碼的小部分,然後創建一個或多個大型測試,以特定順序運行您的小測試。

8

單元測試旨在單獨使用,不能作爲順序腳本運行。如果您確實需要按順序運行,請將它們收集到單個測試功能中。

如果您的單元測試受到expensive set-up的影響,您可能正在進行集成測試,當您認爲自己正在進行單元測試時。如果您在大多數單元測試中打擊SQL數據庫,則實際上是使用數據訪問層進行集成測試。

3

我強烈建議讓所有的單元測試獨立。

您的業務邏輯/數據庫結構等可能會隨着時間而改變,因此您最終必須替換或重寫(甚至放棄)現有的單元測試 - 並且如果您還有其他幾個測試取決於您的測試因爲你必須通過所有其他測試,並檢查它們是否仍然按預期工作,這可能會導致不必要的麻煩。

另外,一個失敗的單元測試不應該拖拽很多其他的測試(這可能完全適用於自己)。

2

如果你有狀態的測試(與數據庫的工作一個共同的問題 - 這是我做什麼,當我不在SO),那麼在我看來,避免在測試文件中的順序並非絕對必要。但是,您必須認識到,如果您有2次測試,而測試2取決於測試1次通過,那麼如果測試1失敗,則會發生'災難性'雙重失敗,因爲測試2沒有預期的設置(並且,更重要的是,如果測試2通過測試1後失敗,如果您認爲測試2取決於測試1通過,則您需要擔心。

這就是爲什麼您希望儘可能獨立進行測試的原因 - 文件內和文件間。

依賴不同文件中(組)測試之間的順序是非常不明智的。

相關問題