You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中Mock gRPC服务端测试客户端(无需修改客户端代码)

解决方案:无需修改Actor代码Mock gRPC服务端

方法一:用grpcio-testing创建无端口Mock服务

grpcio-testing确实文档示例少,但可以通过猴子补丁替换Stub的初始化逻辑,让Actor创建的Stub自动使用测试通道,完全不用改Actor代码:

  1. 导入依赖模块(替换成你的实际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类
  1. 定义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())
  1. 猴子补丁替换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
  1. 正常使用Actor即可
# 这里的主机端口随便填,不会被实际使用
actor = YourActor(host="dummy", port="1234")
response = actor.call_grpc_service()  # 假设Actor有这个调用gRPC的方法
print(response.message)  # 会输出Mock的响应内容

方法二:启动临时本地Mock服务(用真实端口)

如果觉得猴子补丁不够直观,可以启动一个真实的本地临时gRPC服务,让Actor连接这个端口,同样不用改Actor代码:

  1. 定义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}!")
  1. 测试时启动临时服务
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服务,减少重复代码:

  1. 先安装插件
pip install pytest-grpc
  1. 编写测试用例
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:40:38