【unittest】TestSuite搭建测试用例示例二

1.1 打开串口示例

常用的模组则包含AT指令测试,或串口数据测试,则可添加串口配置,将指令通过串口发送出去,如下所示:

import serial  def open_serial_port(port, baudrate=115200, timeout=2):  try:  # 创建并配置串行端口对象  serial_port = serial.Serial(port=port, baudrate=baudrate, timeout=timeout)  # 如果需要,可以在这里添加更多的配置代码  # 检查端口是否成功打开  if serial_port.isOpen():  print(f"Serial port {port} opened successfully.")  return serial_port  else:  raise Exception(f"Failed to open serial port {port}.")  except serial.SerialException as e:  print(f"Error opening serial port {port}: {e}")  return None  # 使用示例  
if __name__ == "__main__":  port = "COM23"  baudrate = 115200  timeout = 2  serial_port = open_serial_port(port, baudrate, timeout)  if serial_port:  print("Open serial success.")# 这里可以添加使用 serial_port 的代码  pass  else:  print("Failed to open serial port.")exit(1) #直接退出程序
1.2 导入多个测试用例示例

本文以移远模组为示例,则对模组信号查询与网络查询AT指令进行测试,常用的指令为:
在这里插入图片描述

则本文以其进行示例创建测试用例

首先,创建一个log打印的py文件名为at_log_set.py,将直接使用 Python 的日志级别将其映射,更方面的管理日志。

import sys
import serial
import time
import logging
from time import strftime, localtime# 配置日志  
logging.basicConfig(level=logging.DEBUG, filename='log.txt')  
# 创建一个handler,用于将日志输出到控制台  
console_handler = logging.StreamHandler(sys.stdout)  
console_handler.setLevel(logging.DEBUG)  
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')  
console_handler.setFormatter(formatter)  
logger = logging.getLogger(__name__)  
logger.addHandler(console_handler)  def report_info(loginfo, loglevel=logging.DEBUG):logger.log(loglevel, loginfo)def send_at(serial_port, at_str, timeout):report_info(at_str, logging.DEBUG)serial_port.write(at_str.encode())serial_port.flushif(timeout > 0):time.sleep(timeout)at_response = serial_port.readall().decode()report_info(at_response, logging.DEBUG)return at_responsedef capture_response_with_retry(serial_port, at_response, des_str, timeout_step, timeout_retraymax):retray = 1while(retray < timeout_retraymax):if(at_response != ""):report_info(at_response, logging.DEBUG)	if (at_response.find(des_str) != -1):return 0retray = retray + 1serial_port.flush()time.sleep(timeout_step)at_response = serial_port.readall().decode()if(retray >= timeout_retraymax):report_info("timeout_retraymax don't find", logging.ERROR)return -1return 0def retry_send_str(serial_port, at_response, src_str, des_str, count, timeout):index = 1while(index < count):at_response = send_at(serial_port,src_str, timeout)if(at_response != ""):report_info(at_response, logging.DEBUG)if (at_response.find(des_str) != -1):return 0index = index + 1if(index >= count):report_info("don't find", logging.ERROR)return -1return 0

新建一个python文件,at_internet_test.py,代码如下:

import sys
import serial
import unittest
from at_log_set import *def at_test(serial_port):at_response = send_at(serial_port, "AT\r\n", 0.5)if(at_response.find("OK") == -1):return -1return 0def csq_test(serial_port):at_response = send_at(serial_port, "AT+CSQ\r\n", 0.5)if(at_response.find("+CSQ:") == -1):return -1return 0def cereg_test(serial_port):at_response = send_at(serial_port, "AT+CEREG?\r\n", 0.5)if(retry_send_str(serial_port, at_response,  "AT+CEREG?\r\n", "+CEREG:0,1", 10, 0.5) == 0):return 0return -1def internet_at(serial_port):ret = 0if(at_test(serial_port) == -1):ret = -1if(csq_test(serial_port) == -1):ret = -1if(cereg_test(serial_port) == -1):ret = -1return ret

将之前所示的串口和测试用例放到一起,则为main.py, 如下所示:

