精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何為復雜的 Java 應用編寫集成測試,你學會了嗎?

開發 前端
不知道大家注意到剛才測試代碼存在的問題沒有,主要就是沒法斷言。因為客戶端、route、server 都是以一個應用的維度去運行的,沒法獲取到一些關鍵指標。比如輸出在線用戶,當客戶端作為一個應用時,在線用戶就是直接打印在了終端,而沒有直接暴露一個接口返回在線數據;收發消息也是同理。
這段時間比較重大的更新就是把元數據中心抽離出來了,以前是和 zookeeper 的代碼強耦合在一起的,重構之后可以有多種實現了。

今后甚至可以提供一個 jar 包就可以把后端服務全部啟動起來用于體驗,此時就可以使用一個簡單的基于內存的注冊中心。

除此之外做的更多的就是新增了一個集成測試的模塊,沒有完善的集成測試功能在合并代碼的時候都要小心翼翼,基本的功能需求都沒法保證。

加上這幾年我也接觸了不少優秀的開源項目(比如 Pulsar、OpenTelemetry、HertzBeat 等),他們都有完整的代碼合并流程;首先第一點就得把測試流水線跑通過。

這一點在 OpenTelemetry 社區更為嚴格:

圖片圖片

他們的構建測試流程非常多,包括單元測試、集成測試、代碼風格、多版本兼容等。

所以在結合了這些優秀項目的經驗后我也為 cim 項目新增相關的模塊 cim-integration-test,同時也在 github 上配置了相關的 action,最終的效果如下:

圖片圖片

圖片圖片

在 “Build with Maven” 階段觸發單元測試和集成測試,最終會把測試結果上傳到 Codecov,然后會在 PR 的評論區輸出測試報告。

圖片圖片

相關的 action 配置如下:

圖片圖片

就是配置了幾個 Job,重點是這里的:

mvn -B package --file pom.xml

它會編譯并運行項目下面的所有 test 代碼。

cim-integration-test 模塊

為了方便進行集成測試,我新增了 cim-integration-test 這個模塊,這里面沒有任何源碼,只有測試相關的代碼。

圖片圖片

類的繼承關系圖如下:

圖片圖片

因為我們做集成測試需要把 cim 所依賴的服務都啟動起來,目前主要由以下幾個服務:

  • cim-server: cim 的服務端
  • cim-route: 路由服務
  • cim-client: 客戶端

而 route 服務是依賴于 server 服務,所以 route 繼承了 server,client 則是需要 route 和 server 都啟動,所以它需要繼承 route。

集成 test container

先來看看 server 的測試實現:

public abstract class AbstractServerBaseTest {  
  
    private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName  
            .parse("zookeeper")  
            .withTag("3.9.2");  
  
    private static final Duration DEFAULT_STARTUP_TIMEOUT = Duration.ofSeconds(60);  
  
    @Container  
    public final ZooKeeperContainer  
            zooKeeperContainer = new ZooKeeperContainer(DEFAULT_IMAGE_NAME, DEFAULT_STARTUP_TIMEOUT);  
  
    @Getter  
    private String zookeeperAddr;  
  
    public void startServer() {  
        zooKeeperContainer.start();  
        zookeeperAddr = String.format("%s:%d", zooKeeperContainer.getHost(), zooKeeperContainer.getMappedPort(ZooKeeperContainer.DEFAULT_CLIENT_PORT));  
        SpringApplication server = new SpringApplication(CIMServerApplication.class);  
        server.run("--app.zk.addr=" + zookeeperAddr);  
    }  
}

因為 server 是需要依賴 zookeeper 作為元數據中心,所以在啟動之前需要先把 zookeeper 啟動起來。

此時就需要使用 testcontainer 來做支持了,使用它可以在單測的過程中使用 docker 啟動任意一個服務,這樣在 CI 中做集成測試就很簡單了。

圖片

我們日常使用的大部分中間件都是支持的,使用起來也很簡單。

先添加相關的依賴:

