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