如何使用Python編寫測試腳本
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測試腳本的資料請關注腳本之家其它相關文章!
相關文章
使用 Django Highcharts 實現數據可視化過程解析
這篇文章主要介紹了使用 Django Highcharts 實現數據可視化過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-07-07詳解python如何在django中為用戶模型添加自定義權限
這篇文章主要介紹了python如何在django中為用戶模型添加自定義權限,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10解決python2中unicode()函數在python3中報錯的問題
這篇文章主要介紹了在python2中unicode()函數在python3中報錯的解決方案,希望給大家做個參考,下次出現這個問題的時候,也知道如何應對2021-05-05