更新時(shí)間:2021-08-10 12:53:26 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽960次
微服務(wù)測(cè)試是很有挑戰(zhàn)性的,為什么這樣說(shuō)呢?原因有以下幾點(diǎn):
結(jié)果不穩(wěn)定, 分布式系統(tǒng),服務(wù)之間的通信都是通過(guò)網(wǎng)絡(luò)調(diào)用,然而在網(wǎng)絡(luò)上傳送,都會(huì)面臨網(wǎng)絡(luò)延時(shí)、超時(shí)、帶寬等因素,容易導(dǎo)致不穩(wěn)定的測(cè)試結(jié)果。
驗(yàn)證成本高,為了驗(yàn)證多個(gè)服務(wù)協(xié)作后的功能正確與否,需要為每個(gè)服務(wù)搭建基礎(chǔ)設(shè)施(包括數(shù)據(jù)庫(kù)、緩存等),并執(zhí)行部署、配置等步驟,以確保服務(wù)能正確運(yùn)行。
反饋周期長(zhǎng), 相比單體應(yīng)用而言,微服務(wù)架構(gòu)下,可獨(dú)立部署的單元多,因此集成測(cè)試的反饋周期比之前會(huì)更長(zhǎng),定位問(wèn)題的時(shí)間就會(huì)更久。
溝通成本高, 微服務(wù)常由不同團(tuán)隊(duì)開(kāi)發(fā)并維護(hù),當(dāng)服務(wù)頻繁進(jìn)行改動(dòng)和版本升級(jí)的時(shí)候,很容易導(dǎo)致不兼容,加大團(tuán)隊(duì)之間的溝通成本。
測(cè)試金字塔很好的幫助我們?cè)谥贫y(cè)試策略的時(shí)候,區(qū)分不同層次測(cè)試關(guān)注點(diǎn),同時(shí),一般來(lái)說(shuō),測(cè)試顆粒度越粗,越脆弱,執(zhí)行的時(shí)間越長(zhǎng),維護(hù)成本也越高。
在微服務(wù)中,不得不聊聊消費(fèi)者契約測(cè)試,
契約,一種定義在Consumer與Provider之間的交互方式
契約是Consumer和Provider團(tuán)隊(duì)之間達(dá)成的交互協(xié)議,更多的看中的是請(qǐng)求和響應(yīng)的Payload結(jié)構(gòu)(Schema),由服務(wù)消費(fèi)者構(gòu)建并生成contract,然后將contact上傳到Pact broker or server; 對(duì)應(yīng)的服務(wù)提供者,需要在Pipeline中,有一個(gè)task進(jìn)行契約的驗(yàn)證,保證契約不會(huì)被破壞。
測(cè)試分層,Consumer和Provider分別測(cè)試。
測(cè)試前移,為Consumer提供Mock,不需要真實(shí)的集成環(huán)境,穩(wěn)定性高。
反饋周期短,單元測(cè)試級(jí)別,測(cè)試運(yùn)行快,毫米級(jí)。
溝通成本底
為服務(wù)消費(fèi)者提供了信心,更為服務(wù)提供者提供了更大的價(jià)值(通過(guò)與不同消費(fèi)者約定的契約,可以保證服務(wù)安全的升級(jí)變遷,不會(huì)破壞之前已有的功能)
一個(gè)服務(wù)需要被多個(gè)消費(fèi)者使用,每個(gè)消費(fèi)者的訴求并不完全一樣(一對(duì)一的場(chǎng)景,沒(méi)有太大意義)。
服務(wù)消費(fèi)者與服務(wù)提供者由不同的團(tuán)隊(duì)開(kāi)發(fā)維護(hù)。
服務(wù)消費(fèi)者與服務(wù)提供者,一定要對(duì)契約達(dá)成一致,并一直保持這種約束(如果有一方?jīng)]有遵守,比如提供者根本不將契約驗(yàn)證集成到流水線中,那么就沒(méi)有任何意義),契約的不符合預(yù)期的變化應(yīng)當(dāng)會(huì)造成測(cè)試的失敗。
檢查Consumer構(gòu)建的請(qǐng)求是否匹配到了對(duì)應(yīng)的Contract
檢查Provider的響應(yīng)是否滿(mǎn)足Consumer的需要
Provider的業(yè)務(wù)邏輯是否正確
Consumer的處理響應(yīng)的邏輯
可參考的工具: Pact, Spring Cloud Contract等
集成測(cè)試驗(yàn)證服務(wù)或者組件之間的連通性和交互以檢查接口缺陷,集成測(cè)試旨在通過(guò)集成不同的Downstream服務(wù),來(lái)覆蓋基本的成功和錯(cuò)誤的場(chǎng)景,在我們項(xiàng)目中,選用REST Assured作為集成測(cè)試工具,使用非常方便:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@AutoConfigureRestDocs
public class UserDocumentationTests {
@LocalServerPort
private int port;
@Autowired
private RequestSpecification documentationSpec;
@Test
public void listUsers() {
given(this.documentationSpec).filter(document("list-users")).when()
.port(this.port).get("/").then().assertThat().statusCode(is(200));
}
}
當(dāng)downstream服務(wù)非常不穩(wěn)定的時(shí)候,我們會(huì)通過(guò)wiremock作為proxy對(duì)請(qǐng)求和響應(yīng)進(jìn)行錄制,使用wiremock做測(cè)試替身,隔離外部調(diào)用,避免多服務(wù)間的復(fù)雜情況(網(wǎng)絡(luò),其他團(tuán)隊(duì)服務(wù)可用性等),并以可重復(fù)的方式模擬任何場(chǎng)景(超時(shí),Down機(jī),SSL驗(yàn)證失敗,丟失HTTP頭,請(qǐng)求響應(yīng)不匹配等),運(yùn)行穩(wěn)定,且反饋周期短。
以上就是動(dòng)力節(jié)點(diǎn)小編介紹的"不得不說(shuō)的微服務(wù)測(cè)試",希望對(duì)大家有幫助,想了解更多可查看Java教程。動(dòng)力節(jié)點(diǎn)在線學(xué)習(xí)教程,針對(duì)沒(méi)有任何Java基礎(chǔ)的讀者學(xué)習(xí),讓你從入門(mén)到精通,主要介紹了一些Java基礎(chǔ)的核心知識(shí),讓同學(xué)們更好更方便的學(xué)習(xí)和了解Java編程,感興趣的同學(xué)可以關(guān)注一下。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)
初級(jí) 202925
初級(jí) 203221
初級(jí) 202629
初級(jí) 203743