【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.flush
	if(timeout > 0):
		time.sleep(timeout)
	at_response = serial_port.readall().decode()
	report_info(at_response, logging.DEBUG)
	return at_response

def capture_response_with_retry(serial_port, at_response, des_str, timeout_step, timeout_retraymax):
	retray = 1
	while(retray < timeout_retraymax):
		if(at_response != ""):
			report_info(at_response, logging.DEBUG)	
			if (at_response.find(des_str) != -1):
				return 0
		retray = retray + 1
		serial_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 -1
	return 0

def retry_send_str(serial_port, at_response, src_str, des_str, count, timeout):
	index = 1
	while(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 0
		index = index + 1
	if(index >= count):
		report_info("don't find", logging.ERROR)
		return -1
	return 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 -1
	return 0

def csq_test(serial_port):
	at_response = send_at(serial_port, "AT+CSQ\r\n", 0.5)
	if(at_response.find("+CSQ:") == -1):
		return -1
	return 0

def 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 0
	return -1

def internet_at(serial_port):
	ret = 0
	if(at_test(serial_port) == -1):
		ret = -1
	if(csq_test(serial_port) == -1):
		ret = -1
	if(cereg_test(serial_port) == -1):
		ret = -1
	return 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将其作为可视化测试工具,结合数据库,更方便的用来管理模块化测试用例,后续持续更新。。。

若有错误,欢迎指正

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落淼喵_G

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值