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

如何为Python非类成员函数编写测试函数并实现自动发现

没问题!其实unittest虽然常见用法是基于测试类,但完全可以用来测试独立函数,而且自动测试发现也很容易实现。下面一步步给你讲清楚:

1. 编写针对extract_frame_dr的测试用例

首先创建一个测试文件(命名要符合test_*.py的规范,比如test_readTool.py),在里面用unittest的测试类包裹测试逻辑,调用你的独立函数并做断言验证。

假设你的dr是numpy数组(从索引方式dr[0, frameID]推测),测试代码示例如下:

import unittest
import numpy as np
from readTool import extract_frame_dr

class TestExtractFrameDr(unittest.TestCase):
    def test_basic_frame_extraction(self):
        # 构造测试用的2行多列数组
        test_dr = np.array([[10, 20, 30], [100, 200, 300]])
        frame_id = 1
        # 预期结果:第1列的两个元素
        expected = (20, 200)
        # 调用目标函数
        result = extract_frame_dr(test_dr, frame_id)
        # 断言结果匹配
        self.assertEqual(result, expected)
    
    def test_edge_case_first_frame(self):
        test_dr = np.array([[5], [50]])
        frame_id = 0
        expected = (5, 50)
        result = extract_frame_dr(test_dr, frame_id)
        self.assertEqual(result, expected)
    
    def test_edge_case_last_frame(self):
        test_dr = np.array([[1, 2, 3], [11, 22, 33]])
        frame_id = 2
        expected = (3, 33)
        result = extract_frame_dr(test_dr, frame_id)
        self.assertEqual(result, expected)

# 单独运行测试文件时的入口
if __name__ == '__main__':
    unittest.main()

如果你的dr是其他可索引结构(比如列表的列表),只需要调整test_dr的构造方式即可,断言逻辑完全通用。

2. 实现自动测试发现(无需逐个调用)

unittest自带自动发现机制,只要你的测试文件命名符合test_*.py规范,就能一次性运行所有测试,有两种常用方式:

方式一:用命令行直接触发

在项目根目录打开终端,执行以下命令:

python -m unittest discover

这个命令会自动扫描当前目录及子目录下所有test_*.py文件,运行里面的所有测试用例。

如果你的测试文件放在单独的tests文件夹里,可以指定目录和匹配规则:

python -m unittest discover -s tests -p "test_*.py"
  • -s:指定测试文件所在的根目录
  • -p:指定测试文件的命名匹配模式

方式二:编写一个统一的测试运行脚本

在项目根目录创建run_tests.py,内容如下:

import unittest

if __name__ == '__main__':
    # 自动发现所有符合规则的测试用例
    test_loader = unittest.TestLoader()
    test_suite = test_loader.discover(start_dir='.', pattern='test_*.py')
    # 运行测试并输出结果
    test_runner = unittest.TextTestRunner(verbosity=2)
    test_runner.run(test_suite)

之后只要运行python run_tests.py,就能一次性执行所有测试,还能通过verbosity参数控制输出详细程度。

补充:测试异常场景(可选)

如果你的函数需要处理frameID超出范围的情况,可以添加异常测试用例:

def test_invalid_frame_id(self):
    test_dr = np.array([[1,2], [11,22]])
    # 测试超出最大索引的frameID
    with self.assertRaises(IndexError):
        extract_frame_dr(test_dr, 2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 15:07:31