前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python测试框架pytest(08)fixture - conftest.py、yield、addfinalizer

Python测试框架pytest(08)fixture - conftest.py、yield、addfinalizer

作者头像
wangmcn
发布于 2022-07-26 06:16:47
发布于 2022-07-26 06:16:47
38200
代码可运行
举报
文章被收录于专栏:AllTests软件测试AllTests软件测试
运行总次数:0
代码可运行

Python测试框架pytest(08)

fixture

conftest.py、yield、addfinalizer

目录

  • 1、conftest.py作用范围
  • 2、yield实现teardown
  • 3、yield+with的结合
  • 4、addfinalizer终结函数

1、conftest.py作用范围

conftest.py 文件名称是固定的,pytest 会自动识别该文件,可以理解成一个专门存放 fixture 的配置文件。

一个工程下可以建多个 conftest.py 的文件,一般在工程根目录下设置的 conftest 文件起到全局作用。在不同子目录下也可以放 conftest.py 的文件,作用范围只能在该层级以及以下目录生效。

conftest.py 配置 fixture 注意事项:

  • pytest 会默认读取 conftest.py 里面的所有 fixture。
  • conftest.py 文件名称是固定的,不能改动。
  • conftest.py 只对同一个 package 下的所有测试用例生效。
  • 不同目录可以有自己的 conftest.py,一个项目中可以有多个 conftest.py。
  • 测试用例文件中不需要手动 import conftest.py,pytest 会自动查找。

示例:

目录结构:

1、My_pytest_Demo/conftest.py

脚本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import pytest

@pytest.fixture(scope='session', autouse=True)
def login():
    print("====准备登录====")

2、My_pytest_Demo/fixture_chapter/conftest.py

脚本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import pytest

@pytest.fixture(scope='session', autouse=True)
def bai_du():
    print("====登录成功====")

3、My_pytest_Demo/fixture_chapter/login_demo.py

脚本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""

import pytest

class TestCase:
    def test_case(self):
        print("====执行用例====")

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

4、运行结果:

执行login_demo.py文件,根目录下的conftest.py先执行,之后执行fixture_chapter目录下的conftest.py,最后才执行login_demo.py

2、yield实现teardown

前面章节讲的其实都是 setup 的操作,接下来讲解怎样来实现 teardown 的操作。

用 fixture 实现 teardown 并不是一个独立的函数,而是用 yield 关键字来开启 teardown 操作。

  • 当 pytest.fixture(scope="session") 时,作用域是整个测试会话,即开始执行 pytest 到结束测试只会执行一次。
  • 当 pytest.fixture(scope="function") 时,pytest 的 yield 类似 unittest 的 teardown。每个方法(函数)都会执行一次。
  • 当 pytest.fixture(scope="module") 时,module 作用是整个 .py 文件都会生效(整个文件只会执行一次),用例调用时,参数写上函数名称就可以。

1、创建test_fixture4.py文件

脚本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""
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)

2、运行结果:

注意要点:

  • 如果 yield 前面的代码,即 setup 部分已经抛出异常,则不会执行 yield 后面的 teardown 内容。
  • 如果测试用例抛出异常,yield 后面的 teardown 内容还是会正常执行。

3、yield+with的结合

yield 也可以配合 with 语句使用。

创建test_fixture5.py文件

脚本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""
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

4、addfinalizer终结函数

除了 yield 可以实现 teardown,在 request-context 对象中注册 addfinalizer 方法也可以实现终结函数。

1、创建test_fixture6.py文件

在用法上,addfinalizer 跟 yield 是不同的,需要你去注册作为终结器使用的函数。例如:增加一个函数 fin,并且注册成终结函数。

脚本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""
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)

2、运行结果:

yield 与 addfinalizer 的区别:

1、addfinalizer 可以注册多个终结函数。

创建test_fixture_7.py文件

