python中pytest教程_Pytest框架之fixture的详细使用教程

本文是Pytest框架中fixture的详细使用教程。介绍了fixture可自定义测试用例前置条件,具有命名灵活、可数据共享等优势,讲解了其参数列表、调用方式、实例化顺序,还说明了使用注意点,以及如何用yield和addfinalizer实现teardown操作。
Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

前言

前面一篇讲了setup、teardown可以实现在执行用例前或结束后加入一些操作,但这种都是针对整个脚本全局生效的

如果有以下场景:用例 1 需要先登录,用例 2 不需要登录,用例 3 需要先登录。很显然无法用 setup 和 teardown 来实现了fixture可以让我们自定义测试用例的前置条件

fixture优势

命名方式灵活,不局限于 setup 和teardown 这几个命名

conftest.py 配置里可以实现数据共享,不需要 import 就能自动找到fixture

scope="module" 可以实现多个.py 跨文件共享前置

scope="session" 以实现多个.py 跨文件使用一个 session 来完成多个用例

fixture参数列表

@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)

def test():

print("fixture初始化的参数列表")

参数列表

scope:可以理解成fixture的作用域,默认:function,还有class、module、package、session四个【常用】

autouse:默认:False,需要用例手动调用该fixture;如果是True,所有作用域内的测试用例都会自动调用该fixture

name:默认:装饰器的名称,同一模块的fixture相互调用建议写个不同的name

注意

session的作用域:是整个测试会话,即开始执行pytest到结束测试

测试用例如何调用fixture

将fixture名称作为测试用例函数的输入参数

测试用例加上装饰器:@pytest.mark.usefixtures(fixture_name)

fixture设置autouse=True

#!/usr/bin/env python

# -*- coding: utf-8 -*-

"""

__title__ =

__Time__ = 2020-04-06 15:50

__Author__ = 小菠萝测试笔记

__Blog__ = https://www.cnblogs.com/poloyy/

"""

import pytest

# 调用方式一

@pytest.fixture

def login():

print("输入账号,密码先登录")

def test_s1(login):

print("用例 1:登录之后其它动作 111")

def test_s2(): # 不传 login

print("用例 2:不需要登录,操作 222")

# 调用方式二

@pytest.fixture

def login2():

print("please输入账号,密码先登录")

@pytest.mark.usefixtures("login2", "login")

def test_s11():

print("用例 11:登录之后其它动作 111")

# 调用方式三

@pytest.fixture(autouse=True)

def login3():

print("====auto===")

# 不是test开头,加了装饰器也不会执行fixture

@pytest.mark.usefixtures("login2")

def loginss():

print(123)

执行结果

fixture的实例化顺序

较高 scope 范围的fixture(session)在较低 scope 范围的fixture( function 、 class )之前实例化【session > package > module > class > function】

具有相同作用域的fixture遵循测试函数中声明的顺序,并遵循fixture之间的依赖关系【在fixture_A里面依赖的fixture_B优先实例化,然后到fixture_A实例化】

自动使用(autouse=True)的fixture将在显式使用(传参或装饰器)的fixture之前实例化

#!/usr/bin/env python

# -*- coding: utf-8 -*-

"""

__title__ =

__Time__ = 2020-04-06 16:14

__Author__ = 小菠萝测试笔记

__Blog__ = https://www.cnblogs.com/poloyy/

"""

import pytest

order = []

@pytest.fixture(scope="session")

def s1():

order.append("s1")

@pytest.fixture(scope="module")

def m1():

order.append("m1")

@pytest.fixture

def f1(f3, a1):

# 先实例化f3, 再实例化a1, 最后实例化f1

order.append("f1")

assert f3 == 123

@pytest.fixture

def f3():

order.append("f3")

a = 123

yield a

@pytest.fixture

def a1():

order.append("a1")

@pytest.fixture

def f2():

order.append("f2")

def test_order(f1, m1, f2, s1):

# m1、s1在f1后,但因为scope范围大,所以会优先实例化

assert order == ["s1", "m1", "f3", "a1", "f1", "f2"]

执行结果

断言成功

关于fixture的注意点

添加了 @pytest.fixture,如果fixture还想依赖其他fixture,需要用函数传参的方式,不能用 @pytest.mark.usefixtures()的方式,否则会不生效

@pytest.fixture(scope="session")

def open():

print("===打开浏览器===")

@pytest.fixture

# @pytest.mark.usefixtures("open") 不可取!!!不生效!!!

def login(open):

# 方法级别前置操作setup

print(f"输入账号,密码先登录{open}")

前面讲的,其实都是setup的操作,那么现在就来讲下teardown是怎么实现的

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

#!/usr/bin/env python

# -*- coding: utf-8 -*-

"""

__title__ =

__Time__ = 2020-04-06 15:50

__Author__ = 小菠萝测试笔记

__Blog__ = https://www.cnblogs.com/poloyy/

"""

import pytest

@pytest.fixture(scope="session")

def open():

# 会话前置操作setup

print("===打开浏览器===")

test = "测试变量是否返回"

yield test

# 会话后置操作teardown

print("==关闭浏览器==")

@pytest.fixture

def login(open):

# 方法级别前置操作setup

print(f"输入账号,密码先登录{open}")

name = "==我是账号=="

pwd = "==我是密码=="

age = "==我是年龄=="

# 返回变量

yield name, pwd, age

# 方法级别后置操作teardown

print("登录成功")

def test_s1(login):

print("==用例1==")

# 返回的是一个元组

print(login)

# 分别赋值给不同变量

name, pwd, age = login

print(name, pwd, age)

assert "账号" in name

assert "密码" in pwd

assert "年龄" in age

def test_s2(login):

print("==用例2==")

print(login)

yield注意事项

如果yield前面的代码,即setup部分已经抛出异常了,则不会执行yield后面的teardown内容

如果测试用例抛出异常,yield后面的teardown内容还是会正常执行

yield+with的结合

# 官方例子

@pytest.fixture(scope="module")

def smtp_connection():

with smtplib.SMTP("smtp.gmail.com", 587, timeout=5) as smtp_connection:

yield smtp_connection # provide the fixture value

该smtp_connection连接将测试完成执行后已经关闭,因为 smtp_connection对象自动关闭时,with语句结束。

addfinalizer 终结函数

@pytest.fixture(scope="module")

def test_addfinalizer(request):

# 前置操作setup

print("==再次打开浏览器==")

test = "test_addfinalizer"

def fin():

# 后置操作teardown

print("==再次关闭浏览器==")

request.addfinalizer(fin)

# 返回前置操作的变量

return test

def test_anthor(test_addfinalizer):

print("==最新用例==", test_addfinalizer)

注意事项

如果 request.addfinalizer() 前面的代码,即setup部分已经抛出异常了,则不会执行 request.addfinalizer() 的teardown内容(和yield相似,应该是最近新版本改成一致了)

可以声明多个终结函数并调用

总结

到此这篇关于Pytest框架之fixture的详细使用教程的文章就介绍到这了,更多相关Pytest fixture使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

本文标题: Pytest框架之fixture的详细使用教程

本文地址: http://www.cppcns.com/jiaoben/python/306030.html

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值