资讯详情

资讯详情

自动化测试实战(二)

先分享一段文字避免自己成为高知识低文化的工程师简单单纯喜欢独处独来独往不易合同频过着接地气的生活除了生存温饱问题之外没有什么过多的欲望表面看起来很高冷内心热情如果你身边有这样灵性的人一定要好好珍惜他们眼中有神有光干净给人感觉很舒服有超强的感知能力有形的无形的感知力很强能感知人的内心变化喜欢独处好静清静享受孤独不打扰别人不喜欢被别人打扰在自己人世界里做着自己喜欢的事。自动化测试说白了就是让机器替我们干活。我刚开始做硬件测试那会儿还傻乎乎地拿着万用表一个个点去测电压后来项目多了发现这样下去手都要废掉。于是我开始琢磨怎么让电脑自己跑测试、自己存数据、自己判断结果。今天我们就以电源测试为例走一遍完整的自动化流程。你想想看一个电源模块少说也有七八个测试项手动测一遍至少半小时用脚本跑五分钟搞定还能自动生成报告。一、测试环境搭建先说说硬件连接。我习惯用可编程电子负载配合数字万用表通过USB或GPIB连到电脑。软件方面Python是首选因为它的库太丰富了。必备工具清单可编程直流电源比如ITECH、Chroma电子负载能调恒流、恒压模式数字万用表精度至少6位半Python 3.8 环境pyvisa库用于仪器通信pandas库数据存储安装依赖很简单一行命令搞定pip install pyvisa pyvisa-py pandas numpy小提示如果你用的是USB转GPIB记得先装好驱动。我曾经在这上面折腾了一下午结果发现是驱动版本不对。二、编写测试脚本——以电源纹波测试为例电源纹波测试是电源测试里最基础也最重要的项目。说白了就是看电源输出端有没有不该有的交流成分。先写一个仪器控制的基础类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, channel1, samples100): 测量纹波电压 # 设置万用表为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。写个数据存储函数import pandas as pd from datetime import datetime def save_test_data(test_name, results, filenameNone): 保存测试数据到CSV文件 if filename is None: filename ftest_{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, engineopenpyxl) as writer: df.to_excel(writer, sheet_name测试结果, indexFalse) raw_df.to_excel(writer, sheet_name原始数据, indexFalse) print(f数据已保存到: {filename}) return filename经验之谈我建议把原始采样数据也存下来。有一次客户质疑测试结果我直接把原始数据甩过去对方立马闭嘴了。原始数据就是你的护身符。四、测试结果自动判定自动判定说白了就是拿测试值和规格书对比。规格书说纹波要小于50mV你测出来60mV那就是FAIL。写个判定函数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就报警。五、完整测试流程整合把上面这些模块串起来就是一个完整的自动化测试脚本def run_power_test(): 执行完整的电源测试流程 tester PowerSupplyTester() spec_checker TestSpec() try: # 1. 连接仪器 print(正在连接仪器...) tester.connect_instruments() # 2. 执行测试 print(开始测量12V纹波...) results tester.measure_ripple(channel1, samples200) # 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存历史数据方便追溯举个例子加个实时显示功能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, interval50) plt.show()个人建议刚开始别想着一步到位。先跑通一个测试项再慢慢加功能。我见过太多人一上来就想搞个大而全的系统结果卡在第一步就放弃了。好了这一课的内容就这些。自动化测试的核心就三点控制仪器、存数据、判结果。你把这三点吃透了其他测试项目比如时序测试、信号完整性测试都是换汤不换药。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →