《Unit Testing》2.1 经典学派如何做测试隔离
經(jīng)典學(xué)派如何解決隔離問(wèn)題
首先,再回顧一下單元測(cè)試的三個(gè)重要特性:
驗(yàn)證一小段代碼(或者叫一個(gè)單元)
執(zhí)行速度快
使用隔離的方式進(jìn)行
?
針對(duì)第一個(gè)特性就會(huì)引出一個(gè)問(wèn)題:多小的一段代碼才足夠小?
如果你采用針對(duì)每個(gè)類(lèi)進(jìn)行隔離的話,那么這一小段代碼肯定就是這個(gè)類(lèi)了,或者類(lèi)里面的一個(gè)方法。沒(méi)法比這個(gè)范圍更大了。
有些情況下,你可能需要同時(shí)測(cè)試好幾個(gè)類(lèi)。但大部分時(shí)候,你都應(yīng)該盡量保證每次只測(cè)試一個(gè)類(lèi)。
?
但是在經(jīng)典學(xué)派的做法里,并不是被測(cè)試的代碼需要隔離,而是單元測(cè)試之間需要互相隔離。這樣的話,你可以并行、按順序或按任意順序進(jìn)行單元測(cè)試。而且它們的結(jié)果不會(huì)受到影響。
?
讓測(cè)試之間互相隔離意味著可以同時(shí)運(yùn)行多個(gè)類(lèi),前提是它們都在內(nèi)存里并且不會(huì)接觸到共享的狀態(tài)。
共享狀態(tài)就是指測(cè)試之間可以通信,并且會(huì)影響相互的執(zhí)行上下文。
典型的共享狀態(tài)例子就是進(jìn)程外依賴(lài):數(shù)據(jù)庫(kù)、文件系統(tǒng)等等。
?
共享、私有、進(jìn)程外依賴(lài)
共享依賴(lài)是指:這種依賴(lài)在測(cè)試間被共享,并且能夠提供影響相互結(jié)果的手段。
典型的例子就是靜態(tài)可變字段
另一個(gè)例子就是數(shù)據(jù)庫(kù)
?
私有依賴(lài)就是指不共享的依賴(lài)。
?
進(jìn)程外依賴(lài),這種依賴(lài)運(yùn)行于程序執(zhí)行進(jìn)程以外。它是到暫時(shí)還未進(jìn)入內(nèi)存的數(shù)據(jù)的代理。
在大多數(shù)情況下,進(jìn)程外依賴(lài)就是共享依賴(lài),但也不全是。例如:
數(shù)據(jù)庫(kù)既是共享依賴(lài),又是進(jìn)程外依賴(lài)。
但如果每次運(yùn)行測(cè)試都啟動(dòng)一個(gè)內(nèi)涵數(shù)據(jù)庫(kù)的 docker 容器,那這是進(jìn)程外依賴(lài),而不是共享依賴(lài)。因?yàn)闇y(cè)試運(yùn)行的不是同一個(gè)進(jìn)程實(shí)例。
同理,只讀數(shù)據(jù)庫(kù)也是進(jìn)程外依賴(lài),但不是共享依賴(lài)。因?yàn)槠鋽?shù)據(jù)不可變,所有測(cè)試間的結(jié)果不會(huì)互相影響。
?
針對(duì)隔離問(wèn)題,經(jīng)典學(xué)派對(duì)于 mock 和測(cè)試替身的使用,擁有更加溫和的觀點(diǎn):你仍然可以使用它們,但通常只對(duì)那些在測(cè)試之間引入共享狀態(tài)的依賴(lài)項(xiàng)這樣做:
?
強(qiáng)調(diào)一下:共享依賴(lài)是指在單元測(cè)試間共享的依賴(lài),而不是被測(cè)試類(lèi)(單元)的依賴(lài)。
?
共享依賴(lài)與不穩(wěn)定依賴(lài)
另一個(gè)意思相近,但不完全一樣的術(shù)語(yǔ)就是不穩(wěn)定依賴(lài)(volatile dependencies)。
不穩(wěn)定依賴(lài)具有以下屬性:
除了默認(rèn)安裝在開(kāi)發(fā)人員的機(jī)器上之外,它還引入了設(shè)置和配置運(yùn)行時(shí)環(huán)境的要求。數(shù)據(jù)庫(kù)和API服務(wù)就是很好的例子。它們需要額外的設(shè)置,默認(rèn)情況下不會(huì)安裝在組織中的計(jì)算機(jī)上。
它包含不確定性行為。例如,隨機(jī)數(shù)生成器或返回當(dāng)前日期和時(shí)間的類(lèi)。這些依賴(lài)關(guān)系是不確定的,因?yàn)樗鼈冊(cè)诿看握{(diào)用上提供不同的結(jié)果。
?
不穩(wěn)定依賴(lài)與共享依賴(lài)在概念上多少還是有一些重疊的。例如:
數(shù)據(jù)庫(kù)既是共享依賴(lài),又是不穩(wěn)定依賴(lài)。
而文件系統(tǒng)則不是,因?yàn)槊總€(gè)開(kāi)發(fā)者電腦上都有文件系統(tǒng)。
隨機(jī)數(shù)生成器是不穩(wěn)定依賴(lài),但它確不是共享的,因?yàn)槊看螠y(cè)試都會(huì)運(yùn)行它的一個(gè)實(shí)例。
?
替換掉共享依賴(lài)的另一個(gè)原因就是提升測(cè)試的速度。
因?yàn)楣蚕硪蕾?lài)大多數(shù)都在程序執(zhí)行進(jìn)程之外,所以例如訪問(wèn)數(shù)據(jù)庫(kù)就要比訪問(wèn)私有依賴(lài)慢得多。
?
經(jīng)典學(xué)派對(duì)隔離的這種觀點(diǎn)也導(dǎo)致了對(duì)單元(一小段代碼)的不同理解。一個(gè)單元不一定要局限于一個(gè)類(lèi)。你也可以對(duì)一組類(lèi)進(jìn)行單元測(cè)試,只要它們都不是共享依賴(lài)項(xiàng)。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的《Unit Testing》2.1 经典学派如何做测试隔离的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux中作业控制命令
- 下一篇: Hacker News热文:请停止学习框