1 回答

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊
問題本身有些事情看起來不對勁,我會(huì)盡力澄清
沒有必要保留兩個(gè) Spring Boot 應(yīng)用程序:一個(gè)src/test
在src\main
.?如果你確實(shí)需要使用兩個(gè)不同的微服務(wù)——至少使用兩個(gè) maven 模塊:
??project ??|___?app1 ??|??????|__?src/main/java?-?app1?production?code?is?here ??|??????|__?src/test/java?-?app1?tests?are?here ??|??????|__?pom.xml ??|___?app2?????? ??|??????|__?src/main/java?-?app2?production?code?is?here ??|??????|__?src/test/java?-?app2?tests?are?here ??|??????|__?pom.xml ??|__?pom.xml
現(xiàn)在 Spring Boot 很好地支持在@SpringBootTest
注釋的幫助下運(yùn)行一個(gè)微服務(wù),注釋基本上試圖在測試中模擬 Spring Boot 微服務(wù)的啟動(dòng)(具有配置管理、組件掃描等) 。并且由于 spring 配置緩存功能,您可以在測試用例之間重用相同的應(yīng)用程序上下文。
通常 spring universe 中的集成測試測試一個(gè)特定的微服務(wù),該微服務(wù)能夠模擬出它的一些 bean,這些 bean 可以為外部組件提供集成點(diǎn)。
然而,如果你想運(yùn)行 2 個(gè)應(yīng)用程序,你可能需要一個(gè)完整的“系統(tǒng)測試”,因?yàn)槟銣y試了這些組件之間的交互。這有點(diǎn)超出了 spring 本身的范圍,它存在于一個(gè) JVM 中并服務(wù)于一個(gè)進(jìn)程(應(yīng)用程序)。
因此,假設(shè)每個(gè)測試都是出于明確的特定原因而完成的,首先,問問自己到底想測試什么?
例如,如果您想測試應(yīng)用程序 1 的內(nèi)部邏輯,也許您根本不應(yīng)該啟動(dòng)應(yīng)用程序 2。例如,如果 app1 通過 HTTP/Rest 與 app2 交互,也許你應(yīng)該使用某種模擬服務(wù)器,比如wiremock?或者,在 mockito 中模擬與該服務(wù)器交互的 bean,或者使用 Internal Spring Test 的模擬服務(wù)器來表示一個(gè)例如這里的遠(yuǎn)程應(yīng)用程序
這適用于大多數(shù)情況。
現(xiàn)在,如果您真的需要一個(gè)系統(tǒng)測試來檢查可能涉及許多應(yīng)用程序的“業(yè)務(wù)流程”,請做好準(zhǔn)備,有一天您將不得不創(chuàng)建另一個(gè)應(yīng)用程序,然后測試將變得更加復(fù)雜。也許您應(yīng)該考慮創(chuàng)建一個(gè)包含所有微服務(wù)的測試環(huán)境并從那里運(yùn)行測試套件。然后自動(dòng)化使用一些腳本創(chuàng)建環(huán)境并運(yùn)行此腳本以創(chuàng)建環(huán)境并在其上運(yùn)行測試,然后刪除環(huán)境。您還需要關(guān)心(如果)您擁有的所有數(shù)據(jù)庫、配置管理等。我建議與您工作場所的 Devops 人員討論這個(gè)問題,他們可能會(huì)幫助您解決這個(gè)問題。你也可以和你的 QA 部門談?wù)?,詢問?xiàng)目的自動(dòng)化,這可能是一項(xiàng)非常有趣的任務(wù),通常每個(gè)公司都以自己的方式解決它。
如果您仍然需要從 maven 運(yùn)行它,現(xiàn)在如何組織代碼。
我會(huì)把系統(tǒng)測試放在一個(gè)單獨(dú)的模塊中(因?yàn)樗鼈儗?shí)際上既不屬于 app1 也不屬于 app2):
??project ??|___?app1 ??|??????|__?src/main/java?-?app1?production?code?is?here ??|??????|__?src/test/java?-?app1?tests?are?here ??|??????|__?pom.xml ??|___?app2?????? ??|??????|__?src/main/java?-?app2?production?code?is?here ??|??????|__?src/test/java?-?app2?tests?are?here ??|??????|__?pom.xml ??|__?test-module ??|???|__pom.xml?//depends?on?app1,?app2 ??|???|__?src/test/java?-?all?system?tests?are?here? ??|__?pom.xml
然后使這個(gè)模塊同時(shí)依賴于 app1 和 app2,以便它們首先編譯。然后考慮到當(dāng) Maven 構(gòu)建此模塊時(shí),app1 和 app2 的工件已準(zhǔn)備就緒。
Maven 的默認(rèn)生命周期有一個(gè)階段的概念,它基本上是您想要運(yùn)行插件的掛鉤點(diǎn)。因此,例如,您可以創(chuàng)建一個(gè)腳本來運(yùn)行兩個(gè)應(yīng)用程序(具有配置的端口和所有內(nèi)容),然后分階段運(yùn)行腳本,然后在您必須在測試模塊中pre-integration-test
配置的幫助下將所有測試作為集成測試運(yùn)行maven-failsafe-plugin
pom 然后在一個(gè)post-integration-test
階段運(yùn)行另一個(gè)腳本來停止這兩個(gè)應(yīng)用程序
添加回答
舉報(bào)