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. PyQt(Python+Qt)学习随笔:工具箱(QToolBox)编程使用的步骤及示例代码

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 使用toolBox开发应用时,通过Designer设计ui界面时,只能在Designer中设计too ...

  2. PyQt(Python+Qt)学习随笔:视图中的拖放操作注意事项

    老猿Python博文目录 老猿Python博客地址 在通过PyQt构建的图形界面中进行拖放,要成功进行拖放需要注意: 视图相关属性需要支持拖放,具体相关属性请参考<PyQt(Python+Qt) ...

  3. 本文帮你在 Unix 下玩转 C 语言

    shell是一种特殊的应用程序(命令行解释器),他为运行其他应用程序提供了一个接口. posix规范了操作系统是什么样 每个进程都有一个工作目录(又叫当前目录),相对路径都是从工作目录开始解释. Ct ...

  4. sqoop进行将Hive 词频统计的结果数据传输到Mysql中

    使用sqoop进行将Hive 词频统计的结果数据传输到Mysql中. mysql准备接受数据的数据库与表 hive准备待传输的数据 sqoop进行数据传输  mysql查看传输结果     二:电子书 ...

  5. C++ 纯虚函数与抽象类——virtual 和纯说明符 “=0”

    什么时候使用纯虚函数 某些类,在现实角度和项目角度都不需要实例化(不需要创建它的对象),这个类中定义的某些成员函数只是为了提供一个形式上的接口,准备上子类来做具体的实现.此时这个方法就可以定义为&qu ...

  6. mysql 8.0忘记root密码

    1.修改参数文件添加以下内容 skip-grant-tables 2.关闭数据库 [root@node01 ~]# /etc/init.d/mysqld8 stop Shutting down MyS ...

  7. 关于golang的time包总结

    目录 前言 time包详解 总结 前言 各种编程语言都少不了与时间有关的操作,因为很多判断都是基于时间,因此正确和方便的使用时间库就很重要额. golang提供了import "time&q ...

  8. JVM虚拟机(二):字节码执行引擎

    运行时栈帧结构     栈帧是用于支持虚拟机进行方法调用和方法执行背后的数据结构,它也是虚拟机运行时数据区中的虚拟机栈的栈元素.栈帧存储了方法的局部变量表.操作数栈.动态链接.和方法返回地址等信息. ...

  9. JVM的艺术—JAVA内存模型

    *喜欢文章,动动手指点个赞 * 引言 亲爱读者你们好,关于jvm篇章的连载,前面三章讲了类加载器,本篇文章将进入jvm领域的另一个知识点,java内存模型.彻底的了解java内存模型,是有必要的.只要 ...

  10. Eureka系列(五) 服务续约流程具体实现

    服务续约执行简要流程图   下面这张图大致描述了服务续约从Client端到Server端的大致流程,详情如下: 服务续约Client源码分析   我们先来看看服务续约定时任务的初始化.那我们的服务续约 ...