2012-10-15 55 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