pytest用例间参数传递的两种实现方式示例

 更新时间:2021年12月26日 11:02:12   作者:核桃大大王  
pytest提供了许多运行命令以供定制化运行某一类测试用例或者某个测试用例等,下面这篇文章主要给大家介绍了关于pytest用例间参数传递的两种实现方式,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

前言

我们在做接口自动化测试的时候,会经常遇到这种场景:接口A的返回结果中的某个字段,是接口B的某个字段的入参。如果是使用postman,那我们可以通过设置后置变量,然后在需要使用的地方通过{{}}的方式来进行调用。但是如果是使用自己写的测试框架中要如何实现呢?我想到的是如下三种方法。

首先说明一下,以下三种方式均是通过python + pytest来实现的

一、通过conftest创建全局变量

conftest.py文件是pytest框架中很有用的一个东西,首先看下官方文档中的解释:

大概意思就是说,conftest.py文件供整个用例目录(conftest.py文件可以有多个,并且只在当前package下生效)使用而无需导入,也就是说在用例目录是conftest中的信息是公用的,例如:

a/conftest.py:
    def pytest_runtest_setup(item):
        # called for running each test in 'a' directory
        print("setting up", item)
 
a/test_sub.py:
    def test_sub():
        pass
 
test_flat.py:
    def test_flat():
        pass
 

运行后的结果:

pytest test_flat.py --capture=no  # will not show "setting up"

pytest a/test_sub.py --capture=no  # will show "setting up"

而我们就可以通过conftest + fixture函数来实现我们想要的效果了,具体代码如下:

# conftest.py
 
# 定义一个全局变量,用于存储内容
global_data = {}
 
@pytest.fixture
def set_global_data():
    """
    设置全局变量,用于关联参数
    :return:
    """
 
    def _set_global_data(key, value):
        global_data[key] = value
 
    return _set_global_data
 
@pytest.fixture
def get_global_data():
    """
    从全局变量global_data中取值
    :return:
    """
 
    def _get_global_data(key):
        return global_data.get(key)
 
    return _get_global_data
 
 

简单说一下实现逻辑:

  1. 首先定义一个变量global_data用于接收存储用例返回的结果
  2. set_global_data和get_global_data两个fixture方法顾名思义,set方法是往global_data中存数据,get方法是从global_data中取数据

方法实现了,具体应该怎么使用呢?如下:

 
# test_get_set.py
 
import requests
import pytest
 
 
 
def test_set(set_global_data):
    res = requests.get("http://www.baidu.com")
    status_code = res.status_code
    logger.info(f"请求返回状态码:{status_code}")
    set_global_data("status_code", status_code)
 
 
def test_get(get_global_data):
    data = get_global_data("status_code")
    logger.info(f'通过get_global_data方法获取的值:{data}')
 
 
if __name__ == '__main__':
    pytest.main(['-sv', 'test_get_set.py'])

返回结果:

test_get_set.py::test_set PASSED

2021-12-24 17:58:37.642 | INFO     | cases.test_get_set:test_set:19 - 请求返回状态码:200

2021-12-24 17:58:37.643 | INFO     | cases.test_get_set:test_get:25 - 通过get_global_data方法获取的值:200

test_get_set.py::test_get PASSED

============================== 2 passed in 0.06s ===============================

通过这种方式,便实现了用例间的参数传递问题。

在实际工作中,因为涉及到的接口、用例会很多,所以可以根据需要使用不同的conftest进行管理。并且存储的数据结构也需要进行规范区分,如使用方法名作为字典的key。

二、使用tmpdir_factory方法

第二种方法,是使用pytest的tmpdir和tmpdir_factory两个夹具函数,同样是通过conftest文件来实现。仍然是先来看下官方文档针对这两个方法的说明:

简单来说,这两个方法的作用就是为每个测试方法创建一个临时目录用于存储自定义的文件,这个临时目录会默认保存3个sessions,之后就会按照创建的顺序删除旧的目录。看下官方的例子:

# content of test_tmpdir.py
def test_create_file(tmpdir):
    p = tmpdir.mkdir("sub").join("hello.txt")
    p.write("content")
    assert p.read() == "content"
    assert len(tmpdir.listdir()) == 1
    assert 0
# contents of conftest.py
import pytest
 
 
@pytest.fixture(scope="session")
def image_file(tmpdir_factory):
    img = compute_expensive_image()
    fn = tmpdir_factory.mktemp("data").join("img.png")
    img.save(str(fn))
    return fn
 
 
# contents of test_image.py
def test_histogram(image_file):
    img = load_image(image_file)
    # compute and test histogram

我在实际项目中的使用:

仍是在conftest.py文件中自定义一个夹具函数,返回结果是一个元组,p是tmpdir_factory方法返回的对象,转为字符串之后就是文件存储的路径。

自定义一个名为“apitest-tmp-dir”的文件夹用于存储文件

# conftest.py
 
@pytest.fixture
def tmp_factory(tmpdir_factory):
    """
    生成临时目录
    """
    p = tmpdir_factory.mktemp('apitest-tmp-dir')
    logger.info("当前临时文件的目录为:" + str(p))
    return p, str(p)

在测试方法中的使用

 
# test_get_set.py
 
