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