Pytest之fixture
VOL 148
10
2020-08
今天距2021年143天
这是ITester软件测试小栈第148次推文
点击上方蓝字“ITester软件测试小栈“关注我,每周一、三、五早上 07:30准时推送。
微信公众号后台回复“资源”、“测试工具包”领取测试资源,回复“微信群”一起进群打怪。
本文4143字,阅读约需11分钟
在上一篇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
输出结果如下:
以上
That‘s all
更多系列文章
敬请期待
ITester软件测试小栈
- 比特币分叉了,这到底是怎么回事?
- Excel导入导出数据库01
- 一些移动 Web 前端开发上的要点记录
- Angularjs基础(十一)
- Silverlight 2 的基础XAML语法学习
- TextView显示html文件中的图片
- 继百度、阿里之后,农业也刮起人工智能风,看它们都干了些啥?
- Windows Server 2008 与 .NET Framework 的版本之间有什么关系
- asp.net mvc相关开源项目推荐
- Android监听来电和去电
- PostCSS 插件postcss-lazyimagecss:自动填写width / height 属性
- Angularjs基础(十)
- Mac 中JetBrain 系列IDE 的配置文件同步(通过Dropbox)
- 面向服务架构(SOA)和企业服务总线(ESB)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Hadoop 分布式部署 十 一: NameNode HA 自动故障转移】
- Hive安装部署及简单测试 网页《一》
- Hive初步使用、安装MySQL 、Hive配置MetaStore、配置Hive日志《二》
- Python - lambda函数
- Oracle 基础学习笔记
- 算法【最大子序列问题】
- 【算法、递归回溯解决数独】
- Anaconda使用命令
- 最大连续子数组
- markdown编辑器实现代码高亮
- LeetCode - 198 简单动态规划 打家劫舍
- Jaskson精讲第7篇-JsonTypeInfo注解在类继承关系下的使用
- 《剑指Offer 1.二维数组中的查找》2019-03-25
- Elasticsearch:Dynamic mapping
- 设计模式《单例设计模式》