Skip to main content
 首页 » 编程设计

python之如何正确地使单元测试清理套接字

2025年05月04日8rubylouvre

我最近一直在使用一些套接字,在编写一些带有监听套接字的单元测试用例时,我反复收到错误:[Errno 98] 地址已在使用中。

这是一些显示错误的示例代码。

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() 

它似乎发生在其中一个测试抛出异常时。毫无异常(exception),它按预期工作。但这有点让测试变得无用,因为在第一个抛出异常的测试之后的所有测试也会抛出异常。

请您参考如下方法:

socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)  

应该有帮助

基本上一个关闭的套接字不会立即被堆栈释放。因此,如果您尝试立即重用它(即使在您只有一个绑定(bind)套接字但关闭并重新启动应用程序的情况下),您也会看到相同的错误。 REUSEADDR 允许再次绑定(bind)同一个套接字。

但是,如果您的套接字处于定时等待状态并且您尝试相同的目的地,它将失败。

您还应该阅读此套接字选项的手册页以了解它的局限性。

SO_REUSEADDR on SO