正文

作者水平有限,如有錯(cuò)誤或紕漏,請(qǐng)指出,謝謝。

回到頂部

背景介紹

最近在團(tuán)隊(duì)在做release之前的regression,把各個(gè)feature分支merge回master之后發(fā)現(xiàn)DB的單元測(cè)試出現(xiàn)了20多個(gè)失敗的test cases。之前沒怎么做過DB的單元測(cè)試,正好借這個(gè)機(jī)會(huì)熟悉一下寫DB單元測(cè)試的流程。

這篇博文中首先介紹一下在我們的特定項(xiàng)目場景中是如何搭建DB 單元測(cè)試框架的,然后舉一個(gè)簡單的例子,從頭到尾在visual studio中創(chuàng)建一個(gè)簡單的單元測(cè)試工程。

我們開發(fā)的產(chǎn)品使用的數(shù)據(jù)庫為Sql Server,總共有400多張表,2000多個(gè)存儲(chǔ)過程,每個(gè)存儲(chǔ)過程都相當(dāng)于應(yīng)用代碼中的一個(gè)功能函數(shù)。代碼中的每個(gè)復(fù)雜的功能函數(shù)都可以通過寫單元測(cè)試來在一定程度上保證代碼質(zhì)量,存儲(chǔ)過程也如此。代碼中的UT難點(diǎn)在于解耦,也就把相互牽連在一起的代碼彼此分離開來,各個(gè)擊破,例如A函數(shù)需要B函數(shù)提供的數(shù)據(jù),測(cè)試A函數(shù)的時(shí)候我們只想測(cè)試A函數(shù),不想調(diào)用B,這時(shí)候就需要我們自己提供B函數(shù)生成的數(shù)據(jù)。這叫做mock。

在做DB單元測(cè)試的時(shí)候,存儲(chǔ)過程所使用的數(shù)據(jù)比較特殊,都是持久化在數(shù)據(jù)庫表中的,2000多個(gè)存儲(chǔ)過程增刪改查400多個(gè)表,我們需要把這些表的數(shù)據(jù)為每個(gè)存儲(chǔ)過程做隔離,如果測(cè)試用例使用的數(shù)據(jù)相互之間關(guān)聯(lián),恐怕會(huì)天下大亂,因?yàn)樵谝话闱闆r下,單元測(cè)試用例的運(yùn)行順序都是隨機(jī)的,如果單元測(cè)試使用的數(shù)據(jù)有關(guān)聯(lián),很有可能兩次運(yùn)行結(jié)果也是隨機(jī)的(但是有一種方法可以固定case執(zhí)行順序,我在最后的例子中進(jìn)行說明),我們這次的20多個(gè)失敗的cases就有這種原因?qū)е碌模瑑膳_(tái)機(jī)器上跑出的結(jié)果不一樣,有的成功,有的失敗。

注:有關(guān)單元測(cè)試的定義,見另外一篇帖子,單元測(cè)試有毒

那么問題就來了,如何才能做數(shù)據(jù)的隔離呢?說一下我們的方案。

回到頂部

準(zhǔn)備數(shù)據(jù)

延伸閱讀

學(xué)習(xí)是年輕人改變自己的最好方式-Java培訓(xùn),做最負(fù)責(zé)任的教育,學(xué)習(xí)改變命運(yùn),軟件學(xué)習(xí),再就業(yè),大學(xué)生如何就業(yè),幫大學(xué)生找到好工作,lphotoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)學(xué)習(xí)是年輕人改變自己的最好方式