pytest+allure+excel实现python调CANoe进行诊断自动化测试(三)

接下来都是完整项目源码实现

本篇主要是com部分excel操作和安全解锁的方法

execute_excel.py

from openpyxl import load_workbook

def get_data_from_excel(file, sheet_name=None):
    """
    获取excel文件中指定表里的数据
    :param file:
    :param sheet_name:
    :return:
    """

    #读取excel文件
    wb = load_workbook(file)
    #读取对应表
    if sheet_name is None:
        ws = wb.active
    else:
        ws = wb[sheet_name]

    #创建一个列表容器存放数据
    data = []
    #获取表头,作为字典的key
    row_list = list(ws.rows)
    title = [item.value for item in row_list[0]]
    #获取其他数据
    for row in row_list[1:]:
        #获取每一行的数据
        temp = [i.value for i in row]
        #将表头与这一行数据打包成字典
        data.append(dict(zip(title, temp)))
    return data


def write_excel(file, sheet_name=None, actual_result=None, status=None, time_str=None, row=None, actual_name=None, status_name=None, date_name=None):
    """
    向excel中写入内容
    :param file: excel文件名
    :param sheet_name:  sheet页名称
    :param actual_result:  实际结果
    :param status:  测试结果
    :param row:  行
    :param actual_name:  实际结果列名
    :param status_name:  判断结果列名
    :return:
    """
    # 打开excel文件
    wb = load_workbook(file)
    # 读取对应表
    if sheet_name is None:
        sheet = wb.active
    else:
        sheet = wb[sheet_name]

    # 查找第一行,如果第一行名称等于传入的实际结果名称记录列号
    for cell in sheet[1]:
        if cell.value == actual_name:
            actual_column = cell.column
            break
    for cell in sheet[1]:
        if cell.value == status_name:
            status_column = cell.column
            break
    for cell in sheet[1]:
        if cell.value == date_name:
            date_column = cell.column
            break

    actual_string = '\n'.join(actual_result)

    sheet.cell(row=row, column=actual_column).value = actual_string  # 对应行列写入值
    sheet.cell(row=row, column=status_column).value = status
    sheet.cell(row=row, column=date_column).value = time_str
    wb.save(file)


if __name__ == '__main__':
    res = get_data_from_excel(r"D:\svn\NAVECO\A7_SoftwareTest\B1_B样测试\动态测试\软件合格性测试\Bootloader刷写\BootLoader_TestCase1.xlsx","诊断服务测试")
    print(res)

security_key.py

import ctypes
import configparser
from ctypes import *
from comm.canoe_application import *

config = configparser.ConfigParser()
# 读取 properties 文件,并指定编码格式为 UTF-8
config.read("./config.ini", encoding="utf-8")

# 获取安全算法dll路径
security_file = config.get("Security", "security_path")

def security_key(seed_list):

    """
    计算出安全密钥
    :param seed_list: 种子
    :return: 密钥
    """
    security_path = security_file
    mylib = ctypes.WinDLL(security_path)
    # print("key_list========",key_list)
    # print(type(key_list))
    res = seed_list.rstrip()
    ressplit = res.split(" ")
    try:
        hex_list = [int(i, 16) for i in ressplit]
        seed = (ctypes.c_byte * 4)(hex_list[2], hex_list[3], hex_list[4], hex_list[5])
        key = (ctypes.c_byte * 4)()
        keylength = ctypes.c_int(4)
        mylib.GenerateKeyExOpt(
            ctypes.pointer(seed),
            ctypes.c_int(4),
            ctypes.c_int(1),
            POINTER(c_char)(),
            POINTER(c_char)(),
            ctypes.pointer(key),
            ctypes.c_int(4),
            ctypes.pointer(keylength),
        )
        reqlist = []
        for i in range(len(key)):
            reqlist.append((hex(key[i] & 0xFF)).strip("0x"))

        for m in range(len(reqlist)):
            if len(reqlist[m]) == 1:
                reqlist[m] = "0" + reqlist[m]
        # print("reqlist:", reqlist)
        req = ''.join(list(map(str, reqlist)))
    except Exception as e:
        e = "Request Error"
        req = e
    return req

可能会遇到的报错及解决方案

报错:OSError: exception: access violation writing 0x00000007解决方法

GenerateKeyExOpt的参数需要注意,确认好dll中该函数的参数内容是多少,如果确认不了一般可以去掉第5个参数POINTER(c_char)()尝试一下,我写的时候在网上找的方法,不知道GenerateKeyExOpt具体的参数内容就碰到过该错误,排查了好久,最后加了第5个参数POINTER(c_char)()就好了

如果还是不行,可能是方法的名称不对,换一个尝试一下

mylib.ExGenerateKeyEx (
    ctypes.pointer(seed),
    ctypes.c_int(4),
    ctypes.c_int(1),
    POINTER(c_char)(),
    ctypes.pointer(key),
    ctypes.c_int(4),
    ctypes.pointer(keylength),

报错:OSError: [WinError 193] %1 不是有效的 Win32 应用程序

就要检查python和dll是不是都是32位或者都是64位的了,一般情况下dll是32位的,把python改成32位即可

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python是一种广泛使用的编程语言,因其易学易用、灵活性和可扩展性而备受欢迎。requests是Python的一个库,它提供了一种简单且易于使用的方式来发送HTTP请求。pytestPython的另一个库,它提供了一种用于编写和运行测试的框架。allure是一个测试报告生成工具,可以为测试结果提供美观和易读的报告。 在接口自动化测试中,可以使用Python的requests库来发送HTTP请求,并使用pytest框架来编写和运行测试。可以使用Excel来存储测试数据、预期结果和实际结果。使用allure工具可以生成美观的测试报告。 以下是使用Python requests、pytestallure进行接口自动化测试的一般步骤: 1. 安装Python、requests、pytestallure 2. 创建一个Excel文件,输入测试数据、预期结果和实际结果 3. 创建一个pytest测试文件,并使用requests库发送HTTP请求,比较预期结果和实际结果 4. 在pytest测试文件中添加allure装饰器,以便生成测试报告 5. 运行pytest测试文件并生成allure测试报告 例如,以下是一个使用Python requests、pytestallure进行接口自动化测试的示例代码: ```python import requests import pytest import allure import openpyxl @allure.title("测试接口") @pytest.mark.parametrize("test_input, expected", [(1, "success"), (2, "fail")]) def test_api(test_input, expected): # 从Excel文件中获取测试数据和预期结果 wb = openpyxl.load_workbook("testdata.xlsx") sheet = wb.active test_data = sheet.cell(row=test_input, column=1).value expected_result = sheet.cell(row=test_input, column=2).value # 发送HTTP请求 response = requests.get("http://example.com/api", params=test_data) actual_result = response.text # 比较预期结果和实际结果 assert actual_result == expected_result, f"预期结果:{expected_result},实际结果:{actual_result}" # 添加allure描述 allure.attach("请求参数", str(test_data)) allure.attach("预期结果", str(expected_result)) allure.attach("实际结果", str(actual_result)) ``` 在上面的代码中,使用了pytest的parametrize装饰器来传递测试数据和预期结果。使用openpyxl库从Excel文件中获取测试数据和预期结果。使用requests库发送HTTP请求并比较预期结果和实际结果。使用allure的装饰器来添加测试描述。最后,运行pytest测试文件并生成allure测试报告。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值