twisted中协议行为的高级测试

2024-09-29 17:20:24 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在twisted中编写协议的高级测试?你知道吗

我知道您可以使用StringTransport来测试低级协议的详细信息,例如,它接收到一些原始数据并发生了一些状态更改,或者它以某种方式响应:

factory = SomeFactory()
protocol = factory.buildProtocol("ignored")
trans = proto_helpers.StringTransport("foo", 1234)
protocol.makeConnection(trans)
# ...
protocol.dataReceived("RAW PROTOCOL DATA\n")
self.assertEquals("Hello World!\n", self.transport.value())

然而,wire协议现在并不那么重要。它在不断变化,我用放大器不必想太多。我现在要测试的是高级行为:

  • 建立连接后,确保协议通知GUI。你知道吗
  • 请求联系人列表,确保它发回我提供的联系人。你知道吗

等等。例如:

serverApp = FakeApplication()   # this contains application state
serverFactory = SomeFactory(serverApp)
testEndpoint = magic.TestEndpoint()   # this class doesn't exist
testEndpoint.listen(factory)

clientApp = FakeApplication()
clientFactory = SomeFactory(clientApp)
testEndpoint.otherSide.connect(clientFactory)

self.assertEquals(serverApp.nConnections, 1)
self.assertEquals(clientApp.nConnections, 1)

assert clientApp.onNewConnection.was_called()  # pseudo-code

缺少的是某种假端点或双向传输来连接两个协议对象。你知道吗

如何在twisted中测试协议行为(而不是有线协议编码)有什么提示吗?你知道吗


Tags: self协议transfactorytwisted联系人thisprotocol
1条回答
网友
1楼 · 发布于 2024-09-29 17:20:24

正如您所说,您并不是要测试线路上字节的低级细节。你不需要一个能让你移动那些不相关字节的测试工具。你知道吗

相反,您需要一个测试工具,它可以让您远离字节,测试对更高级别非常重要的应用程序级行为。你知道吗

你提到你在用放大器。Twisted中的ampapi通过向您提供可以传递到协议的callRemoteAPI的命令对象来工作。你知道吗

如果单击GUI中的“foo”按钮会导致“bar”命令以某些特定参数遍历网络,那么将GUI代码连接到只处理命令的AMP类命令。这种双精度测试的callRemote实现可能类似(未测试):

from twisted.internet.defer import execute

class LocalAMP(object):
    def __init__(self, backend):
        self._backend = backend

    def callRemote(self, command, **kwargs):
        try:
            method = getattr(self._backend, command.__name__)
        except AttributeError:
            return fail(NoSuchMethod())
        return execute(method, **kwargs)

现在您可以调用应用程序级行为而不用担心协议。你知道吗

在一个完美的世界中,像这样的类将与Twisted一起分发,作为使用AMP的开发人员的测试库的一部分。也许在你建立它之后,你可以把它贡献给上游。你知道吗

相关问题 更多 >

    热门问题