【pytest】之fixture()和conftest使用详解

一、引言:

1)setup和teardown:实现全部用例的前后置;但实际应用中,我们需要更为灵活的配置部分用例的前后置;
2)fixture():fixture固件,或者夹具,能实现部分或者全部用例的前后置; fixture是个装饰器,可以用来装饰函数,类等

  1. fixture命名规则较灵活,可以随意命名
  2. fixture的前后置通过关键字yield进行区分,yield前的代码为前置操作,yield后的代码为后置操作
  3. 前后置操作可单独存在:即可以只有前置操作,也可以只有后置操作

二、fixture的应用:

  1. 定义一个函数
  2. 通过装饰器的方法将其变成fixture
    @pytest.fixture()
    def exe_database_sql():
    print(“执行SQL查询语句”)
  3. 需要对应前后置的用例,将fixture的名称通过传参的形式进行调用
    def test_tangseng(self,exe_database_sql):
    print(“0130类测试登录成功-唐僧”)
import pytest

@pytest.fixture()
def exe_database_sql():
    print("执行SQL查询语句")

class TestLoginA():

    def test_tangseng(self,exe_database_sql):
        print("0130类测试登录成功-唐僧")

    def test_sunwukong(self):
        print("0130测试登录成功-孙悟空")

    def test_zhubajie(self):
        print("0130测试登录成功-猪八戒")

    def test_shaheshang(self):
        print("0130测试登录成功-沙和尚")

三、fixture的5个参数详解,其一:scope(作用域)

scope:控制fixture的作用范围:session>module>class>function,fixture默认的scope是function;
(1)function:在函数或方法之前和之后都会调用

1.手动调用的方式:在测试用例的参数中加入fixture的名称
2.如果fixture通过return或者yield存在返回值时,可以将对应的值传递到测试用例当中,值是通过fixture的名字传递的–数据驱动,用例的参数化

import pytest

@pytest.fixture(scope="function")
def my_fixture():
    print("这是前置的方法,可以实现部分以及全部用例的前后置")
    yield
    print("这是后置的方法,可以实现部分以及全部用例的前后置")

class TestLogin:

    def test_login_01(self):
        print("\n测试01号登录成功")

    def test_login_02(self,my_fixture):
        print("\n测试02号登录成功")

    def test_login_03(self):
        print("\n测试03号登录成功")

    def test_login_04(self):
        print("\n测试04号登录成功")

    def test_login_05(self):
        print("\n测试05号登录成功")

(2)class:在每一个类之前和之后执行(一个类中可以有多个方法)

1.手动调用的方式:在类的上面加上@pytest.mark.usefixtures(“exe_database_sql”)装饰器,进行调用

import pytest
from common.common_util import CommonUtil

@pytest.fixture(scope="class",autouse=False)
def exe_database_sql():
    print("执行SQL查询语句")
    return ":success"

@pytest.mark.usefixtures("exe_database_sql")
class TestLoginA(CommonUtil):

    def test_tangseng(self):
        print("0130类测试登录成功-唐僧")

    def test_sunwukong(self):
        print("0130测试登录成功-孙悟空")

(3)module:每一个.py文件调用一次,该文件内又有多个function和class

(4)session:在整个项目会话之前和之后执行,是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module

一般会结合conftest.py文件来实现

三、fixture的5个参数详解,其二:autouse(自动调用)

autouse:控制fixture是否自动被调用,自动执行,默认是False
-False:默认是 Fasle 没开启的,需要主动调用,才会执行该前后置
-True:设置为True 开启,则自动调用:即不用再手动传参就可以自动调用fixture运行该前后置

【pytest】之fixture()和conftest使用详解

; 三、fixture的5个参数详解,其三:params(参数化)

params:用来实现参数化,进行数据驱动

  1. 通过 request参数,用来接收fixture的返回结果,并通过 request.param返回结果内容—-是固定用法(request.param这里是不用带s,一个一个读取list中的参数)
  2. list中有N组参数数据,用例就会执行N次
  3. 所有的数据驱动,都要用list格式[‘张三’,’李四’,’王五’]
import pytest

@pytest.fixture(scope="function",params=['张三','李四','王五'])
def my_fixture(request):
    print("这是前置的方法,可以实现部分以及全部用例的前后置")
    yield request.param
    print("这是后置的方法,可以实现部分以及全部用例的前后置")

class TestLogin:

    def test_login_01(self):
        print("\n测试01号登录成功")

    def test_login_02(self,my_fixture):
        print("\n测试02号登录成功",str(my_fixture))
        print('------------------\n'+str(my_fixture))

    def test_login_03(self):
        print("\n测试03号登录成功")

    def test_login_04(self):
        print("\n测试04号登录成功")

    def test_login_05(self):
        print("\n测试05号登录成功")

注意:

@pytest.fixture(scope=”function”,params=[‘张三’,’李四’,’王五’]),是参数名,有s
yield request.param,是属性名,没有s,是固定写法。

三、fixture的5个参数详解,其四:ids(参数别名)

ids:不能单独使用,必须和params一起使用,作用是:对参数化的内容加标识,对参数起别名

对参数化的内容起别名,让别人知道这个传入的参数是什么意思
默认是:传参数内容
作用不大

【pytest】之fixture()和conftest使用详解

; 三、fixture的5个参数详解,其五:name(对fixture重命名)

name:表示对fixture的名称进行重命名

  1. 一旦重命名后,只能用别名
  2. 原fixture的名称就不能再用,直接调用原fixture会报错
  3. 得用双引号括起来,如:name=”db”
@pytest.fixture(scope="function",params=reader,ids=['A','B','C'],name="db")

四、fixture结合conftest.py文件使用:

—fixture可以放在conftest中使用。

