【问题标题】:How to write a GRPC python unittest如何编写 GRPC python unittest
【发布时间】:2017-11-26 20:03:26
【问题描述】:

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

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

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

【问题讨论】:

    标签: python python-3.x grpc


    【解决方案1】:

    你今天问这个问题真是太巧了; our unit test framework just entered code review。所以目前测试的方式是use the full production stack to connect your client-side and server-side code(或者违反API并模拟很多内部的东西),但希望在几天到几周内你可以使用更好的解决方案。

    【讨论】:

    • 我看到代码已经合并了。但是,我没有找到任何关于单元测试的更新文档。能否请您提供一些有关如何使用新类的代码示例?
    • 我不知道我能不能做到这一点,所以同时看看grpcio_tests/tests/testing/ - 单元测试框架本身的测试旨在看起来像一个示例应用程序并说明如何使用它。
    • 感谢您的工作 Nathan,您认为测试框架会有更新吗?我注意到由于 protobuf github.com/grpc/grpc/blob/… 中的问题,所有客户端/服务器测试都被跳过
    • @NathanielManistaAtGoogle 我看到 PR 已合并,但是,是否有一些文档解释了应该如何使用?
    • 似乎有一些文档:grpc.io/grpc/python/grpc_testing.html 但仍然是一件微不足道的事情。
    【解决方案2】:

    一些示例代码开始使用:

    原型

    syntax = "proto3";
    
    service MyLibrary {
        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
    import mylibrary_pb2
    
    class TestCase(unittest.TestCase):
    
        def __init__(self, methodName) -> None:
            super().__init__(methodName)
            
            myServicer = MyLibraryServicer()
            servicers = {
                mylibrary_pb2.DESCRIPTOR.services_by_name['MyLibrary']: myServicer
            }
            self.test_server = server_from_dictionary(
                servicers, strict_real_time())
    
        def test_search(self):
            request = mylibrary_pb2.Request(
                id=2,
            )
            method = self.test_server.invoke_unary_unary(
                method_descriptor=(mylibrary_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()
    

    【讨论】:

      【解决方案3】:

      我发现 pytest-grpc 很容易上手并在几分钟内就可以运行。

      源代码:https://pypi.org/project/pytest-grpc/

      【讨论】:

        猜你喜欢
        • 2023-03-08
        • 1970-01-01
        • 2021-09-20
        • 2016-07-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多