2009-07-23 57 views
2

我的任務是編寫用python編寫的一套網絡軟件的單元測試。消息構建器和其他靜態方法的編寫單元非常簡單,但是在編寫網絡環路線程的測試時,我遇到了困難。在網絡線程上使用pyunit

例如:它連接的服務器可能位於任何端口上,我希望能夠測試連接到多個端口(按順序而不是並行)的能力,而無需實際運行多個服務器。什麼是解決這個問題的好方法?也許會使服務器構建和銷燬成爲測試的一部分?有些東西告訴我必須有一個更簡單的答案來逃避我。

我必須想象有單元測試網絡線程的方法,但我似乎無法找到任何。

回答

1

我會嘗試一個工廠引入宣稱是創建socket對象現有代碼。然後在一個模擬工廠的測試過程中創建模擬套接字,它只是假裝他們已經連接到一個服務器(或者不是用於錯誤情況,你也想測試,不是嗎?)並記錄消息流量以證明您的代碼使用正確的端口連接到正確類型的服務器。

儘量不要使用線程來簡化測試。

0

這取決於您的網絡軟件是如何分層的,以及您希望進行測試的詳細程度,但在某些情況下進行服務器設置和拆卸測試部分肯定是可行的。例如,當我在開發Python日誌包時(在它成爲Python的一部分之前),我進行了測試(我沒有使用pyunit/unittest - 它只是一個特別的腳本)測試)四個服務器偵聽TCP,UDP,HTTP和HTTP/SOAP端口,然後向它們發送網絡流量。如果你有興趣,發行版是here,檔案中的相關測試腳本是log_test.py。 Python日誌包當然有某種方式,但是舊的包仍然用於Python < 2.3和> = 1.5.2的版本。

0

我有一些測試用例在setUp中運行服務器並在tearDown中關閉它。我不知道這是否是非常優雅的方式,但它對我來說很有用。

我很高興有它,它可以幫助我很多。

如果服務器init非常長,另一種方法是使用ant自動化它。 ant會在執行測試之前/之後運行/停止服務器。

約螞蟻非常有趣的教程和python見here

0

您需要創建模擬套接字。確切的做法取決於你如何創建套接字和創建套接字生成器是一個好主意。您還可以使用模擬圖書館,如pymox,讓您的生活更輕鬆。它也可能不需要爲了測試的唯一目的而創建套接字發生器。

使用pymox,你會做這樣的事情:

def test_connect(self): 
    m = mox.Mox() 
    m.StubOutWithMock(socket, 'socket') 
    socket_mock = m.MockAnything() 
    m.socket.socket(socket.AF_INET, socket.SOCK_STREAM).AndReturn(socket_mock) 
    socket_mock.connect(('test_server1', 80)) 
    socket_mock.connect(('test_server2', 81)) 
    socket_mock.connect(('test_server3', 82)) 

    m.ReplayAll() 
    code_to_be_tested() 
    m.VerifyAll() 
    m.UnsetStubs()