首页 > 其他分享 >关键字 开发-06 封装yaml文件直接生成测试用例

关键字 开发-06 封装yaml文件直接生成测试用例

时间:2023-11-28 21:25:40浏览次数:37  
标签:06 yaml 测试用例 file import fun path data

前言

前面几个章节,我们主要是如何通过yaml文件的数据自动转换成测试用例,并按照关键字去执行,如下是之前我们通过参数化的形式手动执行用例。

from utils.run import RunByKey

# 获取文件路径
file_path = Path(__file__).parent.joinpath('data', 'login.yml')

@pytest.mark.parametrize('key, value', read_file.read_yaml(file_path)['data'])
def test_login(key, value, base_url):
    print(f"测试用例名称: {value['name']}")
    print(f"测试数据: {value['request']}")  # data ---dict
    print(f"base_url: {base_url}")
    s = HttpSession(base_url=base_url)
    run = RunByKey(s, read_file.read_yaml(file_path)['config'])
    run.run(value)

现在我们继续封装,不进行手动参数化方式执行用例。也就是我们连上面的代码也无需写,只通过yaml文件直接执行用例。
如果认真点,我们就会发现,在05章节中的最后一张图中,也就是我们动态生成测试用例函数的时候,我们会发现一个问题:如下所示:

1.Python经典问题

上面的问题我们叫做python经典问题,如何去解决这个问题呢?
首先我们举个例子,来分析下这个问题形成的过程:

res = []
data = {"testa": "aaa", "testb": "bbb"}
for key, value in data.items():
  def fun():
    print(value)
  res.append(fun)
print(res)
for f in res:
f()

打印结果:
[<function fun at 0x0000020D5DC76280>, <function fun at 0x0000020D5DDFC280>]
bbb
bbb

分析:

1.for 循环data里面的数据,函数在循环内部定义,但是未调用
2.在for循环内部将函数对象添加到res列表中
3.for循环调用函数f(),而此时的value值取最新的为第二个“bbb”,于是打印2个bbb

1.1 解决函数对象调用后,内部值被覆盖的问题

解决思路,我们首先需要确定函数被谁调用, 然后知道被谁调用后单独取出这个函数对应的值。

import inspect

import inspect
def fun():
    # 被谁调用
    call_function_name = inspect.getframeinfo(inspect.currentframe().f_back)[2]
    print(call_function_name)
    return "33"
def fun_x():
    fun()
def fun_y():
    fun()
fun_x()
fun_y()

打印:
fun_x
fun_y

于是我们在执行yaml的函数中,添加这个方法:

from pytest import Module, Function
import types
import yaml
from utils.run import RunYaml
import inspect
from utils.create_function import create_function_from_parameters
from inspect import Parameter

def pytest_collect_file(file_path, parent):
    # 查找test开头的文件
    if file_path.suffix in ['.yml', '.yaml'] and (file_path.name.startswith('test') or file_path.name.endstartswith('test')):
        print(f'yaml文件路径:{file_path}')
        print(f'yaml文件路径名称:{file_path.stem}')

        # 构造 pytest 框架的 Module,module由Package构建,Package由系统构建
        py_module = Module.from_parent(parent, path=file_path)

        # 动态创建测试module模块(.py文件),这里才能给下面的_getobj进行导入
        MyModule = types.ModuleType(file_path.stem)

        from utils.read_file import read_yaml
        from pathlib import Path
        file_path = Path(__file__).parent.joinpath('data', 'login.yml')
        raw_data = read_yaml(file_path)['data']
        for key, value in raw_data:
            def foo(arg):
                print(f"执行的参数: {arg}")
                call_function_name = inspect.getframeinfo(inspect.currentframe().f_back)[2]
                raw_data_dict = dict(raw_data)
                print(f"执行的内容: {raw_data_dict[call_function_name]}")

            f = create_function_from_parameters(func=foo,
                                                parameters=[Parameter('request', Parameter.POSITIONAL_OR_KEYWORD)],
                                                documentation="some doc",
                                                func_name=key,
                                                func_filename="main.py")
            # 向 module 中加入test 函数
            setattr(MyModule, key, f)

        # 重写_getobj,返回自己定义的Mymodule
        py_module._getobj = lambda: MyModule

        return py_module

