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

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

如何模擬 gRPC api 以與 golang 進行集成測試

如何模擬 gRPC api 以與 golang 進行集成測試

Go
炎炎設計 2023-05-22 15:57:49
全部我有一個用 go 編寫的服務,它通過 gRPC 協議與其他幾個服務通信。我想為我的服務編寫集成測試,但是我不可能使用真正的依賴項。所以,我需要以某種方式模擬依賴關系。對我來說,一個完美的場景是這樣的:我可以運行模擬服務器并將其地址傳遞給我的應用程序而不是真正的依賴項我可以注冊對依賴服務的特定調用的預期響應我可以重置模擬服務器以在測試用例后拆除數據。我嘗試使用https://github.com/jekiapp/gripmock但它不支持所有的 protobuff 語法。什么可以幫助解決我的問題?也許我完全錯了,并且有用于通信 gRPC 的服務集成測試的最佳實踐
查看完整描述

2 回答

?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

您可以通過在 docker-compose 文件中定義所有服務來啟動您的環境。您還應該在 docker-compose 文件中添加要測試的服務。啟動后,您可以在要測試的服務中運行集成測試。


示例 docker-compose 文件:


version: '2.2'


services:

  service-you-want-to-test:

    build: .

    image: service-you-want-to-test

    container_name: service-you-want-to-test

    environment:

      - ENVIRONMENT=${ENVIRONMENT}

      - REDIS_ADDRESSES=[redis:6379]

      - SERVICE_YOU_DEPEND_ON_ENDPOINT=service-you-depend-on:8091

      - DB_HOST=mysql

      - DB_USER=root

    links:

      - redis

      - mysql

      - service-you-depend-on

    depends_on:

      mysql:

        condition: service_healthy

    ports:

      - 8090:8090


  service-you-depend-on:

    image: service-you-depend-on:latest

    container_name: service-you-depend-on

    environment:

      - DB_HOST=mysql

      - DB_USER=root

    links:

      - redis

      - mysql

    depends_on:

      mysql:

        condition: service_healthy

    ports:

      - 8091:8091


  mysql:

    image: mysql:5.7

    container_name: mysql

    environment:

      MYSQL_ALLOW_EMPTY_PASSWORD: "true"

    volumes:

    - ./.docker/mysql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro

    - ./.docker/mysql/healthcheck-5.7:/var/www/healthcheck

    healthcheck:

      test: "/var/www/healthcheck"

      interval: 5s

      timeout: 5s

      retries: 5

    ports:

    - 3306:3306


  redis:

    image: redis:3.2

    container_name: redis

    ports:

      - 6379:6379

要設置集成環境,您可以使用以下命令:


CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

docker build -t service-you-want-to-test .

docker-compose up -d redis mysql

docker-compose up -d --build service-you-want-to-test

運行上面的命令后,您可以通過命令行執行集成測試:


go test -v path/to/integration_tests/...

因此,您還應該將依賴的服務添加到 docker-compose 文件中,這樣您就可以在集成測試中實際向它們發送請求。請務必將這些服務端點添加到您的環境變量中,以便您可以覆蓋將請求發送到的端點。


為了重置您的數據,例如您的數據庫,您可以編寫固定裝置。fixtures 只是幫助函數來重置數據庫、緩存等的數據。


查看完整回答
反對 回復 2023-05-22
?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

在這種情況下您可以使用的另一個替代工具是Traffic Parrot。

我們最近在我們的服務虛擬化工具中添加了對 gRPC 的支持,該工具包括一個可用于定義模擬行為的用戶界面。

有一個教程介紹如何在給定原型文件的情況下通過網絡模擬 gRPC 響應。

您還可以在文檔中找到有關如何通過網絡進行記錄和重放的信息。

http://img1.sycdn.imooc.com//646b209900014ece06540415.jpg

http://img1.sycdn.imooc.com//646b20a400011e4006120301.jpg

http://img1.sycdn.imooc.com//646b20ae0001443805770283.jpg

查看完整回答
反對 回復 2023-05-22
?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

我只是合并了一些補丁來覆蓋大部分 protobuf 聲明。我建議你檢查一下。

已知問題:它仍然無法解析具有方法體聲明的 protobuf


查看完整回答
反對 回復 2023-05-22
  • 2 回答
  • 0 關注
  • 200 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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