業(yè)界認(rèn)為應(yīng)該讓契約測試來替代集成測試。認(rèn)為你寫的2-5%的集成測試和單元測試有重復(fù),或者和其它地方的集成測試存在重復(fù)畅形,而且當(dāng)集成測試失敗時(shí),你也不知道發(fā)生了什么诉探,不能及時(shí)準(zhǔn)確定位問題日熬。
一、什么是契約測試
微服務(wù)要求有低耦合肾胯、高內(nèi)聚的邊界竖席,通常我們使用 DDD 的限界上下文作為微服務(wù)邊界;而契約測試則是針對(duì)這個(gè)邊界的測試敬肚。契約測試是驗(yàn)證服務(wù)的Provider是否按照期望的方式與服務(wù)的Consumer進(jìn)行交互毕荐,簡單的說是Consumer與Provider兩者之間的集成。而Contract即合同艳馒、契約憎亚,就是Provider與Consumer的交互方式。
契約測試通常是基于Consumer驅(qū)動(dòng)的(Consumer Driven Contracts弄慰,基于Consumer驅(qū)動(dòng)的契約測試工具有PACT)第美。基于Consumer驅(qū)動(dòng)的契約測試分兩個(gè)階段:1)Consumer生成契約陆爽,開發(fā)者在Consumer端寫測試時(shí)Mock掉Provider什往,運(yùn)行測試生成契約文件;2)Provider驗(yàn)證契約墓陈,開發(fā)者拿契約文件直接在Provider端運(yùn)行測試進(jìn)行驗(yàn)證恶守。
二、契約測試的特點(diǎn)
1)開發(fā)人員編寫贡必,采用Mock機(jī)制兔港,開發(fā)本地就可以運(yùn)行,沒有真實(shí)調(diào)用仔拟,運(yùn)行快衫樊,毫秒級(jí)修復(fù)反饋周期短;2)Provider與Consumer兩兩之間的驗(yàn)證利花,容易定位問題科侈,而且與底層測試或其它契約之間沒有重復(fù);3)不需要部署真實(shí)的集成環(huán)境炒事,穩(wěn)定且成功率高臀栈;4)溝通成本低。(比如一個(gè)Consumer端的加入導(dǎo)致服務(wù)端API修改挠乳,服務(wù)端開發(fā)人員不必跑去找所有其它Consumer端開發(fā)人員溝通確認(rèn)是否會(huì)被影響权薯,直接運(yùn)行契約測試就能知道結(jié)果姑躲。
三、擴(kuò)展
1)還有一個(gè)概念叫做design by contract盟蚣,它規(guī)定軟件設(shè)計(jì)人員應(yīng)為軟件組件定義正式黍析、精確和可驗(yàn)證的接口規(guī)范,該規(guī)范應(yīng)使用前提條件屎开、后置條件和不變式來擴(kuò)展抽象數(shù)據(jù)類型的普通定義阐枣。
2)霍爾邏輯中,霍爾三元組對(duì)理解程序更友好奄抽;P和Q是斷言蔼两,C是命令?。P叫做前置條件如孝,Q叫做后置條件宪哩。霍爾三元組簡單理解為:只要P在C執(zhí)行前的狀態(tài)下成立第晰,則在執(zhí)行之后Q也成立锁孟。
{P} C {Q}
3)聯(lián)想到solid原則的里氏替換原則,子類不應(yīng)該破壞父類定下來的契約茁瘦。當(dāng)你發(fā)現(xiàn)一個(gè)子類沒有辦法完全替換其父類且并不改變原有的assertion的時(shí)候, 你就不該讓它們有繼承關(guān)系.?
四品抽、集成測試
端到端集成測試(簡稱集成測試)是指系統(tǒng)集成后的自動(dòng)化測試,是系統(tǒng)或模塊真實(shí)組裝后運(yùn)行的測試甜熔。很多團(tuán)隊(duì)用UI端到端來測系統(tǒng)集成后的行為圆恤,這類工具很多,比如有Selenium webdriver等腔稀。端到端的集成測試反饋與修復(fù)的周期比較長盆昙、運(yùn)行速度慢,測試運(yùn)行不穩(wěn)定焊虏,有時(shí)隨機(jī)失敗淡喜,維護(hù)成本也很高。它不像單元測試诵闭,單元測試測具體一個(gè)方法或API炼团,定位準(zhǔn)確,采用Mock機(jī)制疏尿,運(yùn)行速度非澄林ィ快(毫秒級(jí)),又是開發(fā)人員在本地執(zhí)行褥琐,反饋修復(fù)及時(shí)锌俱,成本較低。
集成測試的特點(diǎn):1)真實(shí)安裝后測試敌呈,測試更接近真實(shí)使用情況贸宏;2)可見性強(qiáng)贩汉,容易理解;(比如:看一遍運(yùn)行關(guān)鍵業(yè)務(wù)的集成測試锚赤,業(yè)務(wù)人員或客戶會(huì)覺得很放心。也可以替代驗(yàn)收測試)褐鸥;3)模塊真實(shí)調(diào)用线脚,測試運(yùn)行慢,秒級(jí)別或分鐘級(jí)別叫榕,反饋與修復(fù)的周期慢浑侥,成本高;4)問題定位難晰绎,多個(gè)子模塊組合安裝后的測試寓落,很難定位是哪個(gè)模塊出的問題;5)真實(shí)的安裝或環(huán)境搭建荞下,不穩(wěn)定伶选,容易導(dǎo)致測試隨機(jī)失敗尖昏;6)溝通成本高仰税,需要不同模塊團(tuán)隊(duì)間的協(xié)調(diào)工作;7)與底層測試或集成測試會(huì)有重復(fù)抽诉,集成測試中有的路徑已經(jīng)被單元測試覆蓋陨簇。