全
我有一个用go编写的服务,它通过gRPC协议与其他几个服务进行通信。我想为我的服务编写集成测试,但是,我没有可能使用真正的依赖关系。
因此,我需要以某种方式来模拟依赖关系。
对我来说,一个完美的场景是这样的:
我试着使用https://github.com/jekiapp/gripmock,但它不支持所有的原型语法。
有什么能解决我的问题吗?也许我完全错了,并且有一些用于服务通信gRPC集成测试的最佳实践
发布于 2018-12-21 11:05:10
您可以通过将您的所有服务都定义在一个坞-组合文件中来改善您的环境。您应该在文件中添加您想要测试的服务。在将其拆分之后,您可以在要测试的服务中运行集成测试。
示例docker-组合文件:
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-组合文件中,这样您就可以在集成测试中向它们发送请求。一定要在环境变量中添加这些服务端点,以便可以覆盖发送请求的端点。
例如,为了在数据库中重置数据,可以编写夹具。这些固定装置只是用来重置数据库、缓存等数据的辅助函数。
发布于 2019-02-12 14:00:45
发布于 2019-01-02 04:01:05
我只是合并了一些补丁来覆盖大部分protobuf声明。我建议你检查一下。
已知问题:它仍然不能解析具有方法体声明的原型。
https://stackoverflow.com/questions/53882312
复制相似问题