pytest fixture的使用总结

 


1、前言

  如果我想实现以下场景:用例1 要先登录,用例2不需要登录,用例3需要登录。 很显然这就无法用setup和teardown来实现了。 这就是本篇学习的目的:自定义测试用例的预置条件;

2、fixture是什么?

  1) fixture 是在测试函数运行前后,由pytest 执行的外壳函数;fixture的本质就是函数。

  2)它的作用是将一些非核心的测试逻辑从测试函数中分离出来,以便于其他测试函数使用,同时保持这些边缘逻辑的一致性

  3)fixture中的代码可以进行定制,满足多变的测试需求,包括:定义传入测试中的数据集,配置测试前系统的初始状态,为批量测试提供数据源等

3、fixture的定义

通过一个例子来看一下fixture的定义:

  @pytest.fixture()装饰器用于声明函数是一个fixture。即 被装饰器修饰的函数就是一个fixture函数,fixture函数内部可以实现一些初始化的操作。

1 @pytest.fixture(scope="function")  # 作用域:函数级别
2 def login():
3     print('输入用户名、密码登录')

4、Fixture参数详解

4.1 Fixture的调用方式 :

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

4.2 参数详解:

4.2.1 SCOPE

用于控制Fixture的作用范围
作用类似于Pytest的setup/teardown
默认取值为function(函数级别),控制范围的排序为:session > module > class > function

function:函数级 每一个函数或方法都会调用 ;class:函数级 模块级 每一个.py文件调用一次;module:模块级 每一个.py文件调用一次;session:会话级 每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法

4.2.2 params

Fixture的可选形参列表,支持列表传入
默认None,每个param的值
fixture都会去调用执行一次,类似for循环
可与参数ids一起使用,作为每个参数的标识,详见ids
被Fixture装饰的函数要调用是采用:request.param

  4.2.3 ids

用例标识ID,与params配合使用,一对一关系.

 4.2.4 Name

----fixture的重命名
    通常来说使用 fixture 的测试函数会将 fixture 的函数名作为参数传递,但是 pytest 也允许将fixture重命名
    如果使用了name,那只能将name传如,函数名不再生效
    调用方法:@pytest.mark.usefixtures(‘fixture1’,‘fixture2’)

    4.2.5 autouse

默认False,若为True,刚每个测试函数都会自动调用该fixture,无需传入fixture函数名,作用范围跟着scope走(谨慎使用)

 5、Fixture使用方法

1)fixture函数名直接作为测试用例的实参进行传递

2)使用装饰器 @pytest.mark.usefixtures("fixture")修饰测试用例函数---括号内为fixture函数名称

 3)使用autouse 参数

指定fixture的参数 autouse=True 这样每个测试用例函数 会自动调用fixtrue(这里其实不准确,因为还涉及到fixture的范围scope,autouse=True时 在设置的范围内都会被调用)

 小结: 如果测试用例需要使用fixture中返回的参数,那么通过后面的这两种方法是无法使用返回的参数的,因为fixture中返回的数据默认存在fixture名字里,所以只能使用第一种方式才可以调用fixture种的返回值。

复制代码
 1 @pytest.fixture()
 2 def login():
 3     print('请输入用户名和密码登录')
 4     return "hello"
 5 
 6 
 7 def test_01(login):
 8     print("用例01,执行前需要先调用login")
 9     print(login + 'word')
10 
11 
12 @pytest.mark.usefixtures('login')
13 def test_02():
14     print('用例02,执行前需要先调用login')
15 
16 
17 def test_03():
18     print('用例03,执行前需要调用login')
19 
20 
21 if __name__ == '__main__':
22     pytest.main(['-vs', 'test_fixture.py'])
复制代码

部分内容摘自:

https://www.cnblogs.com/1050619969kong/p/15572830.html
https://blog.csdn.net/qq_42610167/article/details/119818358

posted @   别摸我的马甲线  阅读(213)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示