conftest.py配置需要注意以下点:

  1. conftest.py:名称固定,不能改名称;是专门用于存放fixture的配置文件;
  2. 不需要import导入conftest.py,pytest用例会自动查找;
  3. conftest.py与运行的用例最好在同一个pakage下,作用域:只对当前包起作用;
  4. conftest.py文件可以有多个,并且多个conftest.py文件里面的多个fixture可以被同一个用例调用;
  5. scope=”session” 实现多个.py跨文件使用一个session来完成多个用例。

import pytest
import uiautomator2 as u2
import time

@pytest.fixture(scope="session", autouse=True)
def device():
    d = u2.connect()
    d.unlock()
    time.sleep(1)
    pkg_name = 'com.taobao.taobao'
    currentApp = d.app_list_running()

    if pkg_name in currentApp:
        d.app_stop(pkg_name)

    d.app_start(pkg_name, wait=True)

    print("\n----------APP starts----------")
    print(d.info)
    time.sleep(10)
    yield d
    print("\n----------APP ends----------")

五、conftest和setup/teardown优先级

  • fixture(session)>fixture(class)>setup_class>fixture(function)>setup_function
  • 会话级别:fixture的session,优先级最高
  • 类:fixture的class级别优先级次之;
  • 类:setup_class优先级低于fixture;
  • 函数:fixture的function级别优先级再次之;
  • 函数:setup_function优先级低于fixture(function);

扩展:

return和yield的区别

1、return和yield都表示返回的意思,但return的后面不能有代码,返回值之后不再执行后续的代码;
2、yield返回后,可以接代码,会继续执行。

Original: https://blog.csdn.net/Moonlight_16/article/details/123086959
Author: 福多多的福
Title: 【pytest】之fixture()和conftest使用详解

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

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

(0)

大家都在看

  • python数据拼接的要求_python – 按复杂条件合并/加入2个DataFrame

    我有2个大型数据集(每个70K到110K大).我想关联/比较两者,并根据某些条件/标准找到set1中的哪些项目可以在set1中找到. 我当前的策略是按公共字段对两个列表进行排序,然…

    Python 2023年8月7日
    035
  • [性能测试] Python 内存数据库 Cyber​​DB VS Redis

    由于 CyberDB 中 proxy 的 connect 方法会检测连接是否有效,为了确保测试的公平性,我们将使用 redis 的 ping 方法与之对应。 文章将采用 Gunic…

    Python 2023年8月13日
    040
  • JavaScript 2022 最新面试题 【前端面试题】

    1.对象属性绑定的事件,取消 <script> _btn.onclick = function() {} _btn.onclick = null </script…

    Python 2023年10月8日
    027
  • typora 标题自动加编号

    网上看了挺多其他复制粘贴的方法,但是缺点都是第一级 h1 ,都算进去了 按照规范的 markdown 规范,一个 md 文件中只能出现一个 h1,就是标题 所以最大的编号应该就是 …

    Python 2023年6月12日
    048
  • Python将图片的18k的大小变大

    Python将图片的18k的大小变大 原创 wx5e6caa8b9792d2022-08-01 15:34:14博主文章分类:Python高级编程 ©著作权 文章标签 Python…

    Python 2023年5月24日
    062
  • 定量分析—频率分布直方图(groupby,agg,round具体用法)

    对数据集”捞起生鱼片”做定量分析 穿插pandas的cut,groupby,agg方法 定量数据分布分析 对于定量数据而言,选择组数与组宽是做评率分布分析时…

    Python 2023年8月7日
    056
  • 关于Retinex理论的一些理解

    目前一直在参与关于Retinex的相关课题,并完成了许多模型的构建,本文以个人的见解介绍Retinex的相关理论1. 基本原理Retinex理论是上世纪八十年代由land等人提出的…

    Python 2023年10月1日
    032
  • format()用于格式化方法,即用来控制字符串和变量的显示效果。

    format()的使用方法 <模板字符串>.format( 如果看不懂上述方法也没关系,通过一个具体的例子来说明 运行结果 为什么不直接输入:我出门玩,妈妈不同意,反而…

    Python 2023年10月2日
    045
  • pandas数据分析

    1、series数据的生成和访问2、DataFrame数据生成的几种方法3、时间序列的生成和处理4、DataFrame数据的全方位访问5、DataFrame数据的规整化处理6、Da…

    Python 2023年8月6日
    065
  • Flask

    一、Flask框架介绍 1 介绍 Flask对比其他web框架:短小精悍 中文文档(http://docs.jinkan.org/docs/flask/) 2 常用扩展包 扩展列表…

    Python 2023年8月14日
    054
  • WindivertDotnet快速发Ping

    1 前言 ValueTask SendAsync( WinDivertPacket packet, WinDivertAddress addr, CancellationToken…

    Python 2023年10月18日
    027
  • Python实现导弹自动追踪

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年10月8日
    029
  • 实用!7个强大的Python机器学习库!⛵

    💡 作者:韩信子@ShowMeAI📘 机器学习实战系列:https://www.showmeai.tech/tutorials/41📘 本文地址:https://www.showm…

    Python 2023年10月29日
    026
  • Pandas库

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

    Python 2023年8月7日
    057
  • Python+大数据-数据分析与处理(六)-综合案例

    Python+大数据-数据分析与处理(六)-综合案例 案例一:Appstore数据分析 学习目标 掌握描述性数据分析流程 能够使用pandas、seaborn进行数据分析和可视化 …

    Python 2023年8月1日
    046
  • Godot根据遮罩图移动粒子

    前言 目前UI粒子特效unity引擎比较多,也好找资料,但是一般都是利用模型,使用3D粒子伪装2D效果。 Godot中也可以做到这一点,并且Godot有专门的2D粒子系统,可以通过…

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