import requests
import pytest
import json
 
 
def test_set(tmp_factory):
    res = requests.get("http://www.baidu.com")
    status_code = res.status_code
    logger.info(f"返回状态码:{status_code}")
 
    logger.debug(tmp_factory)
    # 创建test_set.txt文件
    a = tmp_factory[0].join("test_set.txt")
    # 将需要的内容写入到文件中
    a.write({"status_code": status_code})
    
    # 使用read()方法获取文件中的内容
    logger.debug(a.read())
 
 
 
if __name__ == '__main__':
    pytest.main(['-sv', 'test_get_set.py'])

返回结果: 

test_get_set.py::test_set 2021-12-24 18:24:39.292 | INFO     | cases.conftest:tmp_factory:150 - 当前临时文件的目录为:/private/var/folders/_f/1d0lt83x1599bf6mcfppbwp40000gn/T/pytest-of-j/pytest-19/apitest-tmp-dir0

2021-12-24 18:24:39.347 | INFO     | cases.test_get_set:test_set:32 - 返回状态码:200

2021-12-24 18:24:39.347 | DEBUG    | cases.test_get_set:test_set:34 - (local('/private/var/folders/_f/1d0lt83x1599bf6mcfppbwp40000gn/T/pytest-of-j/pytest-19/apitest-tmp-dir0'), '/private/var/folders/_f/1d0lt83x1599bf6mcfppbwp40000gn/T/pytest-of-j/pytest-19/apitest-tmp-dir0')

2021-12-24 18:24:39.348 | DEBUG    | cases.test_get_set:test_set:38 - {'status_code': 200}

PASSED

============================== 1 passed in 0.07s ===============================

创建的文件:

可以看到,tmpdir_factory会自动为我们创建一个目录,名字是`tmp_factory`方法中自定义的名称后面加0,同时它的上级目录会自动从pytest-0递增

说下这个办法的优缺点:

  • 先说优点,这种数据存储是直接写入到文件,因此即使运行结束后也可以访问,而不像第一种方法存储的内容会随着用例运行的结束而消失
  • 再说缺点,因为这个临时目录最多只能保存3个,因此如果用例很多时,那么就可能存在文件被自动删除的风险。不过这个貌似可以通过修改默认配置来解决,可以继续研究下。
  • 缺点二,上面的例子中,直接通过a.read()就访问到了文件中的内容,这是因为内容的存储与读取全是在一个方法内,因此可以直接调用。如果是A方法存结果,在B中需要读取,那么便不能直接使用read()方法了(因为每个方法都会创建一个目录,并且默认的读取地址都是这个方法自己创建的目录)。就需要我们自己去单独封装一个读取文件的方法了,实现起来也不难而且tmpdir本身的这些方法也是对os.path一些方法的二次封装。

话说回来,都需要我自己去封装一个读取文件的方法了,为啥不干脆把读、写都自己来做呢?这样是否删除文件、删除几个、什么时候删除就完全由自己定义了啊,貌似会更方便。。。。。三、总结

综上所述,大家应该对这两种方法都有了一些了解,核心都是通过pytest的conftes.py文件来实现的。

总结

到此这篇关于pytest用例间参数传递的两种实现的文章就介绍到这了,更多相关pytest例间参数传递内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • pyTorch深度学习softmax实现解析

    pyTorch深度学习softmax实现解析

    这篇文章主要介绍了pytorch深度学习中对softmax实现进行了详细解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-09-09
  • Python编程之顺序执行与程序的主入口详解

    Python编程之顺序执行与程序的主入口详解

    程序从程序入口进入,到程序执行结束,大体是按照顺序结构执行语句、函数或代码块,掌握程序的结构,有利于把握程序的主体框架,下面这篇文章主要给大家介绍了关于Python编程之顺序执行与程序的主入口的相关资料,需要的朋友可以参考下
    2022-12-12
  • python常用时间库time、datetime与时间格式之间的转换教程

    python常用时间库time、datetime与时间格式之间的转换教程

    Python项目中很多时候会需要将时间在Datetime格式和TimeStamp格式之间转化,下面这篇文章主要给大家介绍了关于python常用时间库time、datetime与时间格式之间转换的相关资料,需要的朋友可以参考下
    2023-02-02
  • Win10操作系统中PyTorch虚拟环境配置+PyCharm配置

    Win10操作系统中PyTorch虚拟环境配置+PyCharm配置

    本文主要介绍了Win10操作系统中PyTorch虚拟环境配置+PyCharm配置,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Python读写压缩文件的方法

    Python读写压缩文件的方法

    这篇文章主要介绍了Python读写压缩文件的方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Python 私有化操作实例分析

    Python 私有化操作实例分析

    这篇文章主要介绍了Python 私有化操作,结合实例形式分析了Python私有属性、私有方法相关使用技巧,需要的朋友可以参考下
    2019-11-11
  • Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例

    Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例

    今天小编就为大家分享一篇Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Python中的基本数据类型介绍

    Python中的基本数据类型介绍

    这篇文章介绍了Python中的基本数据类型,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Python实现Appium端口检测与释放的实现

    Python实现Appium端口检测与释放的实现

    这篇文章主要介绍了Python实现Appium端口检测与释放的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • python使用xlrd模块读取excel的方法实例

    python使用xlrd模块读取excel的方法实例

    Python读取Excel表格,相比xlwt来说,xlrd提供的接口比较多,下面这篇文章主要给大家介绍了关于python使用xlrd模块读取excel的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03

最新评论