标签:06,yaml,测试用例,file,import,fun,path,data
From: https://www.cnblogs.com/dack-zt-deng/p/17863088.html

相关文章

  • Linux 06
    第六章I/O重定向与管道本章学习目标:1.掌握输入/输出重定向2.熟悉管道符的应用3.了解进程管道相关知识一、I/O重定向I/O重定向:I/O重定向是一种操作系统的功能,它允许用户将标准输入0(stdin)和标准输出 1(stdout)重定向到其他文件或设备上。通过使用I/O重定向,用户可以将程序......
  • 软件测试/人工智能|基于录制的接口测试用例自动生成技术探究
    导言在现代软件开发中,接口测试是确保系统功能和性能的关键步骤。然而,手动编写接口测试用例往往耗费大量时间和资源。基于录制的接口测试用例自动生成技术通过简化这个流程,显著提高了测试效率和准确性。录制接口测试用例自动生成技术简介录制接口测试用例自动生成技术允许开发......
  • 软件测试/人工智能|使用 GraphWalker 实现自动化测试用例生成
    导言在软件开发中,测试是确保代码质量和稳定性的关键步骤之一。而自动生成测试用例可以大大提高测试效率和覆盖率。GraphWalker是一个基于模型的测试工具,能够帮助开发者通过定义和遍历图模型来自动生成高质量的测试用例。GraphWalker简介GraphWalker是一个开源的测试工具,它......
  • 接口自动化测试用例的设计
     做接口自动化的前提,需设计接口自动化测试用例--设计接口自动化测试用例的前提:如下一、搞清接口测试的目的: 二、搞清接口测试的优先级:三、搞清接口测试的业务逻辑和应用场景1、单接口场景的测试---如:登录2、依赖接口场景的测试---如:需先登录获取token,方能进行后续接口的......
  • C++U4-第06课-二分答案
    上节课作业解析链接:https://pan.baidu.com/s/1QCDg1GXb5HhrpkPgomOCyg?pwd=s4b4提取码:s4b4二分答案学习目标二分查找单调性意思 二分答案单调性 二分答案的思路[【二分答案】砍树(简单版)]枚举每一棵树,注意当锯片高度高于树的高度时砍的树木是0。#include<io......
  • pytest + yaml 框架 -39.多账号操作解决方案
    前言最近有小伙伴提到,有写场景需要用到2个账号来回切换操作该如何解决。(备注:从v1.2.4以后新版本不再公开,新功能内部VIP学员可以使用,公开版本仅解决bug,不提供新功能了。)先获取账号token前面教程有讲到全局登录一次,后面所有的请求都会拿着全局登录的账号token去访问请求。现在......
  • P1090 [NOI洛谷P2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G
    可以用堆来实现,或者更简单一点的优先队列优先队列:#include<queue>priority_queue<int,vector<int>,greater<int>>q;因为每次合并后,最小的两个值都会更新,所以可以很好的利用优先队列内元素有序的特点,减少因反复排序带来的时间复杂度;一开始我用STL自带的排序sort,报了5个TLE,后来意......
  • 关键字 开发-05 读取yaml文件内容动态生成用例
    前言在第一篇文章中,我们讲过了通过钩子函数pytest_collect_file可以收集到yaml格式的用例,并且可以生成测试用例。想要动态生成测试用例,也就是动态生成测试函数,然后pytest收集到test开头的func,执行测试函数。关键代码如下所示:defrun_function(*args,**kwargs):print("测......
  • 九齐单片机IC NY8B062F SOP14 SOP16 SOP8 SOT23-6MCU芯片
    九齐单片机NY8B062F SOP14 SOP16 SOP8 SOT23-6MCU芯片一、概述九齐单片机NY8B062F是一种多功能8位单片机,采用先进的CMOS工艺,具有低功耗、高速度、高可靠性等特点。芯片内置丰富的外设和存储器资源,包括8位CPU、时钟发生器、PWM模块、I/O端口、EEPROM、RAM和Flash存储器等。适用......
  • py06-函数
    六、函数:1、定义:组织好的、可重复使用的、用来实现特定功能的代码段,将功能封装在函数内,可供随时随地重复利用,提高代码的复用性,减少重复代码,提高开发效率2、语法:def函数名(可传参数):函数体return返回值调用:变量=函数(参数)注意:(1)先定义函数,后调用函数(2)参数不......