亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在集成測試之前啟動主應用程序和測試應用程序

在集成測試之前啟動主應用程序和測試應用程序

慕斯709654 2023-06-14 14:40:53
我有兩個 spring boot 應用程序,一個在 src/test 中,另一個在 src/main 中。他們有自己獨立的 app.properties 和獨立的端口。我想進行集成測試,在它運行之前,我希望它在 maven 中運行集成測試時啟動這兩個服務器。到目前為止,使用前后 maven 集成測試插件沒有幫助,我似乎無法在 Spring Boot 中以編程方式啟動它們。此外,我已經意識到即使我使用 ActiveProfile 和 spring boot 測試指定集成測試也不會連接到我的主應用程序,它總是會啟動我的測試應用程序。我的主要應用程序:import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.builder.SpringApplicationBuilder;@SpringBootApplicationpublic class App {    public static void main( String[] args )    {        new SpringApplicationBuilder(App.class)             .build()        .run(args);    }}我的測試應用程序:import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.builder.SpringApplicationBuilder;@SpringBootApplicationpublic class MockServerApp {    public static void main(String[] args) {        // TODO Auto-generated method stub        new SpringApplicationBuilder(MockServerApp.class)               .build()        .run(args);    }}我的集成測試import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.context.annotation.PropertySource;import org.springframework.test.context.ActiveProfiles;import org.springframework.test.context.junit4.SpringRunner;import com.nulogix.billing.App;import com.nulogix.billing.mockserver.MockServerApp;@RunWith(SpringRunner.class)@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT,classes = {App.class})public class BillingMediatorIT {        @Test        public void testOne(){            }        }我的 App.class 連接到端口 28433,我的 MockServerApp.class 連接到端口 9119。由于某種原因,我的測試仍然連接到 MockServerApp.class,因為它使用端口 9119。如何解決此問題并使其啟動兩個應用程序預集成測試階段。
查看完整描述

1 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

問題本身有些事情看起來不對勁,我會盡力澄清

沒有必要保留兩個 Spring Boot 應用程序:一個src/testsrc\main.?如果你確實需要使用兩個不同的微服務——至少使用兩個 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

現在 Spring Boot 很好地支持在@SpringBootTest注釋的幫助下運行一個微服務,注釋基本上試圖在測試中模擬 Spring Boot 微服務的啟動(具有配置管理、組件掃描等) 。并且由于 spring 配置緩存功能,您可以在測試用例之間重用相同的應用程序上下文。

通常 spring universe 中的集成測試測試一個特定的微服務,該微服務能夠模擬出它的一些 bean,這些 bean 可以為外部組件提供集成點。

然而,如果你想運行 2 個應用程序,你可能需要一個完整的“系統測試”,因為你測試了這些組件之間的交互。這有點超出了 spring 本身的范圍,它存在于一個 JVM 中并服務于一個進程(應用程序)。

因此,假設每個測試都是出于明確的特定原因而完成的,首先,問問自己到底想測試什么?

例如,如果您想測試應用程序 1 的內部邏輯,也許您根本不應該啟動應用程序 2。例如,如果 app1 通過 HTTP/Rest 與 app2 交互,也許你應該使用某種模擬服務器,比如wiremock?或者,在 mockito 中模擬與該服務器交互的 bean,或者使用 Internal Spring Test 的模擬服務器來表示一個例如這里的遠程應用程序

這適用于大多數情況。

現在,如果您真的需要一個系統測試來檢查可能涉及許多應用程序的“業務流程”,請做好準備,有一天您將不得不創建另一個應用程序,然后測試將變得更加復雜。也許您應該考慮創建一個包含所有微服務的測試環境并從那里運行測試套件。然后自動化使用一些腳本創建環境并運行此腳本以創建環境并在其上運行測試,然后刪除環境。您還需要關心(如果)您擁有的所有數據庫、配置管理等。我建議與您工作場所的 Devops 人員討論這個問題,他們可能會幫助您解決這個問題。你也可以和你的 QA 部門談談,詢問項目的自動化,這可能是一項非常有趣的任務,通常每個公司都以自己的方式解決它。

如果您仍然需要從 maven 運行它,現在如何組織代碼。

我會把系統測試放在一個單獨的模塊中(因為它們實際上既不屬于 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

然后使這個模塊同時依賴于 app1 和 app2,以便它們首先編譯。然后考慮到當 Maven 構建此模塊時,app1 和 app2 的工件已準備就緒。

Maven 的默認生命周期有一個階段的概念,它基本上是您想要運行插件的掛鉤點。因此,例如,您可以創建一個腳本來運行兩個應用程序(具有配置的端口和所有內容),然后分階段運行腳本,然后在您必須在測試模塊中pre-integration-test配置的幫助下將所有測試作為集成測試運行maven-failsafe-pluginpom 然后在一個post-integration-test階段運行另一個腳本來停止這兩個應用程序


查看完整回答
反對 回復 2023-06-14
  • 1 回答
  • 0 關注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號