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 用法的更多相关文章

  1. 『德不孤』Pytest框架 — 1、Pytest测试框架介绍

    目录 1.什么是单元测试框架 2.单元测试框架主要做什么 3.单元测试框架和自动化测试框架有什么关系 4.Pytest测试框架说明 5.Pytest框架和Unittest框架区别 (1)Unittes ...

  2. pytest测试框架 -- 简介

    一.pytest测试框架简介: (1)pytest是python的第三方测试框架,是基于unittest的扩展框架,比unittest更简洁,更高效. (2)pytest框架可以兼容unittest用 ...

  3. Pytest测试框架(一):pytest安装及用例执行

    PyTest是基于Python的开源测试框架,语法简单易用,有大量的插件,功能非常多.自动检测测试用例,支持参数化,跳过特定用例,失败重试等功能. 安装 pip install -U pytest  ...

  4. Pytest测试框架(二):pytest 的setup/teardown方法

    PyTest支持xUnit style 结构, setup() 和 teardown() 方法用于初始化和清理测试环境,可以保证测试用例的独立性.pytest的setup/teardown方法包括:模 ...

  5. Pytest测试框架(五):pytest + allure生成测试报告

    Allure 是一款轻量级.支持多语言的开源自动化测试报告生成框架,由Java语言开发,可以集成到 Jenkins. pytest 测试框架支持Allure 报告生成. pytest也可以生成juni ...

  6. python pytest测试框架介绍三

    之前介绍了pytest以xUnit形式来写用例,下面来介绍pytest特有的方式来写用例 1.pytest fixture实例1 代码如下 from __future__ import print_f ...

  7. 技术面试没过,居然是没有用pytest测试框架

    1.引言 我有一个朋友是做Python自动化测试的.前几天他告诉我去参加一个大厂面试被刷了. 我问他是有没有总结被刷下来的原因.他说面试官问了一些 pytest 单元测试框架相关的知识,包括什么插件系 ...

  8. Pytest测试框架一键动态切换环境思路及方案

    前言 在上一篇文章<Pytest fixture及conftest详解>中,我们介绍了fixture的一些关键特性.用法.作用域.参数等,本篇文章将结合fixture及conftest实现 ...

  9. python pytest测试框架介绍二

    在介绍一中简单介绍了pytest的安装和简单使用,接下来我们就要实际了解pytest了 一.pytest的用例发现规则 pytest可以在不同的函数.包中发现用例,发现的规则如下 文件名以test_开 ...

随机推荐

  1. 区块链学习7:超级账本项目Hyperledger与Fabric以及二者的关系

    ☞ ░ 前往老猿Python博文目录 ░ 一.超级账本(hyperledger) 超级账本(hyperledger)是Linux基金会于2015年发起的推进区块链数字技术和交易验证的开源项目,成员包括 ...

  2. Python中函数是否能使用全局变量?

    Python函数中的变量,既可以使用局部变量(本地名字空间的变量),也可以使用全局变量(全局名字空间的变量),函数在执行查找变量只读时,先在局部变量中查找,找不到再查到全局变量中查找.因此当局部变量和 ...

  3. 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析

    一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...

  4. Python基础概念学习遇到的问题

    Python运算符的优先级是怎样的? Python中的迭代是什么意思? Python中的列表解析和列表推导是一回事吗? Python中可迭代对象是什么? Python中容器指的是什么? 关于Pytho ...

  5. 分别使用python和java练习冒泡排序

    冒泡排序算法的运作如下:(从小到大)   比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针 ...

  6. Springboot集成swagger和knife

    前言 knife4j是在swagger的基本上做做了一次封装,主要体现在ui表现,所有在使用前必须先搭建好swagger2,其实是swagger和knife都可以访问, 至于哪个好用全看个人! swa ...

  7. EF CodeFirst多个数据摸型映射到一张表与各一张表

    1. 多个实体映射到一张表 Code First允许将多个实体映射到同一张表上,实体必须遵循如下规则: 实体必须是一对一关系 实体必须共享一个公共键 我们通常有这样的需求,如:同一基类派生出的不同数据 ...

  8. POJ3565

    题目大意: 给定\(n\)个蚂蚁和\(n\)颗苹果树的坐标,要求每个蚂蚁爬到一颗苹果树旁,使得每个蚂蚁路线不相交且路线总长度最小,求每个蚂蚁爬到哪个苹果树旁? 首先假设有两只蚂蚁路径相交,那么这两个蚂 ...

  9. CF1320 Div1 D.Reachable Strings 题解

    题目大意 给定一个长为\(n\)的01串\(S\),每次你可以对一个串的三个连续位置做:\(011 \rightarrow 110\),\(110 \rightarrow 011\)的操作. 有\(q ...

  10. Linux文件权限问题

    更改权限命令   chmod 常用参数 -R, --recursive change files and directories recursively (以递归的方式对目前目录下的所有档案与子目录进 ...