当前位置: 首页 > article >正文

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.结果

在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/a/513713.html

相关文章:

  • 目标跟踪算法发展简史
  • 《keras 3 内卷神经网络》
  • 【KOA框架】koa框架基础及swagger接口文档搭建
  • python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)角点检测
  • CentOS9 安装Docker+Dpanel+onlyoffice(https、更改字体、字号、去除限制)的避坑笔记
  • Kinova仿生机械臂Gen3搭载BOTA 力矩传感器SeneOne:彰显机器人触觉 AI 与六维力传感的融合力量
  • UDP/TCP ②-三次握手 || 四次挥手 || 确认应答 || 超时重传
  • Single-Model and Any-Modality for Video Object Tracking——2024——cvpr-阅读笔记
  • 深入解析迁移学习:Transfer Learning模型介绍
  • Spring AI SafeGuardAdvisor
  • JSqlParser:Java SQL 解析利器
  • Codeforces Round 998 (Div. 3)(部分题解)
  • sql:权限管理、存储过程、视图、触发器
  • 从零搭建一套远程手机的桌面操控和文件传输的小工具
  • 小土堆学习笔记10(利用GPU训练于模型验证)
  • 【论文复现】基于改进鲸鱼优化算法的太阳能光伏模型参数提取问题
  • 嵌入式Linux驱动开发之从设备树到点亮LED
  • 使用 Python 获取淘宝商品描述的 API 接口实现与应用
  • C# 委托和事件(事件)
  • 如何用vscode断点调试Vue.js的项目
  • 在亚马逊云科技上用AI提示词优化功能写出漂亮提示词(上)
  • 解决windows系统远程桌面(或其他全屏应用)全屏后菜单栏不自动消失问题
  • Python多态的概念
  • R语言基础| 回归分析
  • ubuntu下安装gvim
  • 面试-字符串1