<dependencies>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.7.3</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.5.6</version>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter</artifactId>
        <version>5.10.2</version>
        <scope>test</scope>
    </dependency>
</dependencies>

然后在選擇我們需要依賴的服務,比如是 PostgreSQL:

<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>postgresql</artifactId>
    <version>1.19.8</version>
    <scope>test</scope>
</dependency>

然后在測試代碼中啟動相關的服務

class CustomerServiceTest {

  static PostgreSQLContainer<?> postgres = new PostgreSQLContainer<>(
    "postgres:16-alpine"
  );

  CustomerService customerService;

  @BeforeAll
  static void beforeAll() {
    postgres.start();
  }

  @AfterAll
  static void afterAll() {
    postgres.stop();
  }

  @BeforeEach
  void setUp() {
    DBConnectionProvider connectionProvider = new DBConnectionProvider(
      postgres.getJdbcUrl(),
      postgres.getUsername(),
      postgres.getPassword()
    );
    customerService = new CustomerService(connectionProvider);
  }

通常情況下我們都是需要獲取這些中間件的鏈接,比如 IP 端口啥的。

org.testcontainers.containers.ContainerState#getHost
org.testcontainers.containers.ContainerState#getMappedPort

通常是通過這兩個函數來獲取對應的 IP 和端口。

集成

@Container  
RedisContainer redis = new RedisContainer(DockerImageName.parse("redis:7.4.0"));  
  
public void startRoute() {  
    redis.start();  
    SpringApplication route = new SpringApplication(RouteApplication.class);  
    String[] args = new String[]{  
            "--spring.data.redis.host=" + redis.getHost(),  
            "--spring.data.redis.port=" + redis.getMappedPort(6379),  
            "--app.zk.addr=" + super.getZookeeperAddr(),  
    };    
    route.setAdditionalProfiles("route");  
    route.run(args);  
}

對于 route 來說不但需要 zookeeper 還需要 Redis 來存放用戶的路由關系,此時就還需要運行一個 Redis 的容器,使用方法同理。

最后就需要以 springboot 的方式將這兩個應用啟動起來,我們直接創建一個 SpringApplication 對象,然后將需要修改的參數通過 --varname=value 的形式將數據傳遞進去。

還可以通過 setAdditionalProfiles() 函數指定當前應用運行的 profile,這樣我們就可以在測試目錄使用對應的配置文件了。

圖片圖片

route.setAdditionalProfiles("route");

比如我們這里設置為 route 就可以使用 application-route.yaml 作為 route 的配置文件啟動,就不用每個參數都通過 -- 傳遞了。

private void login(String userName, int port) throws Exception {  
    Long userId = super.registerAccount(userName);  
    SpringApplication client = new SpringApplication(CIMClientApplication.class);  
    client.setAdditionalProfiles("client");  
    String[] args = new String[]{  
            "--server.port=" + port,  
            "--cim.user.id=" + userId,  
            "--cim.user.userName=" + userName  
    };  
    client.run(args);  
}  
  
@Test  
public void olu() throws Exception {  
    super.startServer();  
    super.startRoute();  
    this.login("crossoverJie", 8082);  
    this.login("cj", 8182);  
    MsgHandle msgHandle = SpringBeanFactory.getBean(MsgHandle.class);  
    msgHandle.innerCommand(":olu");  
    msgHandle.sendMsg("hello");  
}

我們真正要測試的其實是客戶端的功能,只要客戶端功能正常,說明 server 和 route 也是正常的。

比如這里的 olu(oline user) 的測試流程是:

