正文

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

回到頂部

背景介紹

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

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

我們開(kāi)發(fā)的產(chǎn)品使用的數(shù)據(jù)庫(kù)為Sql Server,總共有400多張表,2000多個(gè)存儲(chǔ)過(guò)程,每個(gè)存儲(chǔ)過(guò)程都相當(dāng)于應(yīng)用代碼中的一個(gè)功能函數(shù)。代碼中的每個(gè)復(fù)雜的功能函數(shù)都可以通過(guò)寫(xiě)單元測(cè)試來(lái)在一定程度上保證代碼質(zhì)量,存儲(chǔ)過(guò)程也如此。代碼中的UT難點(diǎn)在于解耦,也就把相互牽連在一起的代碼彼此分離開(kāi)來(lái),各個(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ǔ)過(guò)程所使用的數(shù)據(jù)比較特殊,都是持久化在數(shù)據(jù)庫(kù)表中的,2000多個(gè)存儲(chǔ)過(guò)程增刪改查400多個(gè)表,我們需要把這些表的數(shù)據(jù)為每個(gè)存儲(chǔ)過(guò)程做隔離,如果測(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)行說(shuō)明),我們這次的20多個(gè)失敗的cases就有這種原因?qū)е碌模瑑膳_(tái)機(jī)器上跑出的結(jié)果不一樣,有的成功,有的失敗。

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

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

回到頂部

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

網(wǎng)友評(píng)論