如何用扭曲的方式编写协议的高级测试?
我知道您可以使用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())然而,有线协议现在并不那么关键。它是不断变化的,我用AMP不用想太多。我现在要测试的是高层行为:
诸若此类。例如:
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缺少的是某种假端点或双向传输来连接两个协议对象。
有什么技巧可以用来测试扭曲的协议行为(而不是有线协议编码)?
发布于 2014-10-20 18:14:19
正如您所说的,您不是在尝试测试线路上字节的低级细节。您不需要一个允许您移动那些不相关字节的测试工具。
相反,您需要一个测试工具,它可以让您远离字节,并测试对更高级别非常重要的应用程序级行为。
你说你在用AMP。Twisted中的AMP API提供了命令对象,可以传递给协议的callRemote API。
如果在GUI中单击"foo“按钮会导致"bar”命令使用某些特定参数遍历网络,则将GUI代码连接到只处理命令的AMP-alike。对于这样的双测试,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)现在,您可以调用应用程序级别的行为,而不必担心协议。
在一个完美的世界中,像这样的类将作为使用AMP的开发人员测试库的一部分来分发Twisted。也许在你建造了它之后,你可以把它贡献到上游。
https://stackoverflow.com/questions/26462870
复制相似问题