我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python自动化测试pytest中fixtureAPI简单说明

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python自动化测试pytest中fixtureAPI简单说明

什么是fixture

根据pytest官方文档的说明,fixture可以简单的归纳为具有以下功能的函数:

  • 配置测试前系统的初始状态;
  • 定义传入测试中的数据集;
  • 为批量测试提供数据源等

与xUnit风格的setup和teardown的对比

fixture的功能与setup和teardown类似,可以实现setup和teardown的功能,但是对这些功能进行了明显的改进,主要有以下方面:

  • 调用灵活。可以在测试函数、模块、类或整个项目中声明fixture的名称来进行调用;
  • 使用灵活。fixture即适用于简单的单元测试又适用于复杂的功能测试。根据测试的需求可对fixture进行参数化使用,并且可对fixture进行重复使用。
  • fixture是以模块化方式实现的,因此允许fixture调用其他fixture函数;
  • teardown的实现逻辑更加清晰明了,并且方便进行管理。

 fixture运行报错后,pytest的处理方式

通过上面的说明,我们可以知道fixture函数本身是允许调用其他fixture函数的。在这种情况下,测试运行的时候,其中一个fixture函数报错了,pytest的会如何处理呢?
通过pytest官方文档的说明,我们可以知道:

  • pytest以线性的方式顺序执行测试用例所调用的fixture函数;
  • 当顺序较前的fixture函数执行报错后,pytest会停止执行该测试所调用的其他fixture,并且将测试标记出错;
  • 测试标记错误,并不意味着测试未通过,只能说明测试无法尝试执行下去,因此我们需要尽可能的去为测试函数减少必要的依赖关系。

示例1:

1.在以下demo代码中,order()返回类型存在问题,正确的应该返回一个list,我们给其返回一个None:


import pytest
@pytest.fixture
def order():
    return None  #正确应该返回[],我们给返回一个None
@pytest.fixture
def append_first(order):
    order.append(1)
@pytest.fixture
def append_second(order, append_first):
    order.extend([2])
@pytest.fixture(autouse=True)
def append_third(order, append_second):
    order += [3]
def test_order(order):
    assert order == [1, 2,3]

运行后结果如下:

test_order被标记Error,并且信息提示:test setup failed,说明是调用的fixture函数存在问题,且说明了错误原因。

在这里插入图片描述

2.如果是test_order运行未通,运行信息会怎么样提醒呢?我们按照以下demo修改测试代码,修改test_order的断言语句:


import pytest
@pytest.fixture
def order():
    return []   #返回一个list
@pytest.fixture
def append_first(order):
    order.append(1)
@pytest.fixture
def append_second(order, append_first):
    order.extend([2])
@pytest.fixture(autouse=True)
def append_third(order, append_second):
    order += [3]
def test_order(order):
    assert order == [1, 2]  #断言失败,正确应该是 order==[1,2,3]

运行结果如下:

test_order被标记failed,且提醒是AssertionError,断言出错。这说明是test_order 本身运行未通过。

在这里插入图片描述

2.fixture API @pytest.fixture()说明

pytest使用@pytest.fixture()来声明fixture方法。具体如何使用,我会在文章后面进行详细说明。在此,主要来简单说明一下fixture()


def fixture(
    fixture_function: Optional[_FixtureFunction] = None,
    *,
    scope: "Union[_Scope, Callable[[str, Config], _Scope]]" = "function",
    params: Optional[Iterable[object]] = None,
    autouse: bool = False,
    ids: Optional[
        Union[
            Iterable[Union[None, str, float, int, bool]],
            Callable[[Any], Optional[object]],
        ]
    ] = None,
    name: Optional[str] = None,
) -> Union[FixtureFunctionMarker, _FixtureFunction]:

参数说明:

2.1 scope

fixture函数的作用域。作用域从小到大依次为:function(默认)classmodulepackagesession

还可传入一个可调用对象,以实现动态修改fixture的作用域。

后面会单独写一篇文章,为大家详细介绍fixture的scope。

2.2 params

传入测试数据集,动态生成测试用例,每一条数据都单独生成一条测试用例。通过request.param,可以获取传入的这些数据。

后面会单独写一篇文章,为大家详细介绍fixture的参数化。

2.3 autouse

fixture自动应用标识。

如果是True,则在同作用域下的测试函数,会自动调用该fixture;如果是False,则测试函数需要主动去调用该fixture。

后面会在介绍fixture调用方法的文章给大家详细说明。

