返回顶部
分享到

使用Python编写测试脚本

python 来源:互联网 作者:佚名 发布时间:2025-02-23 09:11:13 人浏览
摘要

1. 工具库简介 1.1 python-can 定位:通用的 CAN 总线通信库,支持多种硬件接口(SocketCAN、PCAN、Kvaser 等)。 核心功能: 连接物理 CAN 设备或虚拟接口。 发送/接收 CAN 报文(标准帧、扩展帧)。

1. 工具库简介

1.1 python-can

定位:通用的 CAN 总线通信库,支持多种硬件接口(SocketCAN、PCAN、Kvaser 等)。

核心功能:

连接物理 CAN 设备或虚拟接口。

发送/接收 CAN 报文(标准帧、扩展帧)。

支持 CAN FD(灵活数据速率)。

适用场景:快速搭建 CAN 通信原型,兼容性强。

1.2 canard(CAN 协议栈)

定位:专注于 UDS(ISO 14229) 和 J1939 等高层协议解析的库。

核心功能:

解析 DBC 文件,自动化生成信号值。

支持 UDS 诊断服务(如 0x22 读数据、0x2E 写数据)。

处理多帧传输(如 ISO-TP 协议)。

适用场景:需要与 ECU 进行诊断交互的自动化测试。

2. 环境准备

2.1 安装库

1

2

3

4

5

# 安装通用 CAN 库

pip install python-can

 

# 安装 canard(UDS 协议支持)

pip install canard

2.2 硬件准备

物理设备:PCAN-USB、Kvaser、Vector 设备(需安装对应驱动)。

虚拟测试:使用 socketcan(Linux 虚拟 CAN 接口)或 CANoe 模拟总线。

3. 核心功能实现示例

3.1 使用 python-can 收发 CAN 报文

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

import can

 

# 连接 CAN 接口(以 socketcan 为例)

bus = can.interface.Bus(channel='vcan0', bustype='socketcan')

 

# 发送单帧数据

msg = can.Message(

    arbitration_id=0x123,  # CAN ID

    data=[0x01, 0x02, 0x03, 0x04],

    is_extended_id=False    # 标准帧

)

bus.send(msg)

 

# 接收数据

for msg in bus:

    print(f"Received: ID={hex(msg.arbitration_id)}, Data={msg.data}")

 

# 关闭连接

bus.shutdown()

3.2 使用 canard 解析 DBC 文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

from canard import Canard

from canard.hw import socketcan

 

# 加载 DBC 文件

dbc = Canard()

dbc.load_dbc('vehicle.dbc')

 

# 创建虚拟 CAN 接口

dev = socketcan.SocketCanDev('vcan0')

dev.start()

 

# 解析接收到的报文

def on_message(msg):

    decoded = dbc.decode_message(msg.arbitration_id, msg.data)

    print(f"信号值: {decoded}")

 

dev.add_listener(on_message)

3.3 实现 UDS 诊断服务(基于 canard)

1

2

3

4

5

6

7

8

9

10

11

from canard.proto.uds import UdsClient

 

# 创建 UDS 客户端

uds = UdsClient(transport=can.Bus(bustype='socketcan', channel='vcan0'))

 

# 发送诊断请求:读取 ECU 序列号(服务 0x22,参数 0xF189)

response = uds.request([0x22, 0xF1, 0x89])

if response:

    print(f"ECU 序列号: {bytes(response.data[2:]).decode()}")

else:

    print("请求超时")

4. 自动化测试脚本设计

4.1 测试场景示例:车门状态验证

1

2

3

4

5

6

7

8

9

10

11

12

def test_door_status():

    bus = can.interface.Bus(channel='vcan0', bustype='socketcan')

     

    # 发送车门控制命令(ID=0x200,数据=[0x01] 表示开门)

    bus.send(can.Message(arbitration_id=0x200, data=[0x01]))

     

    # 等待并验证车门状态反馈(预期 ID=0x201,数据[0]=0x01)

    for msg in bus:

        if msg.arbitration_id == 0x201:

            assert msg.data[0] == 0x01, "车门未正确打开"

            break

    bus.shutdown()

4.2 集成测试框架(如 pytest)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

import pytest

 

@pytest.fixture

def can_bus():

    bus = can.interface.Bus(channel='vcan0', bustype='socketcan')

    yield bus

    bus.shutdown()

 

