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

时间:2012-10-15 18:41:46

标签: python unit-testing python-2.7

我最近一直在使用一些套接字,在用一个监听套接字编写一些单元测试用例时,我反复得到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 个答案:

答案 0 :(得分:1)

socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 

应该帮助

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

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

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

SO_REUSEADDR on SO