正文
作者水平有限,如有錯誤或紕漏,請指出,謝謝。
背景介紹
最近在團隊在做release之前的regression,把各個feature分支merge回master之后發(fā)現DB的單元測試出現了20多個失敗的test cases。之前沒怎么做過DB的單元測試,正好借這個機會熟悉一下寫DB單元測試的流程。
這篇博文中首先介紹一下在我們的特定項目場景中是如何搭建DB 單元測試框架的,然后舉一個簡單的例子,從頭到尾在visual studio中創(chuàng)建一個簡單的單元測試工程。
我們開發(fā)的產品使用的數據庫為Sql Server,總共有400多張表,2000多個存儲過程,每個存儲過程都相當于應用代碼中的一個功能函數。代碼中的每個復雜的功能函數都可以通過寫單元測試來在一定程度上保證代碼質量,存儲過程也如此。代碼中的UT難點在于解耦,也就把相互牽連在一起的代碼彼此分離開來,各個擊破,例如A函數需要B函數提供的數據,測試A函數的時候我們只想測試A函數,不想調用B,這時候就需要我們自己提供B函數生成的數據。這叫做mock。
在做DB單元測試的時候,存儲過程所使用的數據比較特殊,都是持久化在數據庫表中的,2000多個存儲過程增刪改查400多個表,我們需要把這些表的數據為每個存儲過程做隔離,如果測試用例使用的數據相互之間關聯,恐怕會天下大亂,因為在一般情況下,單元測試用例的運行順序都是隨機的,如果單元測試使用的數據有關聯,很有可能兩次運行結果也是隨機的(但是有一種方法可以固定case執(zhí)行順序,我在最后的例子中進行說明),我們這次的20多個失敗的cases就有這種原因導致的,兩臺機器上跑出的結果不一樣,有的成功,有的失敗。
注:有關單元測試的定義,見另外一篇帖子,單元測試有毒
那么問題就來了,如何才能做數據的隔離呢?說一下我們的方案。
準備數據
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動安全 [無線安全]玩轉無線電——不安全的藍牙鎖 2017-07-26
- 消息隊列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標分割】 2017-07-26
- 詞向量-LRWE模型-更好地識別反義詞同義詞 2017-07-26
- 從棧不平衡問題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實現JSON轉Model - HandyJSON使用講解 2017-07-26
- 阿里移動安全 Android端惡意鎖屏勒索應用分析 2017-07-26
- 集合結合數據結構來看看(二) 2017-07-26