  • 啟動 server 和 route
  • 登錄注冊兩個賬號
  • 查詢出所有用戶
  • 發送消息

最終的測試結果如下,符合預期。

圖片圖片

碰到的問題

應用分層

不知道大家注意到剛才測試代碼存在的問題沒有,主要就是沒法斷言。

因為客戶端、route、server 都是以一個應用的維度去運行的,沒法獲取到一些關鍵指標。

比如輸出在線用戶,當客戶端作為一個應用時,在線用戶就是直接打印在了終端,而沒有直接暴露一個接口返回在線數據;收發消息也是同理。

其實在應用內部這些都是有接口的,但是作為一個整體的 springboot 應用就沒有提供這些能力了。

本質上的問題就是這里應該有一個 client-sdk 的模塊,client 也是基于這個 sdk 實現的,這樣就可以更好的測試相關的功能了。

之后就準備把 sdk 單獨抽離一個模塊,這樣可以方便基于這個 sdk 實現不同的交互,甚至做一個 UI 界面都是可以的。

編譯失敗

還有一個問題就是我是直接將 client/route/server 的依賴集成到 integration-test 模塊中:

<dependency>  
  <groupId>com.crossoverjie.netty</groupId>  
  <artifactId>cim-server</artifactId>  
  <version>${project.version}</version>  
  <scope>compile</scope>  
</dependency>  
  
<dependency>  
  <groupId>com.crossoverjie.netty</groupId>  
  <artifactId>cim-forward-route</artifactId>  
  <version>${project.version}</version>  
  <scope>compile</scope>  
</dependency>  
  
<dependency>  
  <groupId>com.crossoverjie.netty</groupId>  
  <artifactId>cim-client</artifactId>  
  <version>${project.version}</version>  
  <scope>compile</scope>  
</dependency>

在 IDEA 里直接點擊測試按鈕是可以直接運行這里的測試用例的,但是想通過 mvn test 時就遇到了問題。

圖片圖片

會在編譯期間就是失敗了,我排查了很久最終發現是因為這三個模塊應用使用了springboot 的構建插件:

<plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 <executions>
  <execution>
   <goals>
    <goal>repackage</goal>
   </goals>
  </execution>
 </executions>
</plugin>

這幾個模塊最終會被打包成一個 springboot 的 jar 包,從而導致 integration-test 在編譯時無法加載進來從而使用里面的類。

暫時沒有找到好的解決辦法,我就只有把這幾個插件先去掉,需要打包時再手動指定插件。

mvn clean package spring-boot:repackage -DskipTests=true

其實這里的本質問題也是沒有分層的結果,最好還是依賴 route 和 server 的 SDK 進行測試。

現在因為有了測試的 CI 也歡迎大家來做貢獻,可以看看這里的 help want,有一些簡單易上手可以先搞起來。

圖片圖片

https://github.com/crossoverJie/cim/issues/135

參考鏈接:

