2012-10-15 58 views
2

最近我一直在使用一些套接字,並在使用套接字套接字編寫一些單元測試用例時,我一再獲得error: [Errno 98] Address already in use如何正確進行單元測試清理套接字

這是顯示錯誤的一些示例代碼。

import unittest 
import socket 

class TestUnit(unittest.TestCase): 
    def setUp(self): 
     self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     self.socket.bind((socket.gethostname(), 10000)) 
     self.socket.listen(10) 
     self.addCleanup(self.clean) 

    def test_nothing(self): 
     self.assertEqual(False, False) 

    def test_something(self): 
     self.assertEqual(True, True) 

    def clean(self): 
     self.socket.close() 

它似乎發生在其中一個測試引發異常時。沒有例外,它按預期工作。但是這樣會使測試無用,因爲在引發異常之後的所有測試都會拋出異常。

回答

1
socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 

應該幫助

基本上封閉的插座不立即通過堆棧釋放。因此,如果您嘗試立即重用它(即使在有單個綁定套接字但您關閉並重新啓動應用程序的情況下),您也會看到相同的錯誤。 REUSEADDR允許再次綁定相同的套接字。

但是,如果您的套接字處於定時等待狀態,並且您嘗試相同的目標,則會失敗。

您還應該閱讀此套接字選項的手冊頁以瞭解它的侷限性。

SO_REUSEADDR on SO

+0

謝謝,這確實爲這個問題工作。 – Wessie