自动化测试实战(二)

先分享一段文字,避免自己成为高知识低文化的工程师:

简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身边有这样灵性的人,一定要好好珍惜他们眼中有神有光,干净,给人感觉很舒服,有超强的感知能力有形的无形的感知力很强,能感知人的内心变化喜欢独处,好静,清静,享受孤独,不打扰别人不喜欢被别人打扰,在自己人世界里做着自己喜欢的事。

自动化测试,说白了就是让机器替我们干活。我刚开始做硬件测试那会儿,还傻乎乎地拿着万用表一个个点去测电压,后来项目多了,发现这样下去手都要废掉。于是我开始琢磨怎么让电脑自己跑测试、自己存数据、自己判断结果。

今天我们就以电源测试为例,走一遍完整的自动化流程。你想想看,一个电源模块少说也有七八个测试项,手动测一遍至少半小时,用脚本跑,五分钟搞定,还能自动生成报告。

一、测试环境搭建

先说说硬件连接。我习惯用可编程电子负载配合数字万用表,通过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()

个人建议: 刚开始别想着一步到位。先跑通一个测试项,再慢慢加功能。我见过太多人一上来就想搞个大而全的系统,结果卡在第一步就放弃了。

好了,这一课的内容就这些。自动化测试的核心就三点:控制仪器、存数据、判结果。你把这三点吃透了,其他测试项目(比如时序测试、信号完整性测试)都是换汤不换药。

相关推荐
2601_967987371 小时前
你们都用Python实现了哪些自动化办公?
python·excel·自动化办公·1024程序员节·学习资料·跨平台操作
wflynn1 小时前
GitHub 今日推荐|Snapintosh:用 ARM EL2 监控器骗过内核,让骁龙芯片笔记本跑 macOS
python·开源·github
happylifetree1 小时前
Python69:核心语法-函数进阶-案例1(递归)
python
外收内放1 小时前
FastAPI猜字谜实战(3):把每一局存成JSON
开发语言·python·学习·json·fastapi
小白学大数据1 小时前
基于 Python 的家具消费数据分析全链路实战:从数据治理到销售预测
人工智能·python·数据分析
镜子AI1 小时前
镜子AI案例工程复盘:用Python给GEO效果做抽样检测与置信区间估计
开发语言·人工智能·python
WenGyyyL1 小时前
从零理解强化学习:为什么 AI 需要 Advantage,而不只是 Reward?
人工智能·python·深度学习·机器学习·nlp
春涧草茶1 小时前
慢就是快15-1 多进程 多线程
开发语言·python
云和数据.ChenGuang2 小时前
Python 集合(set)常用函数详解与实战案例
开发语言·python·深度学习·langchain