1

我正在開發Web服務的驗收測試。測試是通過Specflow驅動的,並使用SQL Server CE作爲數據庫。該服務與其他應用程序和模塊共享數據庫,並使用通過其中一個應用程序創建的一些數據。自動驗收測試如何使用設置初始狀態?

但從我的產品的角度來看,有兩種類型的「數據」:

  1. 數據,我們只消耗
  2. 我們創建/數據修改

運行之前一個測試用例,你設置了數據庫的初始狀態。對於僅使用的數據,初始化數據的唯一方法是直接插入數據庫。但對於託管數據,我們可以直接在數據庫中設置狀態,也可以像用戶那樣執行,調用API。

例如,我想測試我的方法'updateItem'是否正確更新項目的價格爲'y'。爲了能夠執行這個方法,我需要用價格'x'設置我的數據庫。這樣做有兩種方式:

  1. 設置項的狀態直接在數據庫中
  2. 召喚「createItem」

的優劣對於第一種方法是,我只是執行方法我想測試,所以如果測試失敗,只有一個原因失敗。缺點是如果將來創建項目的狀態發生變化(添加一個新字段),我需要手動在初始狀態下進行更改。

另一方面,第二種方法的優點和缺點是相反的。測試可能會失敗,因爲'createItem'失敗,儘管一些測試框架會告訴你這是失敗的設置,而不是實際的測試。但是無論'createItem'中發生了什麼變化,這些變化都會自動包含在測試中,而且您不必手動更新初始狀態。

任何意見是非常感謝。

回答

1

公平地說,你已經非常注意你在問題中的直接問題,你只需要做出你的決定。

設置這些數據的方式有很多,比您提到的要多,雖然這個問題並不是SpecFlow Integration Testing with Database Patterns的重複,但您可以先快速瀏覽一下。

好吧,現在選擇,使用現有API還是不行?那麼,如果不是,那麼將會做什麼?我猜你會寫一些額外的SQL語句並直接調用它們。

這並不意味着您已經創建了另一個API?你已經有了將價格設置爲Y的外部API,以及將價格設置爲X的新內部/測試API。因此,您必須將需要編寫和維護的代碼加倍。更糟糕的是,測試的快速和骯髒的代碼實際上最終會在整個測試過程中到處複製和粘貼,所以當它斷裂時,您必須在許多地方修復它。

如果可以,請停止思考數據庫。認爲API。你提到你有一些靜態數據只需要進行測試,所以把API放在一起就可以做到這一點,如果它不公開,或者只被你的應用程序使用,那麼它就沒有關係。獲取該API。

接下來,替換API背後的內容。使用Mocks,使用內存中的表示,NoSQL數據庫,XML文件或任何你需要做的單個測試通過,因爲隨着時間的推移,你將浪費很多時間來保持數據庫的工作。隨着你的測試增加它的速度會變得非常快,並且公平地說,如果SQL CE是最好的解決方案,你作爲一個應用程序開發者,不關心。當系統架構師(即使那是你不同的帽子),然後來說,我們需要來這個技術,並轉移到別的東西,至少你沒有與它綁在一起。

0

Alski的回答很好,但我認爲還有其他的事情你應該考慮。在調用應用程序的API來創建項目時沒有問題,但應該警惕此方法的長期影響,因爲它可以使您的測試花費比他們需要的時間更長的時間。如果你所做的只是調用CreateItem,那麼它是可以的,但想象隨着你的應用程序複雜度的增長,如果你必須隨時關注用戶工作流程,那麼你可能最終不得不做大量的步驟來獲得數據處於你想要的狀態。如果你需要測試其缺貨的項目重新排序頁面上可見,那麼你可能需要做所有這些:

  • CREATEUSER
  • CreateProduct
  • SetProductStockLevel
  • CreateOrderForAllStock
  • ShipOrder

只是爲了確保您的產品存在和缺貨。這可能需要大量的時間(特別是如果您的測試是基於硒的話)。

如果您剛剛將正確的數據插入到表中,則會更快地運行。

對於你來說這是否是一個問題,我不能說,但在你作出決定之前要記住這一點。

幸運的是,specflow使得改變你的想法很容易。伸出有一個步驟,它是像

Given all the stock for <Product> has been sold 

,那麼你可以通過調用其他步驟來執行用戶的工作流程,或直接將數據推到數據庫實現它。

+0

我不得不同意山姆,但這就是爲什麼我會親自從未在測試中使用數據庫。正如我在http://stackoverflow.com/questions/17047130/specflow-integration-testing-with-database-patterns中所說的模擬它! :-) – AlSki

相關問題