import unittest
from unittestreport import TestRunner
import os
import serial
from at_log_set import *
from at_internet_test import *def open_serial_port(port, baudrate=115200, timeout=2):  try:  serial_port = serial.Serial(port=port, baudrate=baudrate, timeout=timeout)   if serial_port.isOpen():  print(f"Serial port {port} opened successfully.")  return serial_port  else:  raise Exception(f"Failed to open serial port {port}.")  except serial.SerialException as e:  print(f"Error opening serial port {port}: {e}")  return None  class TestInternetAT(unittest.TestCase):def test_internet_at(self):self.assertEqual(0, internet_at(serial_port))# 创建 TestSuite 实例  
suite = unittest.TestSuite()  
suite.addTest(TestInternetAT("test_internet_at"))  BasePath = os.path.dirname(__file__)#获取当前文件所在路径
if __name__ == "__main__":port = "COM7"  baudrate = 115200  timeout = 2  serial_port = open_serial_port(port, baudrate, timeout)  if serial_port:  print("Open serial success.")  else:  print("Failed to open serial port.")exit(1)if not os.path.isdir("report"):os.mkdir("report")fp = BasePath + "\\report" #特别需要注意的是 report文件是已存在的,否则会报错runner = TestRunner(suite,filename="TEST测试报告.html",report_dir=fp,title="TEST测试报告",tester="USER1",desc="20240731执行测试")runner.run()

则可将该测试用例导入测试,若有其他模块的测试用例,可参考该测试用例进行导入,之后则运行main.py,则将测试报告显示在report文件夹下
运行log如下图所示:
在这里插入图片描述

也可通过tkinter将其作为可视化测试工具,结合数据库,更方便的用来管理模块化测试用例,后续持续更新。。。

若有错误,欢迎指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/392571.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cocos Creator2D游戏开发(10)-飞机大战(8)-计分和结束

现在游戏基本能完了, 飞机能发射子弹,打了敌机,敌机也能炸; 接下来要做计分了; 步骤: 搞出一个lable让lable显示炸了多少飞机 开搞: ①创建一个Lable标签 ② root.ts文件 添加 property(Label) player_score: Label; // 标签属性 标签绑定 ③ 代码添加 注册 然后回调 contac…

计算机网络-数据链路层

基本概念 数据链路和链路 链路&#xff1a;指的是从一个节点到相邻节点的一段物理线路&#xff0c;且中间没有任何其他的交换节点 数据链路&#xff1a;传输数据时&#xff0c;除了一条物理线路&#xff0c;还需要一些必要通信协议来控制这些传输。 数据链路层的三个基本问…

【架构】客户端优化

这篇文章总结一下服务器网关及之前部分的优化&#xff0c;如客户端的优化&#xff0c;CDN/DNS等。 这里我们先谈一谈客户端缓存优化的手段。一般我们后端在说到缓存&#xff0c;第一时间想到的往往是redis&#xff0c;其实缓存在架构层次还有很多其他可以实现的地方&#xff0…

度言软件介绍

度言软件管理员操作后台 https://www.duyansoft.com企业后台为公司管理员操作后台&#xff0c;共计有七个功能版块 控制台 成员管理——员工管理 成员管理——员工管理&#xff08;添加员工&#xff09; 成员管理——团队管理 公司管理员可以新建/编辑/删除团队&#xff0c…

SSM整合快速学习

目录 步骤&#xff1a; 一、环境搭建 1.创建JdbcConfig配置类 2.创建JdbcConfig配置类 3.创建MybatisConfig配置类 4.创建jdbc.properties 5.创建SpringMVC配置类 6.创建Web项目入口配置类 二、功能模块开发 步骤1:创建数据库及表 步骤2:编写模型类 步骤3:编写Dao接…

Java面试题--JVM大厂篇之Java中Parallel GC的调优技巧与最佳实践

目录 引言&#xff1a; 正文&#xff1a; 1. 理解Parallel GC的工作原理 2. 常见痛点与解决方案 痛点一&#xff1a;长时间暂停 痛点二&#xff1a;频繁的Minor GC 痛点三&#xff1a;内存溢出 3. 调优参数推荐 4. 实战经验分享 结束语&#xff1a; 引言&#xff1a;…

定时任务-xxl-job

一. 为什么定时任务可以定时执行 定时任务可以定时执行的原理是通过操作系统提供的定时器实现的。 以下是定时任务能够准时执行的基本原理和相关技术&#xff1a; 操作系统的调度器&#xff1a; 操作系统&#xff08;如Linux、Windows等&#xff09;内部都有一个调度器&#x…

electron 配置、打包 -报错解决

目录 一、配置途中遇到的问题&#xff1a; 二、 make 配置好后开始打包 三、Electron-builder 打包报错 一、配置途中遇到的问题&#xff1a; 1. 安装 yarn add electron -D 一直卡在这里失败 一直卡可以使用下面这个&#xff0c;然后再重新装依赖 1. 采用新的镜像地址 npm …

机械学习—零基础学习日志(高数22——泰勒公式理解深化)

