gpt4 book ai didi

python - 扭曲协议(protocol)行为的高级测试

转载 作者:行者123 更新时间:2023-12-01 05:00:02 25 4
gpt4 key购买 nike

如何用twisted编写协议(protocol)的高级测试?

我知道您可以使用 StringTransport 来测试低级协议(protocol)细节,例如它收到了一些原始数据并且发生了一些状态变化,或者以某种方式响应:

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())

但是,有线协议(protocol)现在并不那么重要。它在不断变化,而且我使用 AMP 无论如何都不必考虑太多。我现在想测试的是高级行为:

  • 建立连接,确保协议(protocol)通知 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

缺少的是某种虚假端点或双向传输来连接两个协议(protocol)对象。

有什么技巧可以测试 Twisted 中的协议(protocol)行为(而不是有线协议(protocol)编码)吗?

最佳答案

正如您所说,您并不是在尝试测试线路上字节的低级详细信息。您不需要一个可以让您移动这些不相关字节的测试工具。

相反,您需要一个测试工具来摆脱字节并测试对更高级别很重要的应用程序级行为。

您提到您正在使用 AMP。 Twisted 中的 AMP API 的工作原理是为您提供命令对象,您可以将其传递给协议(protocol)的 callRemote API。

如果单击 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)

现在您可以调用应用程序级行为,而无需担心协议(protocol)。

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

关于python - 扭曲协议(protocol)行为的高级测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26462870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com