PyCharm+RobotFramework框架实现UDS自动化测试- (四)项目实战0x10
1.环境搭建
硬件环境:CANoe、待测设备(包含UDS诊断模块)
2.python+PyCharm环境
pip install robotframework
pip install robotframework-ride
pip install openpyxl
pip install udsoncan
pip install python-can
pip install can-isotp
3.项目目录
4. udstest.py
import can
from udsoncan.connections import PythonIsoTpConnection
import os, udsoncan, isotp, sys, binascii
import openpyxl
class udstest(object):
def __init__(self):
udsoncan.setup_logging() # udslog
def get_xlsx(self, sheet):
"获取指定Excel数据"
excel = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'UDSTestcase.xlsx') # 修改文件路径为.xlsx
file = openpyxl.load_workbook(excel)
list = []
sheet = file[sheet] # 获得指定sheet数据
row_value1 = [cell.value for cell in sheet[1]] # 获取第1行的标题
nrows = sheet.max_row # 获取当前sheet行数
ncols = sheet.max_column # 获取当前sheet列数
for i in range(2, nrows + 1): # 从第2行遍历当前sheet
row = [cell.value for cell in sheet[i]] # 获取行数据
dict = {} # 创建空字典
for j in range(0, ncols): # 遍历sheet列,组成字典
if row_value1[j] == 'NO.':
dict[row_value1[j]] = int(row[j])
else:
dict[row_value1[j]] = row[j] # 从第一列开始,将每一列的数据与第1行的数据组成一个键值对,形成字典
list.append(dict) # 将字典添加list中
return list
def set_can(self, txid, rxid):
"""can总线相关配置"""
if isinstance(txid, str) or isinstance(rxid, str):
txid = eval(txid)
rxid = eval(rxid)
isotp_params = {
'stmin': 5, # 流控帧间隔时间,0-127ms 或 100-900ns 值从 0xF1-0xF9
'blocksize': 0, # 流控帧单包大小,0表示不限制
'tx_padding': 0, # 当 notNone表示用于填充发送的消息的字节。
'rx_flowcontrol_timeout': 1000, # 在停止接收和触发之前等待流控制帧的毫秒数
'rx_consecutive_frame_timeout': 1000, # 在停止接收和触发 a 之前等待连续帧的毫秒数
}
try:
self.canbus = can.interface.Bus(
bustype='vector',
app_name='Test_Can', # 根据实际情况修改
channel=0, # 根据实际情况修改
bitrate=500000 # 根据实际情况修改
) # CAN总线初始化
self.tp_addr = isotp.Address(isotp.AddressingMode.Normal_11bits, txid=txid, rxid=rxid) # 网络层寻址方法
tp_stack = isotp.CanStack(bus=self.canbus, address=self.tp_addr, params=isotp_params) # 网络/传输层(IsoTP 协议)
self.conn = PythonIsoTpConnection(tp_stack) # 应用层和传输层之间建立连接
except:
print(sys.exc_info()[1])
else:
print('CAN配置成功')
def uds_request_respond(self, request_command):
"""发送uds请求和接收uds响应"""
if not isinstance(request_command, str): # 判断request_command数据类型
request_command = str(int(request_command))
requestPdu = binascii.a2b_hex(request_command.replace(' ', '')) # 处理request_command
if not self.conn.is_open():
self.conn.open() # 打开连接
try:
self.conn.specific_send(requestPdu) # 发送uds请求
except:
print("发送请求失败")
else:
print('UDS发送请求:%s' % request_command)
try:
respPdu = self.conn.specific_wait_frame(timeout=3) # 接收uds响应
except:
print('响应数据失败')
else:
res = respPdu.hex().upper()
respond = ''
for i in range(len(res)):
if i % 2 == 0:
respond += res[i]
else:
respond += res[i] + ' '
print('UDS响应结果:%s' % respond)
self.conn.close() # 关闭连接
self.canbus.shutdown() # 关闭总线
return respond.strip()
4. .robot
public.robot
*** Settings ***
Library udstest.py # 导入自定义库
*** Variables ***
${txid} 0x772 # 用于传输的CANID
${rxid} 0x77A # 用于接收的CANID
*** Keywords ***
UDS_Test
[Arguments] ${test_data}
set_can ${txid} ${rxid} #CAN设置
${respond} Uds Request Respond ${test_data['request']} #UDS请求响应
Should Be Equal ${test_data['expected']} ${respond} #断言
eg.$10.robot
*** Settings ***
Suite Setup 获取$10服务测试数据
Test Setup
Test Teardown
Resource Public.robot
*** Test Cases ***
正响应-启动车载信息会话
UDS_Test ${test_data[0]}
sleep 10
负响应-不支持请求服务子功能
UDS_Test ${test_data[1]}
负响应-请求报文数据长度不符合标准
UDS_Test ${test_data[2]}
*** Keywords ***
获取$10服务测试数据
${test_data} Get Xlsx $10
Set Suite Variable ${test_data}
5.导入的excel表格
6.结果