You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python unittest中用单Socket连接测试TCP服务

保持单个TCP Socket连接供整个unittest测试套件使用

你完全可以借助Python unittest框架的类级别初始化/清理方法,实现整个测试套件共享一个TCP Socket连接,不用每个测试用例都重复创建、连接、关闭socket。具体来说,用setUpClass()和tearDownClass()这两个方法——它们会分别在测试类的所有测试用例执行前、执行后各运行一次,刚好匹配你的需求。

下面是修改后的完整代码示例:

import socket
import unittest
from unittest import TestCase

class TestService(TestCase):
    # 定义类级别的socket对象,所有测试用例共享
    client_socket = None
    port_number = 12345  # 替换成你的服务实际端口号

    @classmethod
    def setUpClass(cls):
        """所有测试用例执行前仅运行一次:建立socket连接"""
        cls.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        cls.client_socket.connect(('', cls.port_number))
        print("全局Socket连接已建立")

    def test_1(self):
        self.client_socket.send('message1'.encode())
        response = self.client_socket.recv(1024).decode()
        self.assertEqual(response, 'reply1')

    def test_2(self):
        self.client_socket.send('message2'.encode())
        response = self.client_socket.recv(1024).decode()
        self.assertEqual(response, 'reply2')

    @classmethod
    def tearDownClass(cls):
        """所有测试用例执行完成后仅运行一次:关闭socket连接"""
        if cls.client_socket:
            cls.client_socket.close()
            print("全局Socket连接已关闭")

if __name__ == '__main__':
    unittest.main()

关键细节说明:

  • 用@classmethod装饰器标记setUpClass和tearDownClass:这两个方法属于测试类本身,而非单个测试实例,因此只会执行一次
  • 把client_socket设为类属性:这样所有测试用例的实例都能访问同一个连接对象,实现共享
  • 连接初始化与清理分离:setUpClass负责创建并连接socket,tearDownClass负责最后关闭,避免资源泄漏
  • 测试用例简化:每个测试方法直接使用self.client_socket收发数据,不用再重复处理连接逻辑

额外提示:

如果你的测试场景中,某个用例会导致服务端主动断开连接,你可以考虑在setUp()方法中添加连接状态检查,必要时重新建立连接——不过这会回到“每个测试前初始化”的模式。如果你的服务端支持长连接,上面的方案就足够高效且符合需求。

内容的提问来源于stack exchange,提问作者Jake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:28:06