簡體   English   中英

C#和NUnit中的單元測試數據庫庫

[英]Unittesting database library in C# and NUnit

我最近開始使用NUnit,現在開始使用Rhino Mocks。 我現在准備開始在C#項目中使用它。

該項目涉及一個我必須編寫的數據庫庫。

我已經閱讀過測試應該是獨立的,不能相互依賴,也不能依賴於測試執行的順序。

因此,假設我想檢查FTP或數據庫連接。 我會寫一些像

[Test]
public void OpenDatabaseConnection_ValidConnection_ReturnsTrue()
{
  SomeDataBase db = new SomeDataBaseLibrary(...);
  bool connectionOk = db.Open();
  Assert.IsTrue(connectionOk);
}

另一個測試可能涉及測試某些數據庫功能,例如插入行。

[Test]
public void InsertData_ValidData_NoExceptions()
{
      SomeDataBase db = new SomeDataBaseLibrary(...);
      db.Open();

      db.InsertSomeRow("valid data", ...);
}

我看到了幾個問題:

1)問題是,為了獨立於第一個測試,最后一個測試將不得不再次打開數據庫連接。 (這還需要在打開連接之前先進行測試以再次關閉該連接。)

2)另一件事是,如果SomeDataBaseLibrary更改,那么所有測試方法也將不得不更改。

3)每次測試運行都必須建立所有這些連接時,測試速度將下降。

通常的處理方式是什么?

我意識到我可以使用DataBaseLibrary的模擬,但這不會測試庫本身,這是我在項目中的第一個目標。

1:您可以在所有測試之前打開1個連接,並將其保持打開狀態,直到使用該連接的所有測試結束。 方法具有某些屬性,與[Test]屬性非常相似,它們指定何時應調用該方法:

http://www.nunit.org/index.php?p=attributes&r=2.2.10

看一眼:

TestFixtureSetUpAttribute(NUnit 2.1)此屬性在TestFixture內部使用,以提供一組功能,這些功能在執行固定裝置中的任何測試之前執行一次。 一個TestFixture只能有一個TestFixtureSetUp方法。 如果定義了多個,則TestFixture將成功編譯,但其測試將無法運行。

因此,在使用此屬性定義的方法中,您可以打開數據庫連接並使數據庫對象對於測試環境是全局的。 然后,每個測試都可以使用該數據庫連接。 請注意,即使測試使用相同的連接,它們仍然是獨立的。

我相信這也可以解決您的第三個問題。

我不太確定如何回答您的第二個問題,因為我不知道SomeDataBaseLibrary類中發生的更改的程度。

只是挑剔,這些測試是集成測試,而不是單元測試。 但是,我現在可以說這無關緊要。

  1. 正如@sbenderli指出的那樣,您可以使用TestFixtureSetUp啟動連接,並編寫一個幾乎為空的測試,僅聲明數據庫連接的條件。 我認為您只需要放棄理想的1個bug-> 1個測試失敗,因為多個測試需要連接到測試數據庫。 如果使用數據訪問層有任何副作用(例如緩存),請在此處特別注意交互測試 (<-鏈接可能已損壞)。
  2. 很好 應該通過測試來演示如何使用SUT(在這種情況下為被測軟件-SomeDataBaseLibrary)。 如果要更改SUT要求更改其使用方式,您想知道。 理想情況下,如果您對SomeDataBaseLibrary進行更改,這將破壞客戶端代碼,那么它將破壞您的自動化測試。 無論您是否具有自動化測試,都必須根據SUT進行任何更改。 自動化測試是要更改的另一件事,但是它們也讓您知道必須進行上述更改。
  3. 使用TestFixtureSetUp進行維護。

您可能已經注意的另一件事:InsertData_ValidData_NoExceptions自身無法清除,導致交互測試。 我發現最簡單的方法是使用TransactionScope :在您的SetUp類中創建一個並將其放在TearDown中進行處理。 根據我的經驗,它就像一個魅力(具有兼容的數據庫)。

編輯:一旦在TestFixtureSetup中具有連接邏輯,您仍然可以像這樣測試連接:

[Test]    
public void Test_Connection() 
{
  Assert.IsTrue(connectionOk);
}

缺點之一是測試的“練習”步驟是隱式的,它是設置邏輯的一部分。 恕我直言,沒關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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