Python中Mock gRPC服务端测试客户端(无需修改客户端代码)
解决方案:无需修改Actor代码Mock gRPC服务端
方法一:用grpcio-testing创建无端口Mock服务
grpcio-testing确实文档示例少,但可以通过猴子补丁替换Stub的初始化逻辑,让Actor创建的Stub自动使用测试通道,完全不用改Actor代码:
- 导入依赖模块(替换成你的实际gRPC服务模块)
import grpc from grpc_testing import server_from_dictionary, strict_real_time import helloworld_pb2 import helloworld_pb2_grpc from your_module import YourActor # 你的Actor类
- 定义Mock服务的响应逻辑
# 按你的gRPC服务定义,写Mock方法的返回逻辑 mock_service = { helloworld_pb2.DESCRIPTOR.services_by_name['Greeter']: { 'SayHello': lambda request, context: helloworld_pb2.HelloReply(message=f"Mock Hello, {request.name}!") } } # 创建无真实端口的测试gRPC服务器 test_server = server_from_dictionary(mock_service, strict_real_time())
- 猴子补丁替换Stub的通道
# 先保存Stub原来的初始化方法 original_stub_init = helloworld_pb2_grpc.GreeterStub.__init__ def patched_stub_init(self, channel): # 忽略Actor传入的主机端口,强制使用测试服务器的通道 original_stub_init(self, test_server.insecure_channel()) # 替换Stub的初始化逻辑 helloworld_pb2_grpc.GreeterStub.__init__ = patched_stub_init
- 正常使用Actor即可
# 这里的主机端口随便填,不会被实际使用 actor = YourActor(host="dummy", port="1234") response = actor.call_grpc_service() # 假设Actor有这个调用gRPC的方法 print(response.message) # 会输出Mock的响应内容
方法二:启动临时本地Mock服务(用真实端口)
如果觉得猴子补丁不够直观,可以启动一个真实的本地临时gRPC服务,让Actor连接这个端口,同样不用改Actor代码:
- 定义Mock服务实现
import grpc from concurrent import futures import helloworld_pb2 import helloworld_pb2_grpc class MockGreeter(helloworld_pb2_grpc.GreeterServicer): def SayHello(self, request, context): return helloworld_pb2.HelloReply(message=f"Mock Hello, {request.name}!")
- 测试时启动临时服务
def test_actor_mock_grpc(): # 启动本地服务,用0让系统分配随机端口 server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) helloworld_pb2_grpc.add_GreeterServicer_to_server(MockGreeter(), server) port = server.add_insecure_port('[::]:0') server.start() try: # 创建Actor时传入这个临时端口 actor = YourActor(host="localhost", port=str(port)) response = actor.call_grpc_service() assert response.message == "Mock Hello, Test!" finally: # 测试结束关闭服务 server.stop(0)
方法三:用pytest-grpc插件简化测试
pytest其实可以配合pytest-grpc插件快速创建Mock服务,减少重复代码:
- 先安装插件
pip install pytest-grpc
- 编写测试用例
import pytest import helloworld_pb2 from your_module import YourActor def test_actor_grpc_call(grpc_stub): # 配置Mock Stub的返回值 grpc_stub.SayHello.return_value = helloworld_pb2.HelloReply(message="Mock Hello, Pytest!") # 正常创建Actor,连接插件默认的本地端口 actor = YourActor(host="localhost", port="50051") response = actor.call_grpc_service() assert response.message == "Mock Hello, Pytest!"
插件会自动帮你启动、管理Mock服务,不用自己写服务启动停止的代码。
内容的提问来源于stack exchange,提问作者SalweTingh
相关产品推荐
相关产品推荐

