完善自動(dòng)化測(cè)試:在現(xiàn)代測(cè)試套件中平衡速度和可靠性
傳統(tǒng)上,自動(dòng)化測(cè)試分為單元測(cè)試、集成測(cè)試和端到端測(cè)試。這種分類(lèi)是基于測(cè)試的范圍,盡管不同類(lèi)型之間的區(qū)別并不總是很清楚。單元測(cè)試的范圍很窄,通常測(cè)試單個(gè)方法或類(lèi)。集成測(cè)試驗(yàn)證不同組件之間的交互。端到端測(cè)試通常在平臺(tái)或 Web 應(yīng)用程序上執(zhí)行完整的用戶(hù)流程,涉及多個(gè)不同的系統(tǒng)。
隨著代碼庫(kù)的增長(zhǎng),緩慢且不穩(wěn)定的測(cè)試開(kāi)始影響開(kāi)發(fā)人員的生產(chǎn)力。從另一個(gè)維度(速度和確定性)檢查測(cè)試套件是有啟發(fā)性的。
緩慢和非決定論的根源
通過(guò)直覺(jué)和經(jīng)驗(yàn),我們知道端到端測(cè)試和集成測(cè)試比單元測(cè)試更慢、更不穩(wěn)定,但為什么會(huì)這樣呢?讓我們考慮一下測(cè)試運(yùn)行的環(huán)境。
單線程或進(jìn)程
當(dāng)測(cè)試在單個(gè)進(jìn)程中運(yùn)行時(shí),被測(cè)試的代碼也在同一進(jìn)程中運(yùn)行。這阻止了在單獨(dú)的進(jìn)程中創(chuàng)建服務(wù)器或數(shù)據(jù)庫(kù)并在測(cè)試中連接到它們。依賴(lài)于服務(wù)器或數(shù)據(jù)庫(kù)的測(cè)試必須使用模擬或偽造。
這些測(cè)試不會(huì)進(jìn)行任何阻塞的進(jìn)程間 I/O 調(diào)用,從而消除了緩慢和不確定性的主要根源。
單機(jī)
一些測(cè)試跨多個(gè)進(jìn)程運(yùn)行,在測(cè)試代碼的不同進(jìn)程中啟動(dòng)數(shù)據(jù)庫(kù)和服務(wù)器,并對(duì)它們進(jìn)行阻塞調(diào)用。他們甚至可以在同一臺(tái)機(jī)器上進(jìn)行網(wǎng)絡(luò)調(diào)用。
測(cè)試代碼現(xiàn)在依賴(lài)于其他進(jìn)程才能可靠運(yùn)行,但情況可能并不總是如此?,F(xiàn)在,測(cè)試代碼在進(jìn)行 API 調(diào)用時(shí)會(huì)受到操作系統(tǒng)調(diào)度程序和其他因素的影響。盡管與單線程測(cè)試相比,這會(huì)帶來(lái)一些緩慢和不穩(wěn)定的情況,但限制在一臺(tái)機(jī)器上仍然會(huì)阻止測(cè)試對(duì)其他機(jī)器進(jìn)行遠(yuǎn)程調(diào)用,這是不確定性的最大來(lái)源。這讓我們……
多臺(tái)機(jī)器
這些測(cè)試的運(yùn)行實(shí)際上沒(méi)有任何限制。特別是隨著云環(huán)境成為 SaaS 應(yīng)用程序的常態(tài),測(cè)試套件可以啟動(dòng)多個(gè)云資源并跨多個(gè)虛擬機(jī)運(yùn)行完整的系統(tǒng)測(cè)試。由于測(cè)試現(xiàn)在有多個(gè)依賴(lài)項(xiàng),因此即使一個(gè)組件出現(xiàn)故障也會(huì)影響整個(gè)測(cè)試。
設(shè)計(jì)測(cè)試套件
一個(gè)好的測(cè)試套件有幾個(gè)好處:
1. 可維護(hù)性——經(jīng)過(guò)良好測(cè)試的代碼更易于維護(hù),允許開(kāi)發(fā)人員添加新功能、修復(fù)錯(cuò)誤和重構(gòu)代碼,而不必?fù)?dān)心無(wú)意中破壞不相關(guān)的代碼。
2. 文檔– 鑒于有關(guān)服務(wù)或功能的文檔很容易過(guò)時(shí),編寫(xiě)良好的測(cè)試通常是理解代碼行為的最佳方法。
3. 干凈的 API – 黑盒測(cè)試確保被測(cè)代碼公開(kāi)正確的 API 接口。
4. 覆蓋范圍——廣泛的測(cè)試覆蓋范圍使工程和非工程利益相關(guān)者(包括銷(xiāo)售和市場(chǎng)推廣團(tuán)隊(duì))對(duì)發(fā)布過(guò)程充滿(mǎn)信心。
為了使測(cè)試套件有效且可靠,同時(shí)提高開(kāi)發(fā)人員的工作效率,它必須最大限度地減少緩慢和不確定性。單元測(cè)試、集成測(cè)試和端到端測(cè)試之間的界限也可能是模糊的。因此,在為系統(tǒng)設(shè)計(jì)測(cè)試套件時(shí),根據(jù)測(cè)試使用的資源來(lái)考慮測(cè)試會(huì)很有幫助。
Mike Cohn 的測(cè)試金字塔為思考如何構(gòu)建不同類(lèi)別的測(cè)試提供了一個(gè)很好的起點(diǎn)。這里我們也用它來(lái)類(lèi)比基于范圍的測(cè)試和基于環(huán)境的測(cè)試。
結(jié)論
· 大多數(shù)測(cè)試應(yīng)該是快速且可靠的單線程測(cè)試,針對(duì)狹窄的代碼部分。
· 您的一些測(cè)試應(yīng)該是單機(jī)測(cè)試,引入不同的本地依賴(lài)項(xiàng)并測(cè)試不同組件如何相互交互。
· 很少有測(cè)試應(yīng)該跨遠(yuǎn)程計(jì)算機(jī)運(yùn)行,從而練習(xí)應(yīng)用程序的端到端流程。
這種結(jié)構(gòu)傾向于在廣泛的覆蓋范圍、最大化速度和最小化片狀性之間取得適當(dāng)?shù)钠胶猓瑥亩纬捎行У臏y(cè)試套件。