pytest系列——fixture之yield关键字实现teardown用例后置操作

fixture之yield关键字实现teardown用例后置操作

前言

①pytest之fixture函数使用(pytest测试框架测试固件 文中讲到,fixture函数是通过scope参数来控制setup级别;

②既然有setup函数作为用例之前的操作,测试用例执行完成之后那肯定也有teardown操作。

③但是fixture的teardown操作并不是独立的函数,用yield关键字唤醒teardown操作。【依然存在于fixture方法中】

yield实现teardown后置操作

实例1

#使用yield关键字实现teardown_xxx的功能

import pytest

此时,login函数是一个测试固件,相当于实现了setup_xxx&teardown_xxx的功能。
@pytest.fixture()
def login():
    ############# 以下的代码相当于setup部分 ###########
    print('登录系统')
    token = 'a1b23c'
    yield token
    ############# 以下的代码相当于teardown部分 ###########
    print('退出登录')

在测试函数里, 通过形参声明要使用的测试固件
def test1(login):
    # login参数的值是测试固件函数的返回值
    print('执行测试 test1: ', login)
    print('测试1')

def test2(login):
    print('执行测试 test2: ', login)
    print('测试2')

通过python解释器执行需要以下代码
if __name__ == '__main__':
    pytest.main(["-s", "test_yieldDemo.py"])

运行结果:

pytest系列——fixture之yield关键字实现teardown用例后置操作

【注意】:return和yield两个关键字都可以返回值;

yield关键字返回值后,后面的代码还会继续运行;【由于实例1中fixture函数login需要返回token,而且还需要继续执行teardown后置操作:所以选择yield关键字所以后面代码还会继续运行】

return关键字返回值后,后面的代码不会继续运行;

实例2

import pytest

@pytest.fixture(scope="module")
def open():
    print("打开浏览器,并且打开百度首页")
    yield
    print("执行teardown!")
    print("最后关闭浏览器")

def test_s1(open):
    print("用例1:搜索python-1")

def test_s2(open):
    print("用例2:搜索python-2")

def test_s3(open):
    print("用例3:搜索python-3")

if __name__ == "__main__":
    pytest.main(["-s", "test_fixturemodule2.py"])

运行结果:

pytest系列——fixture之yield关键字实现teardown用例后置操作

实例3

#!/usr/bin/env python
-*- coding: utf-8 -*-
import pytest

@pytest.fixture(scope="session")
def open():
    # 会话前置操作setup
    print("===打开浏览器open===")
    yield
    # 会话后置操作teardown
    print("===关闭浏览器open===")

@pytest.fixture
def login(open):
    # 方法级别前置操作setup
    print("===登陆操作login===")
    name = "===账号==="
    pwd = "===密==="
    # 返回变量
    yield name, pwd
    # 方法级别后置操作teardown
    print("===登录成功login===")

def test_case1(login):
    print("===测试用例1===")
    # 返回的是一个元组
    print(login)
    # 分别赋值给不同变量
    name, pwd = login
    print(name, pwd)
    assert "账号" in name
    assert "密码" in pwd

def test_case2(login):
    print("===测试用例2===")
    print(login)

运行结果:

pytest系列——fixture之yield关键字实现teardown用例后置操作

yield遇到异常

1、如果其中一个用例在执行时出现异常,不影响yield后面的teardown执行,运行结果互不影响,并且全部用例执行完之后,yield唤起teardown操作。

新建一个文件test_f1.py
coding:utf-8
import pytest

@pytest.fixture(scope="module")
def open():
    print("打开浏览器,并且打开百度首页")
    yield
    print("执行teardown!")
    print("最后关闭浏览器")

def test_s1(open):
    print("用例1:搜索python-1")

    # 如果第一个用例异常了,不影响其他的用例执行
    raise NameError  # 模拟异常

def test_s2(open):
    print("用例2:搜索python-2")

def test_s3(open):
    print("用例3:搜索python-3")

if __name__ == "__main__":
    pytest.main(["-s", "test_f1.py"])

运行结果:

pytest系列——fixture之yield关键字实现teardown用例后置操作

2、但是fixture函数如果在setup执行期间发生异常,那么pytest是不会去执行yield后面的teardown内容。

yield关键字+with上下文管理器的结合使用

yield 关键字 也可以配合 with 上下文管理器 语句使用。【使得代码更加精简】

示例:

#!/usr/bin/env python
-*- coding: utf-8 -*-

import pytest
import smtplib

@pytest.fixture(scope="module")
def smtp_connection():
    with smtplib.SMTP("smtp.gmail.com", 587, timeout=5) as smtp_connection:
        yield smtp_connection

request.addfinalizer()将定义的函数注册为终结函数

除了yield可以实现teardown,我们也可以通过 request.addfinalizer() 的方式去注册终结函数来实现 teardown 用例的后置操作。

示例:

addfinalizer 的用法跟 yield 是不同的, addfinalizer 需要你去注册一个或多个作为终结器使用的函数。

例如:增加一个函数 fin,并且注册成终结函数。

代码如下:

#!/usr/bin/env python
-*- coding: utf-8 -*-

import pytest

@pytest.fixture(scope="module")
def test_addfinalizer(request):
    # 前置操作setup
    print("===打开浏览器===")
    test = "test_addfinalizer"

    def fin():
        # 后置操作teardown
        print("===关闭浏览器===")

    request.addfinalizer(fin)
    # 返回前置操作的变量
    return test

def test_case(test_addfinalizer):
    print("===最新用例===", test_addfinalizer)

运行结果:

pytest系列——fixture之yield关键字实现teardown用例后置操作

yield addfinalizer 用法的区别:

① addfinalizer 可以注册多个终结函数。当注册多个终结函数时,用例的后置操作同时会执行完所有的终结函数。

【注意】终结函数(用例后置操作函数)的执行顺序与其在fixture函数中注册的顺序相反(即先注册的终结函数后执行,后注册的终结函数先执行)

示例:

#!/usr/bin/env python
-*- coding: utf-8 -*-
import pytest

@pytest.fixture()
def demo_addfinalizer(request):
    print("====setup====")

    def fin1():
        print("====teardown1====")

    def fin2():
        print("====teardown2====")

    def fin3():
        print("====teardown3====")

    # 注册fin1、fin2、fin3为终结函数
    request.addfinalizer(fin1)
    request.addfinalizer(fin2)
    request.addfinalizer(fin3)

def test_case1(demo_addfinalizer):
    print("====执行用例test_case1====")

def test_case2(demo_addfinalizer):
    print("====执行用例test_case2====")

def test_case3(demo_addfinalizer):
    print("====执行用例test_case3====")

if __name__ == '__main__':
    pytest.main(__file__, '-s')

运行结果:

pytest系列——fixture之yield关键字实现teardown用例后置操作

②当执行测试用例时setup前置操作函数的代码执行错误或者发生异常时, addfinalizer 注册的终结函数依旧会执行。

yield 关键字可以返回setup前置操作函数中生成的测试数据,且 yield 关键字返回测试数据之后后续的代码依然可以运行。且后续执行的代码充当teardown后置操作函数。

addfinalizer 函数可以将一个或者多个函数注册为终结函数(一个或多个函数必须在fixture函数中定义),此时的终结函数为teardown后置操作函数;且最后可以使用 return 关键字返回setup前置操作函数生成的测试数据。

我这里给你们分享一下我所积累和真理的文档和学习资料有需要是领取就可以了

1、学习思路和方法

这个大纲涵盖了目前市面上企业百分之99的技术,这个大纲很详细的写了你该学习什么内容,企业会用到什么内容。总共十个专题足够你学习

pytest系列——fixture之yield关键字实现teardown用例后置操作

2、想学习却无从下手,该如何学习?

这里我准备了对应上面的每个知识点的学习资料、可以自学神器,已经项目练手。

pytest系列——fixture之yield关键字实现teardown用例后置操作

pytest系列——fixture之yield关键字实现teardown用例后置操作

3、软件测试/自动化测试【全家桶装】学习中的工具、安装包、插件….

pytest系列——fixture之yield关键字实现teardown用例后置操作

pytest系列——fixture之yield关键字实现teardown用例后置操作

pytest系列——fixture之yield关键字实现teardown用例后置操作

4、有了安装包和学习资料,没有项目实战怎么办,我这里都已经准备好了往下看

pytest系列——fixture之yield关键字实现teardown用例后置操作

5、如何领取这些配套资料和学习思路图,以及项目实战源码。

这些资料都已经让我准备在一个php网页里面了,可以在里面领取扫码或者进Q群交流都可以暗号和备注是111哦

最后送上一句话:
世界的模样取决于你凝视它的目光,自己的价值取决于你的追求和心态,一切美好的愿望,不在等待中拥有,而是在奋斗中争取。
如果我的博客对你有帮助、如果你喜欢我的文章内容,请 “点赞” “评论” “收藏” 一键三连哦!

pytest系列——fixture之yield关键字实现teardown用例后置操作

Original: https://blog.csdn.net/mashang_z111/article/details/126752230
Author: 测试中二
Title: pytest系列——fixture之yield关键字实现teardown用例后置操作

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/773698/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • pytest-基础

    unittest是python自带的标准库pytest是python的第三方库,独立安装pytest相比于unittest更简洁、更灵活、更高效 不需要使用testsuite收集加…

    Python 2023年9月10日
    044
  • [Python]搭建虚拟环境与Django项目的创建[virtualenv virtualenvwrapper venv](Windows)

    前言 系列文章目录[Python]目录 文章目录 前言 1. virtualenv * 1.1 virtualenv 的安装 1.2 使用 virtualenv 创建虚拟环境 1….

    Python 2023年8月4日
    088
  • 基于Python的qixqi排行榜数据爬取及网页数据展示系统

    资源下载地址:https://download.csdn.net/download/sheziqiong/85629645资源下载地址:https://download.csdn….

    Python 2023年8月11日
    042
  • Scrapy爬虫入门Ⅱ

    Scrapy安装 如果用包管理例如pycharm和anaconda 直接安装 如果用pip 要用虚拟环境安装(lz没尝试过,建议小白慎选) 基本文件使用 lz用的pyhcarm首先…

    Python 2023年10月1日
    033
  • 【精华】多目标跟踪MOT

    文章目录 * – + * 多目标跟踪MOT * – 1 目标跟踪分类 – 2 常用数据集及下载管理 – 3 MOT性能指标 &#82…

    Python 2023年9月26日
    041
  • 彻底学会Selenium元素定位

    转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/63099961.html 你好,我是测试蔡坨坨。 最近收到不少初学UI自动化测试的小伙伴私信,对于元素…

    Python 2023年10月18日
    023
  • CSS宝典①-基础知识筑基

    HTML系列: 人人都懂的HTML基础知识-HTML教程 HTML元素大全(1) HTML元素大全(2)-表单 CSS系列: CSS基础知识筑基 常用CSS样式属性 CSS选择器大…

    Python 2023年10月16日
    052
  • 黑金ZYNQ7100配置HDMI驱动并测试

    Linux系统移植系列 Linux系统移植专栏地址 https://blog.csdn.net/qq_41873311/category_12127932.html 一个写了五篇博…

    Python 2023年11月7日
    041
  • 常用逻辑用语@命题@猜想@量词

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

    Python 2023年11月6日
    037
  • Flask 框架(四)— 表单处理

    1.表单处理 Web 表单是 Web 应用程序的基本功能,它是 HTML 页面中负责数据采集的部件。通常情况下,表单有三个部分组成,分别是表单标签、表单域、表单按钮。表单允许用户输…

    Python 2023年8月15日
    042
  • python及pygame雷霆战机游戏项目实战08 声音和音乐

    在这个系列中,将制作一个雷霆战机游戏。 ; 声音的力量 对于游戏,需要一个”射击”声音和一个”爆炸”声音。创建一个”sn…

    Python 2023年9月25日
    036
  • GitHub Pages 和 Jekyll 笔记

    GitHub Pages 和 Jekyll 笔记 1. 新建仓库 新建一个空仓库, 名称为 username.github.io, 其中 username 就是你的GitHub账号…

    Python 2023年10月17日
    050
  • 物联网协议概述

    目录 前言 内容 CoAP(Constrained Application Protocol 受限应用协议) MQTT(Message Queuing Telemetry Tran…

    Python 2023年9月30日
    045
  • 前端——表单相关的属性(下)

    表单相关的属性 新增的与表单相关的元素如下。 min、max和step属性 min、max和step属性用于为包含数字或日期的input类型规定限定(约束)。max属性规定输入域所…

    Python 2023年9月26日
    036
  • shell创建数据库的脚本

    1 !/bin/bash 2 3 4 HOSTNAME="localhost" 5 PORT="3306" 6 USERNAME=&quot…

    Python 2023年6月3日
    064
  • 多场景业务实战

    知道游戏行业关键数据指标 掌握ARPU, ARPPU等指标的计算方法 激活数据 总激活码发放量、总激活量、总登录账号数 激活率、激活登录率 激活率 = 激活量 / 安装量 (激活码…

    Python 2023年9月24日
    037
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球