Pytest测试框架(三):pytest fixture 用法
xUnit style 结构的 fixture用于初始化测试函数, pytest fixture是对传统的 xUnit 架构的setup/teardown功能的改进。pytest fixture为测试准备一个良好的测试环境,测试函数使用的每个 fixture通常有一个参数(以 fixture 命名),测试函数通过参数访问它们。本文将介绍pytest fixture的一些基本用法。
@pytest.fixture
import pytest
@pytest.fixture()
def login():
print("登录")
return 8
class Test_Demo():
def test_case1(self):
print("\n开始执行测试用例1")
assert 1 + 1 == 2
def test_case2(self, login):
print("\n开始执行测试用例2")
print(login)
assert 2 + login == 10
def test_case3(self):
print("\n开始执行测试用例3")
assert 99 + 1 == 100
if __name__ == '__main__':
pytest.main()
test_case2需要调用login方法(或者获取login的返回值),pytest 将会寻找并调用@pytest.fixture标记的login() 方法。
结果:
PASSED [ 33%]
开始执行测试用例1
登录
PASSED [ 66%]
开始执行测试用例2
8
PASSED [100%]
开始执行测试用例3
共享 fixture 函数:conftest.py
在测试过程中,多个测试文件可能都要调用 fixture 函数,可以将其移动到 conftest.py 文件中。conftest.py 文件中的 fixture 函数不需要在测试函数中导入,可以被 pytest 自动识别,查找顺序从测试类开始,然后是测试模块,然后是 conftest.py 文件,最后是内置插件和第三方插件。
conftest.py :
import pytest
@pytest.fixture()
def login():
print("登录")
return 8
测试用例:
import pytest
class Test_Demo():
def test_case1(self):
print("\n开始执行测试用例1")
assert 1 + 1 == 2
def test_case2(self, login):
print("\n开始执行测试用例2")
print(login)
assert 2 + login == 10
def test_case3(self):
print("\n开始执行测试用例3")
assert 99 + 1 == 100
if __name__ == '__main__':
pytest.main()
结果:
PASSED [ 33%]
开始执行测试用例1
登录
PASSED [ 66%]
开始执行测试用例2
8
PASSED [100%]
开始执行测试用例3
yield方法
使用yield关键字可以实现setup/teardown的功能,在yield关键字之前的代码在case之前执行,yield之后的代码在case运行结束后执行
import pytest
@pytest.fixture()
def login():
print("登录")
yield
print("退出登录")
class Test_Demo():
def test_case1(self):
print("\n开始执行测试用例1")
assert 1 + 1 == 2
def test_case2(self, login):
print("\n开始执行测试用例2")
assert 2 + 8 == 10
def test_case3(self):
print("\n开始执行测试用例3")
assert 99 + 1 == 100
if __name__ == '__main__':
pytest.main()
结果:
PASSED [ 33%]
开始执行测试用例1
登录
PASSED [ 66%]
开始执行测试用例2
退出登录
PASSED [100%]
开始执行测试用例3
addfinalizer方法
addfinalizer也可以实现环境的清理,实现与yield方法相同的效果,跟yield不同的是需要注册作为终结器使用的函数。
import pytest
@pytest.fixture()
def login(request):
print("登录")
def demo_finalizer():
print("退出登录")
# 注册demo_finalizer为终结函数
request.addfinalizer(demo_finalizer)
class Test_Demo():
def test_case1(self):
print("\n开始执行测试用例1")
assert 1 + 1 == 2
def test_case2(self, login):
print("\n开始执行测试用例2")
assert 2 + 8 == 10
def test_case3(self):
print("\n开始执行测试用例3")
assert 99 + 1 == 100
if __name__ == '__main__':
pytest.main()
结果:
PASSED [ 33%]
开始执行测试用例1
登录
PASSED [ 66%]
开始执行测试用例2
退出登录
PASSED [100%]
开始执行测试用例3
fixture 作用范围:Scope
fixture 作用范围可以为module、class、session和function,默认作用域为function。
- function:每一个函数或方法都会调用
- class:每一个类调用一次
- module:每一个.py文件调用一次
- session:是多个文件调用一次
scope="function"
import pytest
@pytest.fixture(scope="function")
def login():
print("登录...")
class Test_Demo():
def test_case1(self, login):
print("\n开始执行测试用例1")
assert 1 + 1 == 2
def test_case2(self, login):
print("\n开始执行测试用例2")
assert 2 + 8 == 10
def test_case3(self, login):
print("\n开始执行测试用例3")
assert 99 + 1 == 100
if __name__ == '__main__':
pytest.main()
结果:
登录...
PASSED [ 33%]
开始执行测试用例1
登录...
PASSED [ 66%]
开始执行测试用例2
登录...
PASSED [100%]
开始执行测试用例3
scope="class"
一个class里面多个用例都调用了此fixture,那么只在class里所有用例开始前执行一次
import pytest
@pytest.fixture(scope="class")
def login():
print("登录...")
结果:
登录...
PASSED [ 33%]
开始执行测试用例1
PASSED [ 66%]
开始执行测试用例2
PASSED [100%]
开始执行测试用例3
fixture自动应用
autouse参数
autouse设置为True时,自动调用fixture功能。由于默认作用域为function,不指定scope则每个方法都会调用fixture方法。
import pytest
@pytest.fixture(autouse=True)
def login():
print("登录...")
class Test_Demo():
def test_case1(self):
print("\n开始执行测试用例1")
assert 1 + 1 == 2
def test_case2(self):
print("\n开始执行测试用例2")
assert 2 + 8 == 10
def test_case3(self):
print("\n开始执行测试用例3")
assert 99 + 1 == 100
if __name__ == '__main__':
pytest.main()
结果:
登录...
PASSED [ 33%]
开始执行测试用例1
登录...
PASSED [ 66%]
开始执行测试用例2
登录...
PASSED [100%]
开始执行测试用例3
@pytest.mark.usefixtures()
在测试方法上加@pytest.mark.usefixtures()
import pytest
@pytest.fixture()
def login():
print("登录...")
@pytest.mark.usefixtures("login")
class Test_Demo():
def test_case1(self):
print("\n开始执行测试用例1")
assert 1 + 1 == 2
def test_case2(self):
print("\n开始执行测试用例2")
assert 2 + 8 == 10
def test_case3(self):
print("\n开始执行测试用例3")
assert 99 + 1 == 100
if __name__ == '__main__':
pytest.main()
结果:
登录...
PASSED [ 33%]
开始执行测试用例1
登录...
PASSED [ 66%]
开始执行测试用例2
登录...
PASSED [100%]
开始执行测试用例3
fixture函数参数化
如果多条用例都需要调用相同参数,可以将fixture函数参数化。fixture 函数将执行每个参数值,fixture通过固定参数request传递。
import pytest
@pytest.fixture(scope="module", params=[
[1, 1, 2],
[2, 8, 10],
[99, 1, 100]
])
def data(request):
yield request.param
class Test_Demo():
def test_case1(self):
print("\n开始执行测试用例1")
assert 2 + 8 == 10
def test_case2(self, data):
print("\n开始执行测试用例2")
assert data[0] + data[1] == data[2]
def test_case3(self):
print("\n开始执行测试用例3")
assert 99 + 1 == 100
if __name__ == '__main__':
pytest.main()
结果:
PASSED [ 20%]
开始执行测试用例1
PASSED [ 40%]
开始执行测试用例2
PASSED [ 60%]
开始执行测试用例2
PASSED [ 80%]
开始执行测试用例2
PASSED [100%]
开始执行测试用例3
--THE END--
文章标题:Pytest测试框架(三):pytest fixture 用法
本文作者:hiyo
本文链接:https://www.cnblogs.com/hiyong/p/14163280.html
欢迎关注公众号:「测试开发小记」及时接收最新技术文章!
Pytest测试框架(三):pytest fixture 用法的更多相关文章
- 『德不孤』Pytest框架 — 1、Pytest测试框架介绍
目录 1.什么是单元测试框架 2.单元测试框架主要做什么 3.单元测试框架和自动化测试框架有什么关系 4.Pytest测试框架说明 5.Pytest框架和Unittest框架区别 (1)Unittes ...
- pytest测试框架 -- 简介
一.pytest测试框架简介: (1)pytest是python的第三方测试框架,是基于unittest的扩展框架,比unittest更简洁,更高效. (2)pytest框架可以兼容unittest用 ...
- Pytest测试框架(一):pytest安装及用例执行
PyTest是基于Python的开源测试框架,语法简单易用,有大量的插件,功能非常多.自动检测测试用例,支持参数化,跳过特定用例,失败重试等功能. 安装 pip install -U pytest ...
- Pytest测试框架(二):pytest 的setup/teardown方法
PyTest支持xUnit style 结构, setup() 和 teardown() 方法用于初始化和清理测试环境,可以保证测试用例的独立性.pytest的setup/teardown方法包括:模 ...
- Pytest测试框架(五):pytest + allure生成测试报告
Allure 是一款轻量级.支持多语言的开源自动化测试报告生成框架,由Java语言开发,可以集成到 Jenkins. pytest 测试框架支持Allure 报告生成. pytest也可以生成juni ...
- python pytest测试框架介绍三
之前介绍了pytest以xUnit形式来写用例,下面来介绍pytest特有的方式来写用例 1.pytest fixture实例1 代码如下 from __future__ import print_f ...
- 技术面试没过,居然是没有用pytest测试框架
1.引言 我有一个朋友是做Python自动化测试的.前几天他告诉我去参加一个大厂面试被刷了. 我问他是有没有总结被刷下来的原因.他说面试官问了一些 pytest 单元测试框架相关的知识,包括什么插件系 ...
- Pytest测试框架一键动态切换环境思路及方案
前言 在上一篇文章<Pytest fixture及conftest详解>中,我们介绍了fixture的一些关键特性.用法.作用域.参数等,本篇文章将结合fixture及conftest实现 ...
- python pytest测试框架介绍二
在介绍一中简单介绍了pytest的安装和简单使用,接下来我们就要实际了解pytest了 一.pytest的用例发现规则 pytest可以在不同的函数.包中发现用例,发现的规则如下 文件名以test_开 ...
随机推荐
- python之Bug之字符串拼接bug
\r\n拼接Bug 环境: python3.4.pycharm2017 偶然的学习中遇到了一个问题,百思不得姐,什么问题呢,大家输入太快了,难免有失误就如下面的代码 #构造响应数据 response_ ...
- 搭建ARL资产安全灯塔
老年人了,只能靠安装部署项目混混日子这样~ 简介: 斗象TCC团队正式发布「ARL资产安全灯塔」开源版,该项目现已上线开源社区GitHub.ARL旨在快速侦察与目标关联的互联网资产,构建基础资产信息库 ...
- 手机APP测试(测试点、测试流程、功能测试)
1.功能测试 1.1 启动 APP安装完成后,是否可以正常打开,稳定运行 APP的速度是可以让人接受,切换是否流畅 网络异常时,应用是否会崩溃:在请求超时的情况下,如果程序逻辑处理的不好,就有可能发生 ...
- (转)oracle体系结构
对于一门技术的学习,尤其是像Oracle database这种知识体系极其庞杂的技术来讲,从宏观上了解其体系结构是至关重要的.同时,个人认为,未必是专业DBA人员才需要了解其体系结构(固然对于数据库专 ...
- Scrum 冲刺 第二篇
Scrum 冲刺 第二篇 每日会议照片 昨天已完成工作 队员 昨日完成任务 黄梓浩 初步完成app项目架构搭建 黄清山 完成部分个人界面模块数据库的接口 邓富荣 完成部分后台首页模块数据库的接口 钟俊 ...
- 第 3 篇 Scrum 冲刺博客
每天举行会议 会议照片: 昨天已完成的工作与今天计划完成的工作及工作中遇到的困难: 成员姓名 昨天完成工作 今天计划完成的工作 工作中遇到的困难 蔡双浩 了解任务,并做相关学习和思考,创建基本的收藏夹 ...
- NOI Online 题解
T1 对\(t_i = 1\)的边,将\(u_i, v_i\)连一条边权为\(1\)的边.否则连一条边权为\(0\)的边. 对于每一个连通块,若图中不存在一条边权之和为奇数的圈,则可以将这个连通块二染 ...
- 二、初步认识LoadRunner工具
LoadRunner工具有三个组成分别是: Virtual User Generator:用户行为模拟:录制运行脚本. Controller:上面的录制一个用户操作,这个可以将其克隆成多个用户,模拟多 ...
- Spring Boot 2.4 对多环境配置的支持更改
在目前最新的Spring Boot 2.4版本中,对配置的加载机制做了较大的调整.相关的问题最近也被问的比较多,所以今天就花点时间,给大家讲讲Spring Boot 2.4的多环境配置较之前版本有哪些 ...
- CDH6.3.0下Apache Atlas2.1.0安装与配置
CDH6.3.0下Apache Atlas2.1.0安装与配置 0. 说明 文中的${ATLAS_HOME}, ${HIVE_HOME} 环境变更需要根据实际环境进行替换. 1. 依赖 A. 软件依赖 ...