先分享一段文字,避免自己成为高知识低文化的工程师:
简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身边有这样灵性的人,一定要好好珍惜他们眼中有神有光,干净,给人感觉很舒服,有超强的感知能力有形的无形的感知力很强,能感知人的内心变化喜欢独处,好静,清静,享受孤独,不打扰别人不喜欢被别人打扰,在自己人世界里做着自己喜欢的事。
自动化测试,说白了就是让机器替我们干活。我刚开始做硬件测试那会儿,还傻乎乎地拿着万用表一个个点去测电压,后来项目多了,发现这样下去手都要废掉。于是我开始琢磨怎么让电脑自己跑测试、自己存数据、自己判断结果。
今天我们就以电源测试为例,走一遍完整的自动化流程。你想想看,一个电源模块少说也有七八个测试项,手动测一遍至少半小时,用脚本跑,五分钟搞定,还能自动生成报告。
一、测试环境搭建
先说说硬件连接。我习惯用可编程电子负载配合数字万用表,通过USB或GPIB连到电脑。软件方面,Python是首选,因为它的库太丰富了。
必备工具清单:
- 可编程直流电源(比如ITECH、Chroma)
- 电子负载(能调恒流、恒压模式)
- 数字万用表(精度至少6位半)
- Python 3.8+ 环境
- pyvisa库(用于仪器通信)
- pandas库(数据存储)
安装依赖很简单,一行命令搞定:
python
pip install pyvisa pyvisa-py pandas numpy
小提示: 如果你用的是USB转GPIB,记得先装好驱动。我曾经在这上面折腾了一下午,结果发现是驱动版本不对。
二、编写测试脚本------以电源纹波测试为例
电源纹波测试是电源测试里最基础也最重要的项目。说白了就是看电源输出端有没有不该有的交流成分。
先写一个仪器控制的基础类:
python
import pyvisa
import time
import numpy as np
class PowerSupplyTester:
def __init__(self):
self.rm = pyvisa.ResourceManager()
self.dmm = None
self.load = None
def connect_instruments(self):
"""连接仪器"""
resources = self.rm.list_resources()
print(f"检测到设备: {resources}")
# 假设万用表是第一个设备
self.dmm = self.rm.open_resource(resources[0])
self.dmm.timeout = 5000 # 设置超时5秒
def measure_ripple(self, channel=1, samples=100):
"""测量纹波电压"""
# 设置万用表为AC模式
self.dmm.write("CONF:VOLT:AC")
self.dmm.write("VOLT:AC:RANG 10") # 量程10V
readings = []
for i in range(samples):
value = float(self.dmm.query("READ?"))
readings.append(value)
time.sleep(0.01) # 10ms采样间隔
# 计算统计值
avg = np.mean(readings)
peak = np.max(readings)
rms = np.sqrt(np.mean(np.square(readings)))
return {
"average": avg,
"peak": peak,
"rms": rms,
"raw_data": readings
}
注意: 采样间隔不能太短,否则万用表反应不过来。我试过1ms间隔,结果数据全是乱的。一般10ms到100ms比较稳妥。
三、数据采集与存储
数据存哪里?我个人习惯用CSV格式,简单通用,Excel也能直接打开。如果数据量大,可以考虑SQLite。
写个数据存储函数:
python
import pandas as pd
from datetime import datetime
def save_test_data(test_name, results, filename=None):
"""保存测试数据到CSV文件"""
if filename is None:
filename = f"test_{datetime.now().strftime('%Y%m%d_%H%M%S')}.csv"
# 构建DataFrame
data = {
"测试时间": datetime.now().isoformat(),
"测试项目": test_name,
"平均值(V)": results["average"],
"峰值(V)": results["peak"],
"有效值(V)": results["rms"]
}
df = pd.DataFrame([data])
# 保存原始采样数据
raw_df = pd.DataFrame({
"采样点": range(len(results["raw_data"])),
"电压值(V)": results["raw_data"]
})
# 写入文件
with pd.ExcelWriter(filename, engine='openpyxl') as writer:
df.to_excel(writer, sheet_name='测试结果', index=False)
raw_df.to_excel(writer, sheet_name='原始数据', index=False)
print(f"数据已保存到: {filename}")
return filename
经验之谈: 我建议把原始采样数据也存下来。有一次客户质疑测试结果,我直接把原始数据甩过去,对方立马闭嘴了。原始数据就是你的护身符。
四、测试结果自动判定
自动判定说白了就是拿测试值和规格书对比。规格书说纹波要小于50mV,你测出来60mV,那就是FAIL。
写个判定函数:
python
class TestSpec:
"""测试规格定义"""
def __init__(self):
self.specs = {
"ripple_12v": {
"name": "12V输出纹波",
"min": 0,
"max": 0.05, # 50mV
"unit": "V"
},
"ripple_5v": {
"name": "5V输出纹波",
"min": 0,
"max": 0.03, # 30mV
"unit": "V"
}
}
def check_result(self, test_item, measured_value):
"""判定测试结果"""
spec = self.specs.get(test_item)
if not spec:
return {"result": "UNKNOWN", "message": f"未找到规格: {test_item}"}
if measured_value < spec["min"] or measured_value > spec["max"]:
return {
"result": "FAIL",
"message": f"{spec['name']}: {measured_value:.4f}{spec['unit']} " \
f"(规格: {spec['min']}~{spec['max']}{spec['unit']})"
}
else:
return {
"result": "PASS",
"message": f"{spec['name']}: {measured_value:.4f}{spec['unit']} " \
f"(规格: {spec['min']}~{spec['max']}{spec['unit']})"
}
# 使用示例
spec_checker = TestSpec()
result = spec_checker.check_result("ripple_12v", 0.035)
print(result["message"]) # 输出: 12V输出纹波: 0.0350V (规格: 0~0.05V)
核心要点: 自动判定不是简单的比大小。要考虑测量误差、温度影响、负载变化等因素。我一般会在规格值上留10%的余量,比如规格50mV,我设45mV就报警。
五、完整测试流程整合
把上面这些模块串起来,就是一个完整的自动化测试脚本:
python
def run_power_test():
"""执行完整的电源测试流程"""
tester = PowerSupplyTester()
spec_checker = TestSpec()
try:
# 1. 连接仪器
print("正在连接仪器...")
tester.connect_instruments()
# 2. 执行测试
print("开始测量12V纹波...")
results = tester.measure_ripple(channel=1, samples=200)
# 3. 结果判定
check = spec_checker.check_result("ripple_12v", results["rms"])
print(check["message"])
# 4. 保存数据
filename = save_test_data("12V纹波测试", results)
# 5. 生成报告
if check["result"] == "PASS":
print("✅ 测试通过")
else:
print("❌ 测试失败,请检查电源模块")
except Exception as e:
print(f"测试异常: {e}")
finally:
# 6. 断开连接
if tester.dmm:
tester.dmm.close()
if __name__ == "__main__":
run_power_test()
避坑指南: 我曾经犯过一个低级错误------测试完忘了断开仪器连接,结果第二天来发现仪器一直处于忙状态。记得在finally块里关闭连接,这是好习惯。
六、进阶技巧与优化
搞定了基础功能,我们还可以加点料:
- 多通道并行测试: 用多线程同时测多路电源,效率翻倍
- 实时波形显示: 用matplotlib画实时曲线,看着数据跳动很有成就感
- 邮件通知: 测试完成自动发邮件,不用一直盯着屏幕
- 数据库存储: 用SQLite存历史数据,方便追溯
举个例子,加个实时显示功能:
python
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
def realtime_plot():
"""实时显示纹波波形"""
fig, ax = plt.subplots()
x_data, y_data = [], []
line, = ax.plot([], [], 'b-')
def update(frame):
# 这里调用测量函数获取新数据
value = measure_single_point()
x_data.append(frame)
y_data.append(value)
if len(x_data) > 100: # 只显示最近100个点
x_data.pop(0)
y_data.pop(0)
line.set_data(x_data, y_data)
ax.relim()
ax.autoscale_view()
return line,
ani = FuncAnimation(fig, update, interval=50)
plt.show()
个人建议: 刚开始别想着一步到位。先跑通一个测试项,再慢慢加功能。我见过太多人一上来就想搞个大而全的系统,结果卡在第一步就放弃了。
好了,这一课的内容就这些。自动化测试的核心就三点:控制仪器、存数据、判结果。你把这三点吃透了,其他测试项目(比如时序测试、信号完整性测试)都是换汤不换药。