IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> Pytest之fixture -> 正文阅读

[开发测试]Pytest之fixture

在上一篇Pytest系列文章:Pytest之断言,主要介绍常用断言方法及异常断言。

以下主要介绍fixture的介绍、调用方式及作用域。

一、fixture基本介绍

1、fixture概念

fixture是?pytest 用于将测试前后进行预备、清理工作的代码处理机制。

2、fixture优势

fixture相对于unittest中的setup和teardown来说有以下几点优势:

  • fixure命名更加灵活,局限性比较小;

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

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

3、fixture语法

语法如下:

fixture(callable_or_scope=None,?*args,?scope="function",?params=None,?autouse=False,?ids=None,?name=None)
  • scope:fixture的作用域,默认为function;

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

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

4、定义fixture

定义fixture,在函数上添加@pytest.fixture即可。

@pytest.fixture()
def?fixture_demo():
????print("这是fixture")

5、如何区分前后置

在pytest中,用yield区分前后置,即yield前面代码为前置,后面代码为后置。

from?selenium?import?webdriver
@pytest.fixture()
def?open_browser_init():
????#?前置
????driver?=?webdriver.Chrome()
????driver.get("https://www.baidu.com")
????yield?driver
????#?后置
????driver.quit()

二、fixture调用

调用fixture的三种方式。

1、在测试用例中直接调用

将fixture名称作为参数传入测试用例,如果fixture有返回值,那么测试用例将会接收返回值。

import?pytest
from?selenium?import?webdriver
@pytest.fixture()
def?open_browser_init():
????driver?=?webdriver.Chrome()
????driver.get("https://www.baidu.com")
????yield?driver
????driver.quit()
def?test_input(open_browser_init):
????open_browser_init.find_element_by_id("kw").send_keys("ITester")

2、pytest装饰器调用fixture

在测试用例或测试类上方加上@pytest.mark.usefixtures("fixture名称")

import?pytest
from?selenium?import?webdriver
@pytest.fixture()
def?open_browser_init():
????driver?=?webdriver.Chrome()
????driver.get("https://www.baidu.com")
????yield?driver?#返回driver
????driver.quit()
@pytest.mark.usefixtures("open_browser_init")
def?test_input(open_browser_init):??#?fixture名称作为参数传入
????open_browser_init.find_element_by_id("kw").send_keys("ITester")

3、autouse调用fixture

fixture有个参数autouse,默认为False

autouse为True时,同一个作用域的所有测试用例都会调用这个fixture。

autouse为False时,需要手动调用fixture。

import?pytest

@pytest.fixture(autouse=True)
def?fixture_auto():
????print("这是fixture_auto")

def?test_demo01():
????print("运行test_demo01")

def?test_demo02():
????print("运行test_demo02")

运行结果为:

三、fixture作用域

?fixture里面有个scope参数可以控制fixture的作用范围,scope参数可以是session, module,class,function, 默认为function。

  • session 会话级别:是多个文件调用一次,可以跨.py文件调用,每个.py文件就是module;

  • module 模块级别:模块里所有的用例执行前执行一次module级别的fixture;

  • class 类级别 :每个类执行前都会执行一次class级别的fixture;

  • function ?函数级别:每个测试用例执行前都会执行一次function级别的fixture。

1、function级别范围

每个测试用例之前运行一次:

@pytest.fixture()
def?test_fixture():
????a?=?"hello"
????print("每个测试用例之前运行一次")
????yield?a
def?test_01(test_fixture):
????print("这是test_01")
????assert?"e"?in?test_fixture
def?test_02(test_fixture):
????print("这是test_02")
????assert?"h"?in?test_fixture

运行结果为:

2、class级别范围

?如果一个class里面有多个用例,都调用了此fixture,那么fixture只在此class里所有用例开始前执行一次。

import?pytest
@pytest.fixture(scope="class")
def?test_fixture():
????a?=?"hello"
????yield?a
@pytest.mark.usefixtures("test_fixture")
class?TestDemo:
????def?test_demo01(self,test_fixture):
????????assert?"h"?in?test_fixture
????def?test_demo02(self,test_fixture):
????????assert?"o"?in?test_fixture

运行结果为:

3、module级别范围

?在当前.py脚本里面所有用例开始前只执行一次。

import?pytest
@pytest.fixture(scope="module")
def?test_fixture():
????a?=?"hello"
????print("在当前文件下执行一次")
????yield?a
def?test_01(test_fixture):
????print("这是test_01")
????assert?"e"?in?test_fixture
@pytest.mark.usefixtures("test_fixture")
class?TestDemo:
????def?test_demo01(self,test_fixture):
????????print("这是test_demo01")
????????assert?"h"?in?test_fixture
????def?test_demo02(self,test_fixture):
????????print("这是test_demo02")
????????assert?"o"?in?test_fixture

运行结果为:

4、session级别范围

?session级别是可以跨模块调用的,多个模块下的用例只需调用一次fixture,那就可以设置为scope="session",并且写到conftest.py文件里。

conftest.py作用域:放到项目的根目录下就可以全局调用了,如果放到某个package下,那就在改package内有效。

conftest.py的fixture调用方式,无需导入,直接使用。

conftest.py

import?pytest
@pytest.fixture()
def?test_fixture():
????a?=?"hello"
????print("这是conftest")
????yield?a

test_demo01.py

def?test_01(test_fixture):
????print("这是test_01")
????assert?"e"?in?test_fixture

test_demo02.py

def?test_02(test_fixture):
????print("这是test_02")
????assert?"h"?in?test_fixture

命令行输入:pytest -v

输出结果如下:

感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

① 2000多本软件测试电子书(主流和经典的书籍应该都有了)

② 软件测试/自动化测试标准库资料(最全中文版)

③ 项目源码(四五十个有趣且经典的练手项目及源码)

④ Python编程语言、API接口自动化测试、web自动化测试、App自动化测试(适合小白学习)

?? ⑤ Python学习路线图(告别不入流的学习)

在我的QQ技术交流群里(技术交流和资源共享,广告进来腿给你打断)

可以自助拿走,群号953306497(备注“csdn111”)群里的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-09-01 12:14:13  更:2021-09-01 12:15:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 22:33:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码