2.4 ids

测试用例ID标识,与parmas传入的参数一一对应。当未定义时,会自动生成id。

示例2:

1.传入ids参数,运行以下demo:


import pytest
@pytest.fixture(params=[1,2,3],ids=['A','B','C'])
def ids(request):
    data=request.param
    print(f'获取测试数据{data}')
    return data
def test_ids(ids):
    print(ids)

运行结果:

在执行信息中,我们可以发现ids的三个参数和params的三个参数一一对应显示,并且ids的参数作为测试用例id的一部分呈现出来。

在这里插入图片描述

2. 修改上面demo中的代码,不传入ids参数,运行一下:


import pytest
@pytest.fixture(params=[1,2,3]) #未传入ids
def ids(request):
    data=request.param
    print(f'获取测试数据{data}')
    return data
def test_ids(ids):
    print(ids)

运行结果:

查看运行结果我们可以发现,虽然没有传入ids,但是却自动生成了ids

在这里插入图片描述

测试结束后,我们常常以测试报告的形式来汇报测试结果,如结合allure呈现测试结果。通过ids传入的参数可以对测试用例进行说明,这样更方便我们查看测试结果。

2.5 name

fixture的别名。fixture的name默认是@pytest.fixture所装饰的函数的函数名。使用fixture的别名可以提高代码的阅读性。

示例3:
以下面的demo为例:


import pytest
@pytest.fixture()
def login():
    print('login')
class SubClass:
    def sub_login(self):
        print('subcalss_login')
class TestCase:
    def test_case1(self,login):  #调用fixture——login
        login=SubClass()  #定义一个login并实例化SubClass
        login.sub_login() #调用SubClass中的sub_login()
        print('这是testcase1')

我们定义了一个fixture函数——login(),同时在test_case1中实例化了一个Subclass类,并起名为login,然后调用了SubClass类中的sub_login()。如果代码复杂的情况,很容易将fixture函数的login与SubClass实例的login弄混淆,增加代码的阅读的复杂度。

当我们使用fixture别名的话,在阅读代码的时候就很容易进行区分。


@pytest.fixture(name='module_login') 
def login():
    print('login')

class TestCase:
    def test_case1(self,module_login):  #使用fixture别名:module_login
        login=SubClass()  #定义一个login并实例化SubClass
        login.sub_login() #调用SubClass中的sub_login()
        print('这是testcase1')

注意:

当使用name参数后,则无法再通过@pytest.fixture所装饰的函数的函数名来进行调用,必须使用name所指定fixture别名来调用。

2.6 fixture_function

目前pytest官方文档未给出具体说明。

文末说明:
以上内容是我在阅读pytest官方文档后,依照个人理解进行整理。内容可能会有理解错误之处,欢迎大家留言指正。谢谢!

更多关于自动化测试pytest中fixtureAPI的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python自动化测试pytest中fixtureAPI简单说明

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python+pytest自动化测试封装怎么实现

本篇内容介绍了“python+pytest自动化测试封装怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!例如单个接口的请求代码如下:i
2023-07-02

Python+Requests+PyTest+Excel+Allure 接口自动化测试实战

本文主要介绍了Python+Requests+PyTest+Excel+Allure 接口自动化测试实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-23

Python+Requests+PyTest+Excel+Allure接口自动化测试怎么实现

本篇内容主要讲解“Python+Requests+PyTest+Excel+Allure接口自动化测试怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python+Requests+PyT
2023-07-05

python自动化测试框架pytest和unittest的区别是什么

这篇文章给大家介绍python自动化测试框架pytest和unittest的区别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、用例设计规则1.unittest(1)测试类必须继承unittest.TestCa
2023-06-02

PHP开发中的单元测试与自动化测试

php 中的单元测试和自动化测试至关重要,可确保代码可靠性。单元测试隔离测试代码单元,通过断言检查预期结果。自动化测试利用 ci 平台自动执行测试,确保代码持续满足质量标准,包括配置测试管道和监控测试结果。通过单元和自动化测试,php 应用
PHP开发中的单元测试与自动化测试
2024-05-09

怎样解说AngularJS在自动化测试中的应用

今天就跟大家聊聊有关怎样解说AngularJS在自动化测试中的应用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、什么是AngularJS ?1、AngularJS是一组用来开发w
2023-06-05

python自动化测试中Selenium怎么用

小编给大家分享一下python自动化测试中Selenium怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.安装完成自动化测试,需要配置三个东西。selen
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录