  • https://github.com/crossoverJie/cim/pull/140
  • https://github.com/crossoverJie/cim/pull/144
責任編輯:武曉燕 來源: crossoverJie
相關推薦

2023-07-26 13:11:21

ChatGPT平臺工具

2024-07-10 08:26:02

開源項目測試

2023-04-26 00:41:36

A/B測試郵件數量

2024-01-19 08:25:38

死鎖Java通信

2024-10-07 09:12:33

2022-07-11 09:00:37

依賴配置文件Mybati

2024-08-07 08:40:46

2023-12-07 07:03:09

2023-04-14 09:04:07

測試TDBF單元測試

2023-01-26 00:28:45

前端測試技術

2023-03-17 16:44:44

Channel進程模型

2023-01-28 10:40:56

Java虛擬機代碼

2024-11-29 08:53:46

2022-07-08 09:27:48

CSSIFC模型

2023-01-10 08:43:15

定義DDD架構

2024-02-04 00:00:00

Effect數據組件

2025-01-14 08:32:55

JWT令牌.NET

2024-09-10 10:34:48

2024-05-10 08:00:48

K8soperatorGitHub

2024-08-09 08:17:07

SSH服務器架構
點贊
收藏

51CTO技術棧公眾號

中国毛片直接看| 一级在线免费视频| 天天操天天舔天天干| 国产一区导航| 中文字幕视频一区二区在线有码| 99re6在线观看| 福利网站在线观看| 国产欧美精品一区二区色综合朱莉| 国产精品一二三在线| 久久久一区二区三区四区| 蜜桃成人av| 日韩一区二区三区av| 欧美日韩二三区| 看黄网站在线| 久久免费偷拍视频| 成人区精品一区二区| 五月激情丁香网| 欧美午夜不卡| 日韩网站免费观看高清| 亚洲精品乱码久久久久久久| 亚洲日韩中文字幕一区| 高跟丝袜欧美一区| 99er在线视频| 青青青青在线| 国产亚洲欧美色| 精品日本一区二区| 国产成年妇视频| 日本视频在线一区| 88xx成人精品| 18精品爽视频在线观看| 99免费精品| 亚洲欧美色图片| 国产综合内射日韩久| 欧美一区二区三区婷婷| 欧美午夜片在线免费观看| 在线观看成人免费| 在线观看免费版| 国产视频一区二区在线观看| 国产另类自拍| 亚洲黄色在线免费观看| 国内精品久久久久影院色| 国产精品爱啪在线线免费观看| 日韩欧美大片在线观看| 欧美激情精品久久久六区热门| 日韩在线视频国产| 久久久久久久毛片| 女厕嘘嘘一区二区在线播放| 日韩久久久精品| 性鲍视频在线观看| 国产激情一区| 91精品一区二区三区久久久久久| 亚洲少妇久久久| 粉嫩91精品久久久久久久99蜜桃| 色哟哟国产精品免费观看| 日韩精品―中文字幕| 91超碰在线| 精品毛片网大全| 18禁免费观看网站| 麻豆免费版在线观看| 亚洲国产精品久久人人爱| 日本a在线天堂| 中文字幕在线播放网址| 亚洲综合一区二区三区| 丁香婷婷综合激情| av中文在线资源库| 狠狠干狠狠久久| 免费男同深夜夜行网站| jvid一区二区三区| 7777精品伊人久久久大香线蕉经典版下载| 国产原创精品在线| 中文成人在线| 欧美一区二区在线免费观看| 任你躁av一区二区三区| 日本一区二区三区播放| 精品成人a区在线观看| 欧美激情精品久久久久久| 久久99精品久久久久久水蜜桃| 人妻精品一区一区三区蜜桃91| 成人黄色大片在线观看| 九九九九九九精品| 国产二区视频在线观看| √…a在线天堂一区| 看一级黄色录像| 大桥未久在线视频| 在线视频国内一区二区| 国产成人美女视频| 中文字幕一区二区三区日韩精品| 亚洲国产三级网| 国产亚洲精品熟女国产成人| 91精品国产调教在线观看| 久久91亚洲精品中文字幕奶水| www.国产成人| 日本欧美在线观看| 懂色一区二区三区av片| 日本福利片在线| 亚洲人成网站影音先锋播放| www精品久久| 精品成人av| 日韩精品一区二区三区中文精品| 精品无码人妻一区| 一区二区影院| 国产97人人超碰caoprom| 国产精品一区二区人人爽| 成+人+亚洲+综合天堂| 香蕉久久夜色| 欧美调教sm| 欧美精品在欧美一区二区少妇 | 亚洲免费网址| 成人精品久久av网站| 午夜性色福利影院| av免费不卡| 国产精品久久久久一区二区三区| 欧美极品少妇无套实战| 日本精品网站| 亚洲激情电影中文字幕| 国产老头老太做爰视频| 久久精品女人天堂| 国产精品一级久久久| 69久久久久| 色综合av在线| 亚洲色图欧美日韩| 91高清一区| 国产精品一二三在线| 爽爽视频在线观看| 亚洲h在线观看| 青青草原播放器| 日韩精品91| 国产97免费视| 黄色网址在线播放| 福利微拍一区二区| 亚洲久久久久久| 激情综合自拍| 99视频免费观看| www.久久ai| 4438x成人网最大色成网站| 中文字幕 自拍| 国产日韩一区二区三区在线| 国产高清一区视频| 手机av在线播放| 日韩一区二区电影| 国产极品国产极品| 国产在线日韩欧美| 激情五月五月婷婷| 粉嫩av国产一区二区三区| 中文字幕日韩av综合精品| aaaaaa毛片| 久久久久久久一区| 黄色高清无遮挡| 国产一区二区三区站长工具| 国产aⅴ夜夜欢一区二区三区| 午夜视频免费在线| 亚洲妇熟xx妇色黄| 网站免费在线观看| 亚洲影音一区| 欧美亚洲另类在线一区二区三区| 欧美91看片特黄aaaa| 亚洲码在线观看| 日韩av免费播放| 国产精品国产自产拍高清av王其| 超碰在线公开97| 99精品美女| 亚洲va欧美va国产综合久久| 七七久久电影网| 欧美精品一区二区久久婷婷| 男女视频免费看| 久久蜜桃av一区二区天堂 | 在线观看天堂av| 精品一区二区在线视频| gogogo免费高清日本写真| 欧美日韩国产一区二区在线观看| 欧美高跟鞋交xxxxxhd| 不卡视频免费在线观看| 亚洲va欧美va天堂v国产综合| 国产精品九九九九九| 日韩高清电影一区| 在线无限看免费粉色视频| 亚州一区二区| 日本亚洲欧洲色| 自拍视频在线| 精品国产免费一区二区三区香蕉| 日韩精品久久久久久久| 国产欧美视频在线观看| 日韩欧美色视频| 国产精品色网| 曰韩不卡视频| 精品深夜福利视频| 国产精品专区第二| 黄色在线观看视频网站| 一本一本久久a久久精品牛牛影视| 亚洲专区第一页| 香蕉影视欧美成人| xxxxx99| 国产suv精品一区二区三区| 国产l精品国产亚洲区久久| 欧美疯狂party性派对| 国产精品视频500部| av成人亚洲| 国语自产精品视频在免费| 91社区在线| 亚洲精品久久久久中文字幕二区| 岳乳丰满一区二区三区| 亚洲国产精品久久一线不卡| 亚洲综合久久av一区二区三区| 99视频热这里只有精品免费| 亚洲一区二区三区观看| 亚洲免费一区二区| 成人国产在线看| 成人国产精品一级毛片视频| 国产精品一区二区三区在线 | 国产伦精品一区二区三毛| 美女网站视频一区| 国内精品久久影院| huan性巨大欧美| 日韩亚洲欧美中文在线| 日本一区高清| 精品国产凹凸成av人导航| 亚洲天堂777| 欧美性极品xxxx做受| 久草中文在线视频| 亚洲天堂2014| 香蕉久久久久久久| 久久天天做天天爱综合色| 欧美一级大片免费看| 久久国内精品自在自线400部| 各处沟厕大尺度偷拍女厕嘘嘘| 女人色偷偷aa久久天堂| 在线观看国产一区| blacked蜜桃精品一区| 久久亚洲国产精品日日av夜夜| 无人区乱码一区二区三区| 国产精品欧美久久久| 欧美一区国产| 奇米影视亚洲狠狠色| 暧暧视频在线免费观看| 久久久久久久色| sqte在线播放| 久久频这里精品99香蕉| 久久青青色综合| 久久97精品久久久久久久不卡| 日本中文字幕电影在线免费观看| 中文字幕国产精品久久| 最新国产在线观看| 色午夜这里只有精品| 91大神在线网站| 最近日韩中文字幕中文| 成a人片在线观看www视频| 国产午夜精品一区二区三区| 国产精品麻豆一区二区三区| 亚洲天堂2020| 成人免费视频| 日韩中文字幕av| 日韩在线资源| 久久久电影免费观看完整版| a毛片在线观看| 欧美风情在线观看| 77thz桃花论族在线观看| 91国内揄拍国内精品对白| 亚洲最大成人| 国产精品啪视频| 免费一区二区三区在线视频| 999视频在线免费观看| 99这里只有精品视频| 精品一区二区国产| 国产剧情在线观看一区| 亚洲二区自拍| 亚洲精品在线观看91| 成人免费在线视频播放| 亚洲激情网站| 成人在线免费播放视频| 久久99热国产| 91亚洲一线产区二线产区| 97国产一区二区| xxxxx99| 一区二区三区在线视频播放| 日本五十路女优| 91福利资源站| 国产99久久九九精品无码免费| 精品国产网站在线观看| 裸体xxxx视频在线| 俺去了亚洲欧美日韩| 福利小视频在线| 国产精品久久久久久久久久东京 | 精精国产xxxx视频在线野外| 日韩免费在线看| 国产欧美视频在线| 国产日韩一区欧美| 日本不卡二三区| 日韩 欧美 视频| 热久久免费视频| 亚洲午夜久久久久久久久| 国产片一区二区三区| 日本中文字幕免费在线观看| 精品女厕一区二区三区| 一二三区中文字幕| 亚洲黄色www| 香蕉视频免费在线播放| 久久久久久美女| 欧美高清你懂的| 久久精品美女| 一级欧洲+日本+国产| 久久精品视频91| kk眼镜猥琐国模调教系列一区二区| 蜜桃久久精品成人无码av| 亚洲一区二区三区在线播放| 中文字幕黄色av| 亚洲精品白浆高清久久久久久| 麻豆视频免费在线观看| 91国产在线精品| 91午夜精品| 懂色av一区二区三区四区五区| 午夜一区二区三区不卡视频| 中国男女全黄大片| 国产精品青草久久| 91精品国产高清一区二区三密臀| 欧美一区二区三区小说| 成年人视频在线免费观看| 97色在线视频观看| 51vv免费精品视频一区二区| 日韩中文一区二区三区| 亚洲看片免费| 国产人妖在线观看| 日韩久久一区二区| 影音先锋成人资源网站| 老司机99精品99| 国产成人一区二区| 精品国内亚洲2022精品成人| 六月婷婷激情网| 美国一区二区三区在线播放 | 高h放荡受浪受bl| 久久久999成人| 男人亚洲天堂| 视频一区视频二区视频三区视频四区国产 | 国模一区二区| 欧美乱偷一区二区三区在线| 夜夜嗨av一区二区三区网站四季av| 在线成人精品视频| 亚洲精品亚洲人成人网| 99热这里精品| 欧美成人亚洲成人| 午夜日韩影院| 妞干网视频在线观看| 国产成人精品免费视频网站| 欧美成人综合色| 精品日韩一区二区三区| 天堂av最新在线| 97超级在线观看免费高清完整版电视剧| 日韩中文在线电影| www.久久av.com| 亚洲精品美腿丝袜| 精品人妻午夜一区二区三区四区 | 2020国产精品小视频| 成年人免费观看的视频| 国内久久精品视频| 黄色片在线观看网站| 日韩精品影音先锋| 咪咪网在线视频| 日本成人三级| 免费观看30秒视频久久| 色哟哟一一国产精品| 91麻豆精品国产| av手机免费在线观看| 久久久一本精品99久久精品66 | 日本一区二区在线播放| 欧美久久综合网| 最新av免费在线观看| 一区二区三区精品在线观看| 亚洲精品福利网站| 欧美亚洲第一区| 日韩欧美一区免费| 无套白嫩进入乌克兰美女| 亚洲韩国精品一区| 免费观看成年在线视频网站| 国产精品入口尤物| 欧美freesex交免费视频| 国产精品入口麻豆| 色婷婷综合久久久中文一区二区| 69久久精品| 国产视频不卡| 日本欧美一区二区在线观看| 四虎永久免费在线| 亚洲精品国产免费| 欧美成a人片免费观看久久五月天| 草草草视频在线观看| 久久婷婷久久一区二区三区| 一区二区视频网| 久久久久久久久久久免费精品| 国产91精品对白在线播放| 中文字幕第17页| 天天影视色香欲综合网老头| av在线中文| 国内精品久久久久久久果冻传媒| 日本欧美在线观看| 日本在线视频中文字幕| 神马国产精品影院av| 精品国产18久久久久久洗澡| 污视频网址在线观看| 亚洲成av人综合在线观看| 999国产在线视频| 裸模一区二区三区免费| 极品少妇一区二区三区精品视频|