2014-10-20 122 views
1

如何在扭曲的情況下編寫協議的高級測試?扭曲的協議行爲的高級測試

我知道你可以使用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無需考慮太多。我現在要測試的是高級行爲:

  • 進行連接,確保協議通知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 

缺少的是某種假端點或雙向傳輸來連接兩個協議對象。

任何提示如何測試協議行爲(而不是有線協議編碼)在扭曲?

回答

2

正如你所說的,你並沒有試圖測試線上字節的底層細節。你不需要一個測試工具來讓你移動那些不相關的字節。

取而代之,您需要一個測試工具,讓它脫離字節並測試對更高級別非常重要的應用程序級行爲。

你提到你正在使用AMP。 Twisted中的AMP API通過爲您提供可傳遞至協議的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) 

現在你可以調用應用程序級的行爲,而不必擔心協議。

在完美的世界中,像這樣的類將使用Twisted作爲使用AMP的開發人員的測試庫的一部分進行分發。也許在你構建它之後,你可以向上遊貢獻它。