核心思想&#xff1a;函数逼近 在泰勒的年代&#xff0c;如果想算出e的0.001次方&#xff0c;这是很难计算的。那为了能计算这样的数字&#xff0c;可以尝试逼近的思想。 但是函数又不能所有地方都相等&#xff0c;那退而求其次&#xff0c;只要在一个极小的范围&#xff0c;…

Modbus-RTU详解

目录 Modbus-RTU协议 帧结构示例 CRC16校验算法 CRC16算法的过程 modbus-rtu的使用 发送数据 接收数据 tcp网口完整实现modbus-rtu协议 使用NModbus4实现modbus-rtu协议 安装NModbus4库。 串口实现NModbus4 Modbus-RTU协议 Modbus RTU 协议是一种开放的串行协议&#xff0c;广…

GroupMamba实战:使用GroupMamba实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

26集 ESP32 AIchat启动代码分析-《MCU嵌入式AI开发笔记》

26集 ESP32 AIchat启动代码分析-《MCU嵌入式AI开发笔记》 这集我们分析代码如何组织起来&#xff0c;如何编译 先用sourceinsight把代码加进工程。 新建一个sourceinsight工程&#xff0c;把AI-CHAT代码加进来&#xff0c;之后把ESP IDF代码加进来&#xff0c;之后把ESP-ADF加…

大语言模型(LLM)文本预处理实战

大语言模型&#xff08;LLM&#xff09;文本预处理实战 文章目录 大语言模型&#xff08;LLM&#xff09;文本预处理实战2.1 理解词嵌入2.2 文本分词2.3 将 token 转换为 token ID2.4 添加特殊上下文 token2.5 字节对编码 (BytePair Encoding, BPE)2.6 使用滑动窗口进行数据采样…

sql注入部分总结和复现

一个端口对应一个服务 联合查询注入 所有的程序中&#xff0c;单双引号必须成对出现 需要从这个引号里面逃出来 在后面查询内容 ?id1 要查库名&#xff0c;表名&#xff0c;列名。但是联合查询要知道有多少列&#xff0c;所以通过order by 去查询 order by # 通过二分法…

Cartopy简介和安装

Cartopy 是一个开源免费的第三方 Python 扩展包&#xff0c;由英国气象办公室的科学家们开发&#xff0c;支持 Python 2.7 和 Python 3&#xff0c;致力于使用最简单直观的方式生成地图&#xff0c;并提供对 matplotlib 友好的协作接口。初学Cartopy&#xff0c;欢迎指正&#…

算法回忆录(3)

11. 假设有7个物品&#xff0c;它们的重量和价值如下表所示。若这些物品均不能被分割&#xff0c;且背包容量M&#xff1d;150&#xff0c;设计算法求解怎么装才能使得获取的价值最大&#xff1f;请写出伪代码。 #include <stdio.h>#define MAX_ITEMS 100 #define …

新手小白嵌入式单片机教程,ESP32

1.什么是ESP32。 ESP32是一款由乐鑫信息科技&#xff08;Espressif Systems&#xff09;推出的高度集成的低功耗系统级芯片&#xff08;SoC&#xff09;&#xff0c;它结合了双核处理器、无线通信、低功耗特性和丰富的外设&#xff0c;特别适用于各种物联网&#xff08;IoT&am…

Robot Operating System——深度解析单线程执行器(SingleThreadedExecutor)执行逻辑

大纲 创建SingleThreadedExecutor新增Nodeadd_nodetrigger_entity_recollectcollect_entities 自旋等待get_next_executablewait_for_workget_next_ready_executableTimerSubscriptionServiceClientWaitableAnyExecutable execute_any_executable 参考资料 在ROS2中&#xff0c…

python 爬虫入门实战——爬取维基百科“百科全书”词条页面内链

1. 简述 本次爬取维基百科“百科全书”词条页面内链&#xff0c;仅发送一次请求&#xff0c;获取一个 html 页面&#xff0c;同时不包含应对反爬虫的知识&#xff0c;仅包含最基础的网页爬取、数据清洗、存储为 csv 文件。 爬取网址 url 为 “https://zh.wikipedia.org/wiki/…

数据结构:基于顺序表实现通讯录系统(含源码)

目录 一、前言 二、各个功能的实现 2.1 初始化通讯录 2.2 添加通讯录数据 2.3 查找通讯录数据 2.4 删除通讯录数据 2.5 修改通讯录数据 2.6 展示通讯录数据​编辑 2.7 销毁通讯录数据 三、添加菜单和测试 四、完整源码 sxb.h sxb.c contact.h contact.c test.c 一、前…