欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何使用Python編寫測試腳本

 更新時間:2025年02月21日 15:42:13   作者:不知道是誰2  
這篇文章主要為大家詳細介紹了Python如何通過PyCAN和CANard庫實現編寫測試腳本,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

1. 工具庫簡介

1.1 python-can

定位:通用的 CAN 總線通信庫,支持多種硬件接口(SocketCAN、PCAN、Kvaser 等)。

核心功能:

連接物理 CAN 設備或虛擬接口。

發(fā)送/接收 CAN 報文(標準幀、擴展幀)。

支持 CAN FD(靈活數據速率)。

適用場景:快速搭建 CAN 通信原型,兼容性強。

1.2 canard(CAN 協(xié)議棧)

定位:專注于 UDS(ISO 14229) 和 J1939 等高層協(xié)議解析的庫。

核心功能:

解析 DBC 文件,自動化生成信號值。

支持 UDS 診斷服務(如 0x22 讀數據、0x2E 寫數據)。

處理多幀傳輸(如 ISO-TP 協(xié)議)。

適用場景:需要與 ECU 進行診斷交互的自動化測試。

2. 環(huán)境準備

2.1 安裝庫

# 安裝通用 CAN 庫
pip install python-can

# 安裝 canard(UDS 協(xié)議支持)
pip install canard

2.2 硬件準備

物理設備:PCAN-USB、Kvaser、Vector 設備(需安裝對應驅動)。

虛擬測試:使用 socketcan(Linux 虛擬 CAN 接口)或 CANoe 模擬總線。

3. 核心功能實現示例

3.1 使用 python-can 收發(fā) CAN 報文

import can

# 連接 CAN 接口(以 socketcan 為例)
bus = can.interface.Bus(channel='vcan0', bustype='socketcan')

# 發(fā)送單幀數據
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 文件

from canard import Canard
from canard.hw import socketcan

# 加載 DBC 文件
dbc = Canard()
dbc.load_dbc('vehicle.dbc')

# 創(chuàng)建虛擬 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)

from canard.proto.uds import UdsClient

# 創(chuàng)建 UDS 客戶端
uds = UdsClient(transport=can.Bus(bustype='socketcan', channel='vcan0'))

# 發(fā)送診斷請求:讀取 ECU 序列號(服務 0x22,參數 0xF189)
response = uds.request([0x22, 0xF1, 0x89])
if response:
    print(f"ECU 序列號: {bytes(response.data[2:]).decode()}")
else:
    print("請求超時")

4. 自動化測試腳本設計

4.1 測試場景示例:車門狀態(tài)驗證

def test_door_status():
    bus = can.interface.Bus(channel='vcan0', bustype='socketcan')
    
    # 發(fā)送車門控制命令(ID=0x200,數據=[0x01] 表示開門)
    bus.send(can.Message(arbitration_id=0x200, data=[0x01]))
    
    # 等待并驗證車門狀態(tài)反饋(預期 ID=0x201,數據[0]=0x01)
    for msg in bus:
        if msg.arbitration_id == 0x201:
            assert msg.data[0] == 0x01, "車門未正確打開"
            break
    bus.shutdown()

4.2 集成測試框架(如 pytest)

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):
    # 發(fā)送轉速請求命令
    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 支持

# 使用 python-can 發(fā)送 CAN FD 報文
msg = can.Message(
    arbitration_id=0x123,
    data=[i % 256 for i in range(64)],  # 64 字節(jié)數據
    is_fd=True,
    bitrate_switch=True  # 啟用比特率切換
)
bus.send(msg)

5.2 與 HIL 系統(tǒng)集成

# 連接 Vector 硬件(需安裝 XL Driver)
bus = can.interface.Bus(
    bustype='vector',
    channel=1,
    app_name='Python_HIL_Test'
)

# 發(fā)送同步周期性報文
task = bus.send_periodic(msgs=[msg1, msg2], period=0.1)
task.stop()  # 停止發(fā)送

5.3 自動化測試報告生成

# 使用 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 多幀傳輸處理

# 使用 canard 處理 ISO-TP 多幀傳輸
from canard.proto.iso_tp import IsoTpTransport

tp = IsoTpTransport(can_bus, tx_id=0x7E0, rx_id=0x7E8)
data = tp.recv()  # 接收長數據(自動重組)

以上就是如何使用Python編寫測試腳本的詳細內容,更多關于Python測試腳本的資料請關注腳本之家其它相關文章!

相關文章

最新評論