如何编写GRPC python单元测试

时间:2017-06-23 09:37:26

标签: python python-3.x grpc

我们使用grpc作为所有内部系统的RPC协议。大多数系统都是用Java编写的。

在Java中,我们可以使用InprocessServerBuilder进行单元测试。但是,我还没有在Python中找到类似的类。

任何人都可以提供如何在python中进行GRPC unittest的示例代码吗?

3 个答案:

答案 0 :(得分:4)

你今天提出这个问题是多么偶然; our unit test framework just entered code review。因此,目前测试的方法是use the full production stack to connect your client-side and server-side code(或违反API并模拟许多内部内容),但希望在几天到几周内,您可以获得更好的解决方案。

答案 1 :(得分:0)

我发现pytest-grpc很容易理解,并且可以在几分钟内实现。

src:https://pypi.org/project/pytest-grpc/

答案 2 :(得分:0)

一些入门示例代码:

proto

syntax = "proto3";

service Library {
    rpc Search (Request) returns (Response);
}

message Request {
    string id = 1;
}

message Response {
    string status = 1;
}

python单元测试

#!/usr/bin/env python
# coding=utf-8

import unittest

from grpc import StatusCode
from grpc_testing import server_from_dictionary, strict_real_time
from proto import rpc_pb2

class TestCase(unittest.TestCase):

    def __init__(self, methodName) -> None:
        super().__init__(methodName)

        servicers = {
            rpc_pb2.DESCRIPTOR.services_by_name['Library']: LibraryServicer()
        }
        self.test_server = server_from_dictionary(
            servicers, strict_real_time())

    def test_search(self):
        request = rpc_pb2.Request(
            id=2,
        )
        method = self.test_server.invoke_unary_unary(
            method_descriptor=(rpc_pb2.DESCRIPTOR
                .services_by_name['Library']
                .methods_by_name['Search']),
            invocation_metadata={},
            request=request, timeout=1)

        response, metadata, code, details = method.termination()
        self.assertTrue(bool(response.status))
        self.assertEqual(code, StatusCode.OK)

if __name__ == '__main__':
    unittest.main()