【问题标题】:How to properly make unit tests cleanup a socket如何正确地使单元测试清理套接字
【发布时间】:2012-10-05 19:11:47
【问题描述】:

我最近一直在使用一些套接字,在编写一些带有监听套接字的单元测试用例时,我反复收到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()

当其中一个测试抛出异常时似乎会发生这种情况。没有例外,它按预期工作。但这有点使测试毫无用处,因为在第一个引发异常的测试之后的所有测试也会引发异常。

【问题讨论】:

    标签: python unit-testing python-2.7


    【解决方案1】:
    socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 
    

    应该有帮助

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

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

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

    SO_REUSEADDR on SO

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多