def test_engine_rpm(can_bus):

    # 发送转速请求命令

    can_bus.send(can.Message(arbitration_id=0x700, data=[0x03]))

     

    # 验证响应是否在合理范围(如 800-5000 RPM)

    for msg in can_bus:

        if msg.arbitration_id == 0x701:

            rpm = int.from_bytes(msg.data[2:4], byteorder='big')

            assert 800 <= rpm <= 5000, "转速异常"

            break

5. 高级应用技巧

5.1 CAN FD 支持

1

2

3

4

5

6

7

8

# 使用 python-can 发送 CAN FD 报文

msg = can.Message(

    arbitration_id=0x123,

    data=[i % 256 for i in range(64)],  # 64 字节数据

    is_fd=True,

    bitrate_switch=True  # 启用比特率切换

)

bus.send(msg)

5.2 与 HIL 系统集成

1

2

3

4

5

6

7

8

9

10

# 连接 Vector 硬件(需安装 XL Driver)

bus = can.interface.Bus(

    bustype='vector',

    channel=1,

    app_name='Python_HIL_Test'

)

 

# 发送同步周期性报文

task = bus.send_periodic(msgs=[msg1, msg2], period=0.1)

task.stop()  # 停止发送

5.3 自动化测试报告生成

1

2

# 使用 pytest-html 生成测试报告

pytest.main(["--html=report.html"])

6. 常见问题与调试

6.1 硬件连接失败

现象:CanError: Error sending message

解决:

检查设备驱动是否安装(如 PCAN 需安装 PCAN-Basic API)。

确认通道权限(Linux 需 sudo ip link set vcan0 up)。

6.2 DBC 解析错误

现象:KeyError: 'Unknown frame ID'

解决:确保 DBC 文件中包含目标 CAN ID 的定义。

6.3 多帧传输处理

1

2

3

4

5

# 使用 canard 处理 ISO-TP 多帧传输

from canard.proto.iso_tp import IsoTpTransport

 

tp = IsoTpTransport(can_bus, tx_id=0x7E0, rx_id=0x7E8)

data = tp.recv()  # 接收长数据(自动重组)


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 基于Python实现多语言朗读与单词选择测验
    在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音。这样的
  • 使用Python编写测试脚本
    1. 工具库简介 1.1 python-can 定位:通用的 CAN 总线通信库,支持多种硬件接口(SocketCAN、PCAN、Kvaser 等)。 核心功能: 连接物理 CAN 设备或虚
  • 使用Python构建Markdown转Word文档转换器

    使用Python构建Markdown转Word文档转换器
    在当今的文档处理中,Markdown因其简洁的语法和易读性而广受欢迎,而Microsoft Word(DOCX格式)则因其广泛的兼容性和专业的排版效果成为商业
  • 使用Python实现Excel中文转拼音

    使用Python实现Excel中文转拼音
    在日常办公中,我们经常需要处理Excel文件,有时候需要将中文转换为拼音缩写以方便检索和使用。今天我将分享一个使用Python开发的小工具
  • Python实现批量添加视频文本水印
    这个是一个基于PyQt5开发的视频水印批量添加工具,旨在为多个视频文件添加文本水印。用户可以自定义水印的文本内容、字体颜色、字号大
  • 在不同系统间迁移Python程序的方法
    在开发 Python 项目时,我们常常会遇到需要将在 Windows 系统上编写的程序迁移到 Linux 服务器上运行的情况,尤其是当服务器环境存在差异(
  • Python+PyQt手搓一个文件浏览器

    Python+PyQt手搓一个文件浏览器
    一、效果展示 二、界面设计 该界面通过Qt Designer设计 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
  • Python实现将PDF文件拆分任意页数介绍

    Python实现将PDF文件拆分任意页数介绍
    PyMuPDF,简称fitz,是一个轻量级的Python库,它基于MuPDF的C++库,提供了丰富的功能,包括但不限于PDF的读取、编辑、转换和渲染。Fitz作为Py
  • 20个实用的Python Excel自动化脚本介绍
    在数据处理和分析的过程中,Excel文件是我们日常工作中常见的格式。通过Python,我们可以实现对Excel文件的各种自动化操作,提高工作效率
  • Python实现移动指定图片到指定目录

    Python实现移动指定图片到指定目录
    前阵子,拍了200张照片,然后挑了20张找人精修下,今天修完发来给我,然后我先对比一下和原图的效果差异,以便做验收。由于前期挑出来
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计