精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲国产精品久久久久婷蜜芽| 国产精品久久久久久久久久99 | 成人免费高清在线播放| 欧美一区二区三区免费看| 日韩一区二区三区四区五区六区 | 亚洲 美腿 欧美 偷拍| 欧美一区二区| 日韩av在线不卡| 成人免费视频久久| 久久综合网导航| 成人午夜在线播放| 97人人爽人人喊人人模波多| 女人被狂躁c到高潮| 亚洲成人看片| 亚洲免费在线看| 鲁丝一区二区三区免费| 中文字幕在线视频第一页| 国产精品久久久久久麻豆一区软件| 日韩午夜在线影院| 成人在线激情网| 国产剧情在线| 久久日韩粉嫩一区二区三区| 国产一区视频在线| 黄色激情小视频| 国产精品中文字幕制服诱惑| 欧美午夜寂寞影院| a级片一区二区| 国产精品四虎| 成人免费不卡视频| 国产精品网站入口| 黄色激情视频在线观看| 青青草国产免费一区二区下载| 日韩视频永久免费| 啊啊啊国产视频| 92久久精品| 成人欧美一区二区三区黑人麻豆| 国产精品亚洲不卡a| 在线观看国产区| 亚洲精品1234| 欧美成人国产va精品日本一级| 亚洲区自拍偷拍| 国产一区二区av在线| 日本道免费精品一区二区三区| 草草草视频在线观看| 国产福利在线| 91免费精品国自产拍在线不卡| 亚洲a∨日韩av高清在线观看| 欧美精品韩国精品| 在线国产欧美| 色综合久久88色综合天天看泰| 亚洲最大成人网站| 成人影院中文字幕| 欧美一区二区三区白人| 久久精品视频91| 免费成人在线电影| 亚洲一区二区三区四区在线| 一区二区日本伦理| 日本精品999| 岛国一区二区在线观看| 91免费在线视频| 中文字幕人妻一区二区在线视频| 久久午夜激情| 日产精品久久久一区二区福利| 日韩欧美亚洲视频| 图片小说视频色综合| 夜夜躁日日躁狠狠久久88av| 国产三区精品| 国产精品视频久久久久久| 天堂资源在线中文精品| 欧美专区第一页| 蜜臀99久久精品久久久久小说| 日本欧美韩国一区三区| 国产精品爽爽爽爽爽爽在线观看| 亚洲图片中文字幕| 韩国av一区二区三区四区| 亚洲影视中文字幕| 人妻一区二区三区四区| 91麻豆123| 日日噜噜噜噜夜夜爽亚洲精品| 天堂地址在线www| 一区二区激情小说| 欧美亚洲另类色图| 欧美成人福利| 精品国产91亚洲一区二区三区婷婷 | 疯狂撞击丝袜人妻| 亚洲二区三区不卡| 久久久免费观看| 日韩欧美在线观看免费| 蜜桃一区二区三区在线观看| 97伦理在线四区| 视频二区在线| 成人免费小视频| 玩弄中年熟妇正在播放| 久久91视频| 亚洲第一精品夜夜躁人人爽| 午夜时刻免费入口| 欧美成人国产| 国产精品久久精品| 亚洲av综合色区无码一二三区| 久久老女人爱爱| 91看片淫黄大片91| 毛片无码国产| 日韩精品一区二区在线| 一级黄色片网址| 亚洲一级特黄| 国产一区二区丝袜| 牛牛澡牛牛爽一区二区| 国产精品亚洲午夜一区二区三区| 国产一区二区三区四区五区在线| se在线电影| 亚洲3atv精品一区二区三区| 不卡的av中文字幕| 老牛精品亚洲成av人片| 久久久精品国产网站| 美国美女黄色片| 一区免费视频| 成人av在线亚洲| 毛片免费在线观看| 亚洲国产成人av网| 日韩 国产 一区| 精品视频免费| 欧美在线中文字幕| 亚洲国产一二三区| 亚洲三级免费电影| 超碰在线人人爱| 免费久久精品| 69av在线视频| 日日躁夜夜躁白天躁晚上躁91| 久久亚洲精华国产精华液 | 欧美日本一区二区三区四区| 全黄一级裸体片| 亚洲毛片网站| 福利精品视频| 美女日批视频在线观看| 337p亚洲精品色噜噜噜| 亚洲最大成人综合网| 一区二区日韩免费看| 国产精品一区二区在线观看| 欧美理论片在线播放| 日韩欧美一区二区视频| 国产色无码精品视频国产| 久久精品国产久精国产| 天天人人精品| 国产资源一区| 中文字幕欧美精品日韩中文字幕| 日韩高清免费av| 成人丝袜18视频在线观看| av动漫在线免费观看| 欧美一级片网址| 精品自在线视频| 亚洲国产www| 亚洲国产欧美在线| 五月天丁香社区| 99精品国产一区二区青青牛奶| 国产精品久久久久久久久久久久午夜片| 日本在线视频网址| 亚洲成年网站在线观看| 国产无遮挡裸体免费视频| 99久久国产综合精品色伊| 国产免费黄色小视频| 欧美挤奶吃奶水xxxxx| 国产91成人video| 福利在线播放| 91麻豆精品国产91久久久久 | 岛国大片在线观看| 欧美吻胸吃奶大尺度电影| 日韩黄色中文字幕| 久久91精品久久久久久秒播| 日本丰满大乳奶| 9l视频自拍蝌蚪9l视频成人| 韩剧1988在线观看免费完整版| 深夜福利在线视频| 欧美性videosxxxxx| 欧美激情精品久久久久久免费| 国产精品1区二区.| 国产综合中文字幕| 国产一区二区三区91| 91久久国产婷婷一区二区| 日韩经典av| 亚洲精品日韩欧美| 国产精品欧美久久久久天天影视| 一区二区高清视频在线观看| 人妻无码中文久久久久专区| 久久美女性网| 先锋影音男人资源| 六月丁香久久丫| 国产成人一区二区在线| 九七久久人人| 日韩激情在线视频| 中文字幕人妻互换av久久| 夜夜精品视频一区二区| 亚洲做受高潮无遮挡| 国产乱子伦一区二区三区国色天香| 久久亚洲精品无码va白人极品| 国产一区二区电影在线观看| 超碰97国产在线| xx欧美视频| 欧美片一区二区三区| 国模吧精品人体gogo| 日韩欧美国产一区在线观看| 99久久久无码国产精品免费蜜柚| 亚洲激情第一区| 摸摸摸bbb毛毛毛片| 成人午夜电影网站| 亚洲欧洲日本精品| 99pao成人国产永久免费视频| 一区二区三区视频| 综合色就爱涩涩涩综合婷婷| 成人免费视频观看视频| 91亚洲精品| 国外视频精品毛片| 久久五月精品| 日日骚久久av| 飘雪影视在线观看免费观看 | 国产av一区二区三区传媒| 蜜臀av一级做a爰片久久| 无码人妻丰满熟妇区96| 重囗味另类老妇506070| 亚洲国产一区二区三区在线播| 欧美综合精品| 国产伦精品一区二区三区高清| 日韩三级成人| 国产精品久久精品| 香蕉伊大人中文在线观看| 久久久久久尹人网香蕉| 中文字幕免费高清电视剧网站在线观看 | 国产精品美女www爽爽爽视频| h片在线观看下载| 欧美日韩999| av片在线观看网站| 中文字幕在线成人| 高清日韩av电影| 亚洲欧美在线一区| 日本免费一区二区三区最新| 亚洲国产黄色片| 黄色小视频免费在线观看| 日韩视频免费直播| 99久久国产免费| 日韩亚洲国产中文字幕欧美| 99re只有精品| 欧美成人三级在线| 午夜精品久久久久久久91蜜桃| 日韩一区和二区| a级片在线视频| 欧美一级夜夜爽| 成人免费一级视频| 日韩精品一区二区三区在线| 精品人妻无码一区二区三区蜜桃一| 欧美精品乱人伦久久久久久| 国产毛片毛片毛片毛片毛片| 日韩一区二区三区四区| 黄色小视频免费观看| 亚洲国产日韩欧美在线99| 三级网站在线看| 精品无人区乱码1区2区3区在线| 五月天婷婷在线观看| 日韩av在线天堂网| 日本天堂影院在线视频| 亚洲偷熟乱区亚洲香蕉av| fc2在线中文字幕| 久久偷看各类女兵18女厕嘘嘘| 超碰免费公开在线| 欧美国产日韩一区二区| 波多野结衣在线播放| 欧美中文字幕第一页| 成人精品动漫| 亚洲va久久久噜噜噜| 伊人久久大香线蕉av超碰| 国产精品伊人日日| 国产一区二区欧美| 欧美日韩视频免费在线观看| 韩日欧美一区| 久草精品在线播放| 加勒比av一区二区| 国内精品免费视频| 久久婷婷国产综合精品青草| 懂色av粉嫩av蜜臀av一区二区三区| 亚洲欧美日韩电影| 国产又色又爽又黄的| 欧美日韩国产免费一区二区 | jiyouzz国产精品久久| 中文字幕国产专区| 亚洲人成网站精品片在线观看| 久久精品视频8| 在线看日韩精品电影| 99久久一区二区| 日韩高清av在线| 色的视频在线免费看| 欧美精品电影免费在线观看| 欧美magnet| 99国精产品一二二线| 视频一区欧美| 欧美大黑帍在线播放| 天堂一区二区在线| 国产成人av片| 国产欧美日韩另类一区| 久久久久久天堂| 欧美午夜一区二区三区| 亚洲精品视频91| 少妇高潮久久久久久潘金莲| 超碰在线cao| 91久久久国产精品| 亚洲制服欧美另类| 成年在线观看视频| 日韩**一区毛片| 污污污www精品国产网站| 国产精品久久久久久久久图文区| 国产成人亚洲精品自产在线| 欧美日韩成人一区二区| 欧美女子与性| 久久久亚洲影院你懂的| 四虎影视国产精品| 免费一区二区三区在在线视频| 欧美精品成人| 中文字幕亚洲影院| 亚洲国产精品黑人久久久| 欧美日韩精品区| 日韩午夜在线影院| 国产日产一区二区| 国产美女被下药99| 嫩草影视亚洲| 日韩av在线播放不卡| 国产精品亚洲а∨天堂免在线| 一二三四国产精品| 一本一道综合狠狠老| 日本黄色三级视频| 欧美精品久久一区二区| 欧美一级片网址| 精品国产一区二区三区在线| 美国三级日本三级久久99| 蜜乳av中文字幕| 色网站国产精品| 欧美成熟毛茸茸| 日本精品性网站在线观看| 精品视频在线你懂得| 久青草视频在线播放| 国产一区二区在线看| 成人做爰视频网站| 欧美日韩精品是欧美日韩精品| 91亚洲欧美| 国产欧美亚洲精品| 日韩精品电影| 青青草原国产在线视频| 国产精品久久久久久久久动漫| 午夜视频网站在线观看| 综合激情国产一区| 精品亚洲a∨| 亚洲图片在线观看| 久久国产精品第一页| 日韩三级久久久| 欧美一区二区国产| 日韩伦理av| 精品在线观看一区二区| 老牛嫩草一区二区三区日本| 国产真人做爰视频免费| 欧美日韩中文字幕一区二区| 欧美精品电影| 91一区二区三区| 亚洲免费大片| 熟女高潮一区二区三区| 欧美日韩综合在线| 成人黄色在线电影| 国产精品久久亚洲7777| 亚洲在线成人| 纪美影视在线观看电视版使用方法| 欧美日韩精品系列| 国产黄色大片在线观看| 蜜桃传媒一区二区| 美女免费视频一区二区| 一区二区三区四区五区| 亚洲福利视频网站| 性感美女一区二区在线观看| 亚洲一一在线| 成人久久久精品乱码一区二区三区| 国产精品美女久久久久av爽| 国产亚洲精品美女久久久| 久久国产精品美女| 女人天堂av手机在线| 国产精品免费丝袜| 亚洲av无码一区二区乱子伦| 日本高清+成人网在线观看| 欧美国产小视频| 毛片在线视频播放| 久久久久久免费毛片精品| 91tv国产成人福利| 午夜精品久久久久久久久久久久久 | 中文字幕在线视频久| 中日韩在线视频| 99久久精品国产毛片| 亚洲图片欧美在线| 97欧美精品一区二区三区| 99精品在线观看| 喷水视频在线观看| 欧美日韩三级在线| 91超碰在线播放| 日本黄色a视频| 久久蜜桃香蕉精品一区二区三区| 国产手机精品视频| 日韩免费在线看| 亚洲日本视频|