PyCharm+RobotFramework框架实现UDS自动化测试- (四)项目实战0x10

news2025/2/24 13:35:52

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.coloradmin.cn/o/2280674.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt基础项目篇——Qt版Word字处理软件

一、核心功能 本软件为多文档型程序,界面是标准的 Windows 主从窗口 拥有:主菜单、工具栏、文档显示区 和 状态栏。 所要实现的东西,均在下图了。 开发该软件,主要分为下面三个阶段 1)界面设计开发 多窗口 MDI 程序…

USART_串口通讯轮询案例(HAL库实现)

引言 前面讲述的串口通讯案例是使用寄存器方式实现的,有利于深入理解串口通讯底层原理,但其开发效率较低;对此,我们这里再讲基于HAL库实现的串口通讯轮询案例,实现高效开发。当然,本次案例需求仍然和前面寄…

leetcode刷题记录(七十二)——146. LRU 缓存

(一)问题描述 146. LRU 缓存 - 力扣(LeetCode)146. LRU 缓存 - 请你设计并实现一个满足 LRU (最近最少使用) 缓存 [https://baike.baidu.com/item/LRU] 约束的数据结构。实现 LRUCache 类: * LRUCache(int capacity)…

C++ 类- 构造和析构

空类 class A {};空类大小: sizeof(A) 1编译器会默认生成 6 个成员函数: class A { public:A();//构造函数 - 完成对象初始化工作~A();//析构函数 - 完成对象的资源清理A(const A& a);//拷贝构造函数 - 使用同一类中之前创建的对象来初始化新创建…

ubuntu20.04有亮度调节条但是调节时亮度不变

尝试了修改grub文件,没有作用,下载了brightness-controllor,问题解决了。 sudo add-apt-repository ppa:apandada1/brightness-controller sudo apt update sudo apt install brightness-controller 之后在应用软件中找到brightness-contro…

macOS如何进入 Application Support 目录(cd: string not in pwd: Application)

错误信息 cd: string not in pwd: Application 表示在当前目录下找不到名为 Application Support 的目录。可能的原因如下: 拼写错误或路径错误:确保你输入的目录名称正确。目录名称是区分大小写的,因此请确保使用正确的大小写。正确的目录名…

包文件分析器 Webpack Bundle Analyzer

webpack-bundle-analyzer 是一个非常有用的工具,用于可视化和分析 Webpack 打包生成的文件。这使得开发者能够更好地理解应用的依赖关系、包的大小,以及优化打包的机会。以下是关于 webpack-bundle-analyzer 的详细介绍,包括它的安装、使用以…

【深度解析Java 20天速成】04_IDEA的安装与使用

【Why IDEA ?】 【注】JetBrains官方说明: 尽管我们采取了多种措施确保受访者的代表性,但结果可能会略微偏向 JetBrains 产品的用户,因为这些用户更有可能参加调查。 此外,2022年,某美国软件开发商在对近千名专业的Ja…

算法竞赛之差分进阶——等差数列差分 python

目录 前置知识进入正题实战演练 前置知识 给定区间 [ l, r ],让我们把数组中的[ l, r ] 区间中的每一个数加上c,即 a[ l ] c , a[ l 1 ] c , a[ l 2] c , a[ r ] c; 怎么做?很简单,差分一下即可 还不会的小伙伴点此进入学习 进入正题 …

【HarmonyOS NEXT】华为分享-碰一碰开发分享

关键词:鸿蒙、碰一碰、systemShare、harmonyShare、Share Kit 华为分享新推出碰一碰分享,支持用户通过手机碰一碰发起跨端分享,可实现传输图片、共享wifi等。我们只需调用系统 api 传入所需参数拉起对应分享卡片模板即可,无需对 U…

小程序 -- uni-app开发微信小程序环境搭建(HBuilder X+微信开发者工具)

目录 前言 一 软件部分 1. 微信开发者工具 2. HBuilder X 开发工具 二 配置部分 1. 关于 HBuilder X 配置 2. 关于 微信开发工具 配置 三 运行项目 1. 新建项目 2. 代码编写 3. 内置浏览器 编译 4. 配置小程序 AppID获取 注意 四 实现效果 前言 uni-app开发小程…

Element修改表格结构样式集合(后续实时更新)

场景 修改前端Element组件el-table样式 实现 线表格 <div class"tablepro"><el-table:data"tableData":header-cell-style"{ textAlign:center}"class"tablepro-table"borderstyle"width: 100%;height:100%"&g…

【C++】如何从源代码编译红色警戒2地图编辑器

【C】如何从源代码编译红色警戒2地图编辑器 操作视频视频中的代码不需要下载三方库&#xff0c;已经包含三方库。 一、运行效果&#xff1a;二、源代码来源及编程语言&#xff1a;三、环境搭建&#xff1a;安装红警2安装VS2022下载代码&#xff0c;源代码其实不太多&#xff0c…

[unity 高阶]使用ASE制作一个cubed的skybox的shader,跟做版本

第一步,导入ASE 此步骤不在此讲解,有时间再补充 第二步,创建shader 需要选择shader的类型,此处选择legacy/Unlit第三步,创建变量 根据默认shader中的变量 _Tint (“Tint Color”, Color) = (.5, .5, .5, .5)[Gamma] _Exposure (“Exposure”, Range(0, 8)) = 1.0_Rotat…

雷电9最新版安装Magisk+LSPosd(新手速通)

大家好啊&#xff01;我是NiJiMingCheng 我的博客&#xff1a;NiJiMingCheng 在安卓系统的定制与拓展过程中&#xff0c;获取 ROOT 权限以及安装各类框架是进阶玩家常用的操作&#xff0c;这可以帮助我们实现更多系统层面的个性化功能。今天&#xff0c;我将为大家详细介绍如何…

Spring Boot Starter介绍

前言 大概10来年以前&#xff0c;当时springboot刚刚出现并没有流行&#xff0c;当时的Java开发者们开发Web应用主要是使用spring整合springmvc或者struts、iBatis、hibernate等开发框架来进行开发。项目里一般有许多xml文件配置&#xff0c;其中配置了很多项目中需要用到的Be…

PyTorch使用教程(4)-如何使用torch.nn构建模型?

torch.nn 是 PyTorch 深度学习框架中的一个核心模块&#xff0c;专门用于构建和训练神经网络。它提供了一系列用于构建神经网络所需的组件&#xff0c;包括层&#xff08;Layers&#xff09;、激活函数&#xff08;Activation Functions&#xff09;、损失函数&#xff08;Loss…

Qt之QDjango-db的简单使用

QDjango是一款由C编写、依托于Qt库的Web开发框架&#xff0c;其设计理念受到了广受欢迎的Python框架Django的影响。这个项目旨在提供一个高效、灵活且易于使用的工具集&#xff0c;帮助开发者构建高质量的Web应用。其项目地址: https://gitcode.com/gh_mirrors/qd/qdjango&…

音频入门(二):音频数据增强

本文介绍了一些常见的音频数据增强方法&#xff0c;并给出了代码实现。 目录 一、简介 二、代码 1. 安装必要的库 2. 代码 3. 各函数的介绍 4. 使用方法 参考&#xff1a; 一、简介 音频数据增强是机器学习和深度学习领域中用于改善模型性能和泛化能力的技术。 使用数据…

【C++】引用(上)

1、引用的基本使用 作用&#xff1a;给变量起别名 语法&#xff1a;数据类型&#xff08;该数据类型要与原名的数据类型一致&#xff09; &别名原名&#xff1b; 示例&#xff1a; #include<iostream> using namespace std; int main() {int a 10;int& …