集成測(cè)試的概念
說(shuō)到集成測(cè)試,相信每個(gè)測(cè)試工程師并不陌生,它不是一個(gè)嶄新的概念,通過(guò)維基百科定義可以知道它在傳統(tǒng)軟件測(cè)試中的含義。
Integration testing (sometimes called integration and testing, abbreviated I&T) is the phase in software testing in which individual software modules are combined and tested as a group. Integration testing is conducted to evaluate the compliance of a system or component with specified functional requirements.
即,集成測(cè)試(有時(shí)稱為集成和測(cè)試,簡(jiǎn)稱 I&T)是軟件測(cè)試中的階段,在該階段中,將各個(gè)單獨(dú)開(kāi)發(fā)的軟件模塊組合在一起并進(jìn)行整體測(cè)試,以便評(píng)估系統(tǒng)或組件是否符合指定的功能要求。
微服務(wù)架構(gòu)下也需要集成測(cè)試,需要針對(duì)不同服務(wù)的不同方法之間的通信情況進(jìn)行相關(guān)測(cè)試。因?yàn)樵趯?duì)微服務(wù)進(jìn)行單元測(cè)試時(shí),單元測(cè)試用例只會(huì)驗(yàn)證被測(cè)單元的內(nèi)部邏輯,并不驗(yàn)證其依賴的模塊。即使對(duì)于服務(wù) A 和服務(wù) B 的單元測(cè)試分別通過(guò),并不能說(shuō)明服務(wù) A 和服務(wù) B 的交互是正常的。
對(duì)于微服務(wù)架構(gòu)來(lái)說(shuō),集成測(cè)試通常關(guān)注于驗(yàn)證那些與外部組件(例如數(shù)據(jù)存儲(chǔ)或其他微服務(wù))通信的子系統(tǒng)或模塊。目標(biāo)是驗(yàn)證這些子系統(tǒng)或模塊是否可以正確地與外部組件進(jìn)行通信,而不是測(cè)試外部組件是否正常工作。因此,微服務(wù)架構(gòu)下的集成測(cè)試,應(yīng)該驗(yàn)證要集成的子系統(tǒng)之間與外部組件之間的基本通信路徑,包括正確路徑和錯(cuò)誤路徑。
微服務(wù)架構(gòu)下的集成測(cè)試
如上圖所示,網(wǎng)關(guān)組件層(Gateways+Http Client+External Service)包含了訪問(wèn)外部服務(wù)的邏輯,通常包含一個(gè) HTTP/S 的客戶端,客戶端會(huì)連接到系統(tǒng)中另一個(gè)微服務(wù)或外部服務(wù)。數(shù)據(jù)持久層(Date Mappers/ORM)用于連接外部數(shù)據(jù)存儲(chǔ)。
即,微服務(wù)架構(gòu)下的集成測(cè)試主要包括兩部分:
網(wǎng)關(guān)組件層, 微服務(wù)的組件與外部服務(wù)的通信路徑;
數(shù)據(jù)持久層, 數(shù)據(jù)庫(kù)訪問(wèn)模塊與外部數(shù)據(jù)庫(kù)的交互。
這里請(qǐng)注意,因?yàn)樾枰獪y(cè)試微服務(wù)下子系統(tǒng)之間的通信和外部服務(wù)的通信是否正確,所以理想情況下不應(yīng)該對(duì)外部組件使用測(cè)試替身(Test Double)。
下面我們逐一來(lái)看這兩部分是如何進(jìn)行集成測(cè)試的:
(1)網(wǎng)關(guān)組件層集成測(cè)試
假設(shè)有個(gè)登錄服務(wù),該服務(wù)需要知道當(dāng)前時(shí)間,而時(shí)間是由一個(gè)外部的時(shí)間服務(wù)提供的。當(dāng)向 /api/json/cet/now 發(fā)出 GET 請(qǐng)求時(shí),狀態(tài)碼為 200,并返回如下完整的時(shí)間信息。
{
$id: "1",
currentDateTime: "2020-07-29T02:11+02:00",
utcOffset: "02:00:00",
isDayLightSavingsTime: true,
dayOfTheWeek: "Wednesday",
timeZoneName: "Central Europe Standard Time",
currentFileTime: 132404622740972830,
ordinalDate: "2020-211",
serviceResponse: null,
}
?如果訪問(wèn)的 URL 錯(cuò)誤,比如向 /api/json111/cet/now發(fā)出 GET 請(qǐng)求時(shí),狀態(tài)碼為 404,返回如下錯(cuò)誤提示。
一般來(lái)說(shuō),集成測(cè)試會(huì)負(fù)責(zé)檢驗(yàn)與外部服務(wù)的連接以及交互協(xié)議相關(guān)的問(wèn)題,如 HTTP header 的缺失、SSL 處理的異常,或者請(qǐng)求/響應(yīng)的不匹配。所有的錯(cuò)誤處理邏輯都需要在測(cè)試中被覆蓋,以確保所使用的服務(wù)和協(xié)議客戶端在特殊情況下能夠按預(yù)期進(jìn)行響應(yīng)。
(2)數(shù)據(jù)持久層集成測(cè)試
數(shù)據(jù)持久層的集成測(cè)試則要復(fù)雜一些,因?yàn)榻Y(jié)果會(huì)被保存在存儲(chǔ)系統(tǒng)上并被持久化,每次測(cè)試的執(zhí)行都可能因?yàn)楦牧藬?shù)據(jù)而對(duì)后續(xù)測(cè)試的執(zhí)行產(chǎn)生影響。這意味著,兩次測(cè)試之間并非完全獨(dú)立,因?yàn)樗鼈儾僮髁斯餐臄?shù)據(jù)。
絕大多數(shù)情況下,應(yīng)該保證兩次測(cè)試之間的外部因素也是相互獨(dú)立的。因?yàn)檫@樣的錯(cuò)誤(測(cè)試數(shù)據(jù)的修改而導(dǎo)致的測(cè)試執(zhí)行失?。┏霈F(xiàn)后往往很難意識(shí)到,進(jìn)而影響排查進(jìn)度。
為了保障兩次測(cè)試的獨(dú)立性,持久層集成測(cè)試的常見(jiàn)步驟是:
-
在執(zhí)行任意測(cè)試前,先回退數(shù)據(jù)庫(kù)到一個(gè)已知且可預(yù)測(cè)的狀態(tài),這需要清理/回滾之前對(duì)數(shù)據(jù)庫(kù)的修改;
-
通過(guò)插入對(duì)測(cè)試來(lái)說(shuō)已知且預(yù)期中的數(shù)據(jù)來(lái)重建數(shù)據(jù)庫(kù);
-
進(jìn)行相關(guān)的測(cè)試;
-
循環(huán)上述這個(gè)過(guò)程。
常見(jiàn)問(wèn)題及解決策略
然而,有很多時(shí)候外部服務(wù)不可用(服務(wù)尚未開(kāi)發(fā)完成、服務(wù)有 block 級(jí)別的缺陷未修復(fù)),或其異常行為(如外部組件的超時(shí)、響應(yīng)變慢等)很難去驗(yàn)證。外部組件不能使用測(cè)試替身,外部服務(wù)又不可用或異常場(chǎng)景難構(gòu)造,看似無(wú)解,實(shí)際上都是有替代方案的。
服務(wù)不可用
針對(duì)服務(wù)不可用的情況,微服務(wù)虛擬化技術(shù)可以完美解決這種問(wèn)題,它是避免與其他服務(wù)通信時(shí)出現(xiàn)意外的必要工具,在具有大量依賴項(xiàng)的企業(yè)環(huán)境中工作的時(shí)候更是如此。它可以用于在測(cè)試階段消除對(duì)第三方服務(wù)的依賴,測(cè)試應(yīng)用程序在遇到延遲或其他網(wǎng)絡(luò)問(wèn)題時(shí)的行為。它通過(guò)創(chuàng)建代理服務(wù)實(shí)現(xiàn)對(duì)依賴服務(wù)的模擬,特別適合測(cè)試服務(wù)之間的通信。常見(jiàn)的工具有 Wiremock、Hoverfly、Mountebank 等。
以 Wiremock 為例,如下代碼的效果是:當(dāng)相對(duì) URL 完全匹配 /api/json/cet/now 時(shí),將返回狀態(tài) 200,響應(yīng)的主體類似于 ?/api/json/cet/now的返回值,Content-Type Header 的值為 text/plain。否則,當(dāng)相對(duì) URL 錯(cuò)誤,比如訪問(wèn) /api/json111/cet/now 時(shí),則返回 404 的錯(cuò)誤。
@Test
public void exactUrlOnly() {
stubFor(get(urlEqualTo("/api/json/cet/now"))
.willReturn(aResponse()
.withHeader("Content-Type", "text/plain")
.withBody(equalToJson("{
$id: \"1\",
currentDateTime: \"2020-07-29T02:11+02:00\",
utcOffset: \"02:00:00\",
isDayLightSavingsTime: true,
dayOfTheWeek: \"Wednesday\",
timeZoneName: \"Central Europe Standard Time\",
currentFileTime: 132404622740972830,
ordinalDate: \"2020-211\",
serviceResponse: null,
}"))));
assertThat(testClient.get("/api/json/cet/now").statusCode(), is(200));
assertThat(testClient.get("/api/json111/cet/now").statusCode(), is(404));
}
服務(wù)超時(shí)&響應(yīng)慢難構(gòu)造
如果使用真實(shí)服務(wù)測(cè)試,服務(wù)超時(shí)或響應(yīng)慢等情況需要特殊構(gòu)造下,這時(shí)候借助各種工具會(huì)比較方便,比如常見(jiàn)的軟件有 Fiddler、Dummynet、Clumsy 等。
Wiremock 也支持延遲的功能,比如使用 withFixedDelay() 可以實(shí)現(xiàn)固定延遲的效果:
stubFor(get(urlEqualTo("/api/json/cet/now")).willReturn(
aResponse()
.withStatus(200)
.withFixedDelay(2000)));
使用 withLogNormalRandomDelay() 可以實(shí)現(xiàn)隨機(jī)延遲效果:
stubFor(get(urlEqualTo("/api/json/cet/now")).willReturn(
aResponse()
.withStatus(200)
.withLogNormalRandomDelay(90, 0.1)));
數(shù)據(jù)初始化和構(gòu)造的成本高
上述對(duì)數(shù)據(jù)持久層集成測(cè)試的方法雖然通用,但是將數(shù)據(jù)庫(kù)進(jìn)行初始化需要編寫(xiě)大量的樣例代碼,插入預(yù)期的數(shù)據(jù)也需要編寫(xiě)大量的數(shù)據(jù)庫(kù)操作語(yǔ)句。面對(duì)這個(gè)問(wèn)題,可以使用一些現(xiàn)成的持久化測(cè)試框架來(lái)改善測(cè)試體驗(yàn),常見(jiàn)的持久化測(cè)試框架有 NoSQLUnit、DBUnit 等。
DBUnit 的設(shè)計(jì)理念就是在測(cè)試之前,先備份好數(shù)據(jù)庫(kù),再給對(duì)象數(shù)據(jù)庫(kù)植入需要準(zhǔn)備的數(shù)據(jù),在測(cè)試完畢后,再讀入備份數(shù)據(jù)庫(kù),初始化到測(cè)試前的狀態(tài)。DBUnit 可以在測(cè)試用例的生命周期內(nèi)來(lái)對(duì)數(shù)據(jù)庫(kù)的操作結(jié)果進(jìn)行比較。DBUnit 支持的數(shù)據(jù)庫(kù)有 db2、h2、mssql、mysql、oralce、postgresql 等。
NoSQLUnit 是用 DBUnit 類似的方式來(lái)編寫(xiě) NoSQL 數(shù)據(jù)庫(kù)的測(cè)試。支持多種 NoSQL 數(shù)據(jù)庫(kù),包括 HBase、MongoDB、Redis、ElasticSearch、Vault、Neo4j 等。
總結(jié)
本節(jié)課講解了微服務(wù)架構(gòu)下的集成測(cè)試定義,接著講解了微服務(wù)下的集成測(cè)試的兩個(gè)方面:網(wǎng)關(guān)組件層集成測(cè)試和數(shù)據(jù)持久層集成測(cè)試。
在網(wǎng)關(guān)組件層集成測(cè)試中,通過(guò)服務(wù)虛擬化技術(shù)來(lái)實(shí)現(xiàn)對(duì)外部服務(wù)能力的模擬,通過(guò)模擬網(wǎng)絡(luò)異常情況來(lái)構(gòu)造外部服務(wù)超時(shí)、響應(yīng)慢的情況。
在數(shù)據(jù)持久層集成測(cè)試中,通過(guò)持久化測(cè)試框架可以避免常規(guī)持久化測(cè)試時(shí)編寫(xiě)大量代碼和大量 SQL 語(yǔ)句的情況。
當(dāng)然,如上框架和工具的威力不限于此,文中只給出了關(guān)鍵的示例信息,你可以根據(jù)需求或興趣自行探索學(xué)習(xí)。
最后感謝每一個(gè)認(rèn)真閱讀我文章的人,禮尚往來(lái)總是要有的,雖然不是什么很值錢(qián)的東西,如果你用得到的話可以直接拿走:
軟件測(cè)試面試小程序
被百萬(wàn)人刷爆的軟件測(cè)試題庫(kù)?。。≌l(shuí)用誰(shuí)知道?。?!全網(wǎng)最全面試刷題小程序,手機(jī)就可以刷題,地鐵上公交上,卷起來(lái)!
涵蓋以下這些面試題板塊:
1、軟件測(cè)試基礎(chǔ)理論 ,2、web,app,接口功能測(cè)試 ,3、網(wǎng)絡(luò) ,4、數(shù)據(jù)庫(kù)?,5、linux
6、web,app,接口自動(dòng)化 ,7、性能測(cè)試?,8、編程基礎(chǔ),9、hr面試題 ,10、開(kāi)放性測(cè)試題,11、安全測(cè)試,12、計(jì)算機(jī)基礎(chǔ)
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-672705.html
這些資料,對(duì)于【軟件測(cè)試】的朋友來(lái)說(shuō)應(yīng)該是最全面最完整的備戰(zhàn)倉(cāng)庫(kù),這個(gè)倉(cāng)庫(kù)也陪伴上萬(wàn)個(gè)測(cè)試工程師們走過(guò)最艱難的路程,希望也能幫助到你!???文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-672705.html
到了這里,關(guān)于如何進(jìn)行微服務(wù)的集成測(cè)試的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!