脚本代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
微信公众号:AllTests软件测试
"""
import pytest

@pytest.fixture()
def demo_addfinalizer(request):
    print("====setup====")
    def fin1():
        print("====teardown1====")
    def fin2():
        print("====teardown2====")
    def fin3():
        print("====teardown3====")

    # 注册demo_addfinalizer为终结函数
    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====")

运行结果:

注册的3个函数都被执行了,但是要注意的是执行顺序,与注册的顺序相反。

2、当setup的代码执行错误,addfinalizer依旧会执行。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AllTests软件测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Pytest学习(四) - fixture的使用
写这篇文章,整体还是比较坎坷的,我发现有知识断层,理解再整理写出来,还真的有些难。
软件测试君
2020/10/29
9830
Pytest学习(四) - fixture的使用
pytest文档6-fixture之yield实现teardown
上一篇讲到fixture通过scope参数控制setup级别,既然有setup作为用例之前前的操作,用例执行完之后那肯定也有teardown操作。 这里用到fixture的teardown操作并不是独立的函数,用yield关键字呼唤teardown操作
上海-悠悠
2018/08/17
1.4K0
Pytest系列(4) - fixture的详细使用
https://www.cnblogs.com/poloyy/category/1690628.html
小菠萝测试笔记
2020/06/09
5970
Pytest系列(4) - fixture的详细使用
pytest fixtures_pytest命令
Pytest的fixture相对于传统的xUnit的setup/teardown函数做了显著的改进:
全栈程序员站长
2022/09/16
6300
Python测试框架pytest(06)fixture - 依赖、重命名、request、pytestconfig
添加了 @pytest.fixture,如果 fixture 还想依赖其他 fixture,需要用函数传参的方式,不能用 @pytest.mark.usefixtures() 的方式,否则会不生效。
wangmcn
2022/07/26
5580
Python测试框架pytest(06)fixture - 依赖、重命名、request、pytestconfig
Python测试框架pytest(20)插件 - 生成html报告、重复执行用例、用例执行顺序、多重断言
pytest-html 测试报告默认是不展示用例描述 Description 内容,可以修改生成的报告内容,添加或删除 html 报告的 table 内容。
wangmcn
2022/07/26
1.1K0
Python测试框架pytest(20)插件 - 生成html报告、重复执行用例、用例执行顺序、多重断言
pytest 自动化测试框架(二)
在上一篇文章中分享了 pytest 的基本用法,本文进一步介绍 pytest 的其他实用特性和进阶技巧。
霍格沃兹测试开发
2020/10/26
8600
Python测试框架pytest(续)-进阶用法
首先我们来学习下pytest的用来做前置工作和清理工作的setup和teardown方法。
怪盗LYL
2022/06/13
9060
Python测试框架pytest(续)-进阶用法
Python测试框架pytest(09)Hooks函数 - pytest_runtest_makereport获取用例执行结果
钩子方法 pytest_runtest_makereport 可以清晰的了解用例的执行过程,并获取到每个用例的执行结果。
wangmcn
2022/07/26
6090
Python测试框架pytest(09)Hooks函数 - pytest_runtest_makereport获取用例执行结果
Python测试框架pytest(12)Hooks函数 - 其他Hooks函数
pytest_report_teststatus(report, config) 钩子函数返回结果类别,状态报告的短字母和详细单词。
wangmcn
2022/07/26
5230
Python测试框架pytest(12)Hooks函数 - 其他Hooks函数
Python测试框架pytest(24)配置文件pytest.ini
pytest 配置文件可以改变 pytest 的运行方式,它是一个固定的文件 pytest.ini 文件,读取配置信息,按指定的方式去运行。
wangmcn
2022/07/26
1.1K0
Python测试框架pytest(24)配置文件pytest.ini
pytest修仙之路5 - yield操作
上一篇中,我们刚刚实现了在每个用例之前执行初始化操作,那么用例执行完之后如需要清除数据(或还原)操作,可以使用 yield 来实现。fixture通过scope参数控制setup级别,既然有setup作为用例之前前的操作,用例执行完之后那肯定也有teardown操作。 这里用到fixture的teardown操作并不是独立的函数,用yield关键字呼唤teardown操作。fixture的teardown操作并不是独立的函数,可以用yield关键字呼唤teardown操作。
北京-宏哥
2020/04/24
1.4K0
pytest修仙之路5 - yield操作
Python测试框架pytest(04)fixture - 测试用例调用fixture、fixture传递测试数据
setup、teardown 可以实现在执行用例前或结束后加入一些操作,但这种都是针对整个脚本全局的。
wangmcn
2022/07/26
5110
Python测试框架pytest(04)fixture - 测试用例调用fixture、fixture传递测试数据
pytest学习和使用8-fixture如何实现teardown功能?(yield的使用)
1引入 之前学习fixture的时候,其实这个功能就类似用例的前置,给用例执行前设置一些条件; 那fixture也就相当于setup的功能; 那有没有teardown的功能呢? 有,fixture里面的teardown用yield来唤醒teardown的执行。 2 yield说明 yield是一个关键字; yield在fixture中起到了唤起teardown的作用,同时也可以和return一样返回值; 但yield和return的区别是:return执行完成,该函数终止;yield在返回结束后,后续的代码
虫无涯
2023/02/16
4720
pytest系列教程——4、fixture详解
https://docs.pytest.org/en/7.1.x/reference/reference.html#pytest.fixture
胡八万
2022/06/08
1.5K0
pytest系列教程——4、fixture详解
Pytest自动化测试fixture之conftest.py
之前我们讲到用例前后置方法 [ setup 、teardown ] Pytest测试用例之setup与teardown方法(一) Pytest测试用例之setup与teardown方法(二) 可以实现在自动化测试用例执行前或执行后进行特定的操作
测试小兵
2020/07/17
1K0
Python测试框架pytest(11)Hooks函数 - pytest_terminal_summary统计测试结果
当用例执行完成后,希望获取到执行的结果,方便了解用例的执行情况,这时候就可以使用 pytest_terminal_summary 来进行测试结果的统计(可以拿到所有的执行结果)。
wangmcn
2022/07/26
5190
Python测试框架pytest(11)Hooks函数 - pytest_terminal_summary统计测试结果
Python测试框架pytest(22)插件 - pytest-xdist(分布式执行)
当测试用例非常多的时候,一条条按顺序执行测试用例,是很浪费测试时间的。这时候就可以用到 pytest-xdist,让自动化测试用例可以分布式执行,从而大大节省测试时间。
wangmcn
2022/07/26
1.2K0
Python测试框架pytest(22)插件 - pytest-xdist(分布式执行)
Python测试框架pytest(18)命令行参数
1、在conftest.py文件添加命令行选项,自定义命令行传入参数"--opt", 如果测试用例需要用到,从命令行传入参数,就调用opt函数。
wangmcn
2022/07/26
7530
Python测试框架pytest(18)命令行参数
conftest.py是什么?该怎么用?
pytest 是一个功能强大的 Python 测试框架,它提供了许多灵活且易于扩展的功能。其中之一是使用 conftest.py文件来共享和管理测试代码的配置和工具函数。本文将介绍 conftest.py的作用,以及如何使用它来提高测试代码的可重用性和可维护性。
霍格沃兹测试开发Muller老师
2023/09/07
3820
推荐阅读
相关推荐
Pytest学习(四) - fixture的使用
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文