[英]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類中發生的更改的程度。
只是挑剔,這些測試是集成測試,而不是單元測試。 但是,我現在可以說這無關緊要。
您可能已經注意的另一件事:InsertData_ValidData_NoExceptions自身無法清除,導致交互測試。 我發現最簡單的方法是使用TransactionScope :在您的SetUp類中創建一個並將其放在TearDown中進行處理。 根據我的經驗,它就像一個魅力(具有兼容的數據庫)。
編輯:一旦在TestFixtureSetup中具有連接邏輯,您仍然可以像這樣測試連接:
[Test]
public void Test_Connection()
{
Assert.IsTrue(connectionOk);
}
缺點之一是測試的“練習”步驟是隱式的,它是設置邏輯的一部分。 恕我直言,沒關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.