第3章:Python测试框架入门

说实话,很多做声学测试的工程师,一听到「编程」两个字就头大。我当年也是这样。但后来我发现,真正让测试效率翻倍的,不是多贵的仪器,而是你手头那几行代码。

这一章,我们就来搞定Python环境、PyCharm、pytest框架。嗯,这些都是基本功,但基本功不扎实,后面写自动化脚本时会各种踩坑。

3.1 Python环境配置

先说说Python版本的选择。我个人习惯用Python 3.8或3.9,为什么?因为我在项目中遇到过,有些声学库(比如pyAudio、sounddevice)对3.10以上版本支持不太好。你想想看,装了半天库发现不兼容,多耽误事。

安装步骤其实很简单:

  1. 去Python官网下载对应版本(Windows选64位安装包)
  2. 安装时记得勾选「Add Python to PATH」
  3. 打开命令行,输入 python --version 验证
我的小技巧: 安装路径不要带中文和空格。我见过有人装在「Program Files (x86)」下面,后面pip安装各种报错,排查了半天。

装好之后,建议立刻升级pip:

python -m pip install --upgrade pip

这一步很多人会忽略。但你不升级,后面装pytest时可能遇到版本警告。说白了,就是给自己省麻烦。

3.2 PyCharm安装与调试

编辑器这块,我推荐PyCharm Community版。为什么不用专业版?因为声学测试用不到Django那些Web功能,社区版完全够用,还免费。

安装要点:

  • 下载时选「Community」版本
  • 安装过程中,勾选「Add launchers dir to PATH」
  • 主题选Darcula,保护眼睛(我常年盯着屏幕,深色主题确实舒服些)

第一次打开PyCharm,它会让你配置Python解释器。这里要注意:

我曾经踩过的坑: 直接用了系统默认的Python解释器,结果项目里装了一堆全局包,后来换电脑时迁移项目,依赖全乱了。所以,一定要用虚拟环境!

创建新项目时,选择「New environment using Virtualenv」。这样每个项目都有自己的小天地,互不干扰。

调试功能怎么用? 我教你一个最实用的:

  1. 在代码行号旁边点一下,出现红色圆点(断点)
  2. 右键选择「Debug」运行
  3. 程序会在断点处暂停,你可以看变量值、一步步执行

这个功能在调试声学算法时特别有用。比如你写了一个FFT变换,结果不对,打断点看中间变量,一眼就能发现问题。

3.3 pytest框架搭建

pytest是我最常用的测试框架。为什么不用unittest?因为pytest的语法更简洁,fixture机制更灵活。我在做Soundbar量产测试时,用pytest管理了200多个测试用例,运行起来又快又稳。

安装pytest:

pip install pytest

验证安装:

pytest --version

写一个最简单的测试用例:

# test_demo.py
def test_soundbar_power_on():
    """测试Soundbar开机功能"""
    assert True  # 这里替换为实际测试逻辑

运行测试:

pytest test_demo.py -v

-v 参数会显示详细输出。你想想看,如果测试失败了,没有详细信息,你怎么定位问题?

pytest的核心优势:
  • 自动发现测试文件(文件名以test_开头)
  • 自动发现测试函数(函数名以test_开头)
  • 丰富的插件生态(pytest-html生成报告、pytest-xdist并行执行)

3.4 项目目录结构

一个好的项目结构,能让团队协作事半功倍。我在量产测试项目中,目录结构是这样的:

soundbar_test_project/
├── tests/                  # 测试用例目录
│   ├── test_power.py       # 电源测试
│   ├── test_audio.py       # 音频测试
│   └── test_bt.py          # 蓝牙测试
├── src/                    # 被测设备控制代码
│   ├── soundbar_control.py # Soundbar控制类
│   └── audio_analyzer.py   # 音频分析器
├── config/                 # 配置文件
│   ├── test_config.yaml    # 测试参数配置
│   └── device_info.json    # 设备信息
├── reports/                # 测试报告输出
├── conftest.py             # pytest全局配置
├── pytest.ini              # pytest配置文件
└── requirements.txt        # 依赖包列表

每个目录的作用:

目录/文件 作用
tests/ 存放所有测试用例,按功能模块分文件
src/ 封装与Soundbar交互的底层代码
config/ 测试参数、设备信息,方便修改
reports/ 自动生成的测试报告,方便追溯
conftest.py 定义fixture、钩子函数
pytest.ini 配置pytest运行参数
我的建议: 把测试数据和测试逻辑分开。比如测试音频文件放在单独的data/目录下,不要混在代码里。这样换测试样本时,只需要替换文件,不用改代码。

最后,别忘了创建 requirements.txt

pytest==7.4.0
pytest-html==3.2.0
pyyaml==6.0

这样别人拿到你的项目,直接 pip install -r requirements.txt 就能装好所有依赖。嗯,这就是专业和业余的区别。

好了,这一章的内容就到这里。环境搭好了,框架建起来了,下一章我们就可以真正开始写测试用例了。