2011-09-28 52 views
3

我想知道是否有人知道正確的方式來單元測試一個寧靜的web服務。我有一套使用隱藏的Web服務,我想爲它們編寫測試代碼。不幸的是,由於我的web服務與數據庫綁定,我的測試最終會填充數據庫,這似乎是一個問題。單元測試寧靜的webservices

我主要是問從單元測試的角度來處理這個問題的正確方法。我是否清除了測試後插入的值的數據庫?我是否有專門的測試數據庫和一整套特殊的測試路線?對於解決這個問題的最佳方式,我感到有點不知所措。

很顯然,在其他類似的數據庫包裝類的情況下,您只需傳入您在測試開始時設置的虛擬數據庫。這看起來似乎更具挑戰性,儘管當涉及到像休息一樣的休息框架時。

我很感激你們所有人都可能用正確的方式來處理將信息保存到數據庫的測試。

在此先感謝。

回答

2

一般來說,你有兩個選擇:

1)使用專用的測試數據庫上,你可以設置你的期望已知的數據 - 在開始測試前「原始DB」替換DB。這將被視爲集成測試,因爲您實際上依賴於數據庫。

2.)使您的代碼獨立於實際的數據存儲並將依賴關係傳遞給持久層。對於單元測試,您可以編寫(或模擬出)自定義持久層/對象,以便您可以觀察正在進行單元測試的狀態更改。

兩者的健康組合通常會提供良好的覆蓋範圍。

也可以不考慮測試您的Restful Web服務,而是考慮將其委託給每個服務端點中的POCO,然後直接測試這些POCO - 更容易測試,並且您只需驗證服務端點和POCO之間的映射。

+0

我想我的問題歸結爲像休會一樣的框架,有沒有一種很好的方式來「傳遞依賴到持久層」?它似乎很難只是指出路由指向哪個數據庫? – akhalsa

3

通常在測試Web服務時,您是從外部測試整個堆棧。這意味着您需要資源並檢查結果是否符合您的期望。

在幾乎所有情況下,在每次請求之前填充數據庫都是一種好方法。這可能看起來像是過度殺毒,但實際上,通過Web服務,您無法通過嘲弄/扼殺各種元素來保證適當的測試覆蓋率。

來自Ruby世界,Cucumber是理想的方法,因爲它可以讓您從高層次進行測試。當你將這個與Rspec結合做實際的單元測試(直接查詢你的對象的較低級別的測試)時,你可以得到兩全其美的好處。這些庫甚至帶有一些名爲「數據庫清理」的內容,它將爲您管理數據庫的填充和清理。

您可能會發現Rspec作者的以下博客文章非常有幫助,因爲它可以很好地解釋爲什麼您應該避免太多的嘲弄和殘篇。 http://blog.davidchelimsky.net/2011/09/22/avoid-stubbing-methods-invoked-by-a-framework/

0

我的理解是,如果你按照這個順序做你的測試,你可以測試所有的動詞,但是在最後的數據庫中不會有額外的數據。

POST (add a new record) 
GET (fetch the newly added record) 
PUT/PATCH (modify the newly added record) 
DELETE (delete the newly added record) 

當然,其他人同時使用數據庫可能會在測試期間看到瞬態值。