目录

第 2 章 fixture

2.1fixture 作为参数传入

2.2 error 和 failed 区别

2.3 使用多个 fixture

2.4 fixture 与 fixture 互相调用

2.5 fixture 作用范围

2.6 装饰器 usefixture

2.7 fixture 自动使用 autouse=True

2.8 conftest.py 作用范围


第 2 章 fixture

Fixture 是 pytest 的核心功能,本章单独拿出来详细讲解。只有熟练掌握了 fixture 的用法才 是真正的懂了 pytest 框架,写起用例来也就得心应手了。

2.1fixture 作为参数传入

fixture 是 pytest 的核心功能,也是亮点功能,必须熟练掌握 fixture 的使用方法。

fixture 简介

fixture 的目的是提供一个固定基线,在该基线上测试可以可靠的和重 复的执行。fixture 提供了区别于传统单元测试(setup/teardown)有 显著改进:

  • 有独立的命名,并通过声明它们从测试函数、模块、类或整个项 目中的使用来激活。
  • 按模块化的方式实现,每个 fixture 都可以互相调用。
  • fixture 的范围从简单的单元扩展到复杂的功能测试,允许根据配 置和组件选项对 fixture 和测试用例进行参数化,或者跨函数 function、类 class、模块 module 和整个测试会话 sessio 范围。

fixture 作为参数传入

定义 fixture 跟定义普通函数差不多,唯一区别就是在函数上加个装饰器@pytest.fixture(), fixture 命名不要用 test_开头,跟用例区分开。用例才是 test_开头的命名。 fixture 是可以有返回值的,如果没 return 默认返回 None。用例调用 fixture 的返回值,直接 就是把 fixture 的函数名称当成变量名称,如下案例:

运行结果

2.2 error 和 failed 区别

用例出现 error 和 failed 有什么区别呢?很多初学者会有返个疑惑,本 篇详细讲解什么情况会出现 error。

error 和 failed 区别

测试结果一般有三种:passed、failed、error。(skip(跳过) 的用例除外)

如果在 test_用例里面断言失败,那就是 failed

如果在 fixture 里面断言失败了,那就是 error

还有一种情况也会出现 error,那就是自己代码写的有问题,自己本身代码报错, 那就是 error 了。测试报告里面应该尽量少出现 error,报告里面 error 越多, 说明测试用例质量越差

2.3 使用多个 fixture

使用多个 fixture

如果用例需要用到多个 fixture 的返回数据,fixture 也可以 return 一个元组、 list 或字典,然后从里面取出对应数据。

ps:此处代码有误,应该为return(a,b)返回一个元组,u和p取元组下标

当然也可以分开定义成多个 fixture,然后 test_用例传多个 fixture 参数

2.4 fixture 与 fixture 互相调用

fixture 与 fixture 直接也能互相调用的

运行结果

2.5 fixture 作用范围

fixture 作用范围

fixture 里面有个 scope 参数可以控制 fixture 的作用范围:session > module > class > function

fixture(scope="function", params=None, autouse=False, ids=None, name=None): """使用装饰器标记 fixture 的功能:

可以使用此装饰器(带或不带参数)来定义 fixture 功能。 fixture 功能 的名称可以在以后使用

引用它会在运行测试之前调用它:test 模块或类可以使用 pytest.mark.usefixtures(fixturename) fixtuer的名称标记。需要在用例前声明调用

测试功能可以直接使用 fixture 名称作为输入参数,在这种情况下,夹具 实例从 fixture 返回功能将被注入:在方法中传入fixture名称

  1. :arg scope: scope 有四个级别参数 "function" (默认), "class", "module" or "session".
  2. :arg params: 一个可选的参数列表,它将导致多个参数调用 fixture 功能 和所有测试使用它
  3. :arg autouse: 如果为 True,则为所有测试激活 fixture func 可以看到 它。 如果为 False(默认值)则显式需要参考来激活 fixture
  4. :arg ids: 每个字符串 id 的列表,每个字符串对应于 params 这样他们就 是测试 ID 的一部分。 如果没有提供 ID 它们将从 params 自动生成
  5. :arg name: fixture 的名称。 这默认为装饰函数的名称。 如果 fixture 在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能 arg 遮蔽; 解 决这个问题的一种方法是将装饰函数命名:“fixture_ <fixturename>”然后使用”@ pytest.fixture(name='<fixturename>')
  • function 每一个函数或方法都会调用
  • class 每一个类调用一次,一个类可以有多个方法
  • module,每一个.py 文件调用一次,该文件内又有多个 function 和 class
  • session 是多个文件调用一次,可以跨.py 文件调用,每个.py 文件就是 module

scope="function"

@pytest.fixture()如果不写参数,默认就是 scope="function",它的作用范围 是每个测试用例来之前运行一次,销毁代码在测试用例运行之后运行。

运行结果

用例放到类里面也一样

运行结果

scope="class"

fixture 为 class 级别的时候,如果一个 class 里面有多个用例,都调用了此 fixture,那么此 fixture 只在该 class 里所有用例开始前执行一次

运行结果

scope="module"

fixture 为 module 级别时,在当前.py 脚本里面所有用例开始前只执行一次

运行结果

scope="session"

fixture 为 session 级别是可以跨.py 模块调用的,也就是当我们有多个.py 文件 的用例时候,如果多个用例只需调用一次 fixture,那就可以设置为 scope="session",并且写到 conftest.py 文件里

conftest.py 文件名称是固定的,pytest 会自动识别该文件。放到工程的根目录 下,就可以全局调用了,如果放到某个 package 包下,那就只在该 package 内有 效

cnoftest.py

test04.py

运行结果

2.6 装饰器 usefixture

当用例需要调用 fixture 时,前面讲到可以直接在用例里加 fixture 参数,如果 一个测试 class 都需要用到 fixture,每个用例都去传参,会比较麻烦,这个时 候,可以在 class 外面加 usefixture 装饰器,让整个 class 都调用 fixture 调用 fixture 三种方法

  • 函数或类科目方法直接传 fixture 的函数参数名称
  • 使用装饰器@pytest.mark.usefixtures()修饰
  • autouse=True 自动使用

用例传 fixture 参数

方法一:先定义 start 功能,用例全面传 start 参数,调用该功能

装饰器 usefixtures

方法二:使用装饰器@pytest.mark.usefixtures()修饰需要运行的用例

叠加 usefixtures

如果 class 用例需要同时调用多个 fixture,可以使用 @pytest.mark.usefixtures()叠加。 注意叠加顺序,先执行的放底层,后执行的放上层

运行结果

usefitures 与传 fixture 区别

提供上面 2 个案例,对 usefixtures 使用基本方法已经掌握了,但是你 会发现,上面给的 2 个案例的 fixture 是没有返回值的。如果 fixture 有返回值,那么 usefixtures 就无法获取到返回值了,这个是它与用例 直接传 fixture 参数的区别。

也就是说当 fixtire 的 return 值需要使用时,叧能在用例里面传 fixture 参数了。

当 fixture 没有 return 值时候,两种方法都可以

2.7 fixture 自动使用 autouse=True

平常写自动化用例会写一些前置的 fixture 操作,用例需要用到就 直接传该函数的参数名称就行了。当用例很多的时候,每次都传这个参 数,会比较麻烦。

fixture 里面有个参数 autouse,默认是 Fasle 没开启的,可以设置为 True 开启自动使用 fixture 功能,返样用例就补用每次都去传参了

调用 fixture 三种方法

1.函数或类里面方法直接传 fixture 的函数参数名称

2.使用装饰器@pytest.mark.usefixtures()修饰

3.autouse=True 自动使用

1和2方法前面有讲到

设置 autouse=True

方法三、autouse 设置为 True,自动调用 fixture 功能

start 设置 scope 为 module 级别,在当前.py 用例模块叧执行一 次,autouse=True 自动使用

open_home 设置 scope 为 function 级别,每个用例前都调用 一次,自动使用

运行结果

上面是函数去实现用例,写的 class 里也是一样可以的

2.8 conftest.py 作用范围

一个测试工程下是可以有多个 conftest.py 的文件,一般在工程根目录放一个 conftest.py 起到全局作用。 在不同的测试子目录也可以放 conftest.py,作用范围只在该层级以及以下目录 生效。

conftest 层级关系

在 web_conf_py 项目工程下建两个子项目 baidu、blog,并且每个目录下都放一 个 conftest.py 和__init__.py(python 的每个 package 必须要有__init__.py)

层级关系总结:工程文件的conftest.py>子模块的

子模块可以调用 工程文件的conftest.py

子模块之间的conftest.py不能相互调用

pytest框架笔记(三)之fixture相关推荐

  1. pytest框架中parametrize、fixture、request怎么混合使用?

    一.前言 作为软件测试工程师想必大家对于pytest框架并不陌生吧,那么今天呢笔者想和大家唠唠pytest框架中的parametrize.fixture.request的混合使用,如果你还不知道什么是 ...

  2. pytest测试框架_聊聊 Python 的单元测试框架(三):最火的 pytest

    本文首发于 HelloGitHub 公众号,并发表于 Prodesire 博客. 一.介绍 本篇文章是<聊聊 Python 的单元测试框架>的第三篇,前两篇分别介绍了标准库 unittes ...

  3. pytest框架精髓—fixture

    简介 一直在和大家聊pytest的一些内容,今天呢想和大家分享pytest框架的精髓,话不多说,我们直接开始吧,还有喜欢的记得关注我哟. 介绍: fixture区别于unnitest的传统单元测试(s ...

  4. pytest框架之fixture详细使用

    简介: fixture区别于unnitest的传统单元测试(setup/teardown)有显著改进: 1.有独立的命名,并通过声明它们从测试函数.模块.类或整个项目中的使用来激活. 2.按模块化的方 ...

  5. Python pytest框架之@pytest.fixture()和conftest详解

    一.fixture简介 学pytest就不得不说fixture,fixture是pytest的精髓所在,类似unittest中setup/teardown这种前后置东西.但是比它们要强大.灵活很多,它 ...

  6. Spring框架学习笔记(三)(AOP,事务管理)

    Spring框架学习笔记(三) 九.AOP 9.1 AOP的注解配置 (1) 新建计算器核心功能(模拟:不能在改动核心代码) (2) 建立一个普通的Java类写增强代码(面向切面编程),使用Sprin ...

  7. 【pytest】(三) pytest中的fixture (2) : fixture的声明和调用

    目录 1. fixture的声明 2. fixture的调用 2.1 fixture的调用方式 2.1.1 使用fixturename 2.1.2 使用`@pytest.mark.usefixture ...

  8. pytest框架_Python最火的第三方开源测试框架——pytest

    一.介绍 本篇文章是介绍的是Python 世界中最火的第三方单元测试框架:pytest.它有如下主要特性: assert 断言失败时输出详细信息(再也不用去记忆 self.assert* 名称了) 自 ...

  9. pytest框架实现一些前后置(固件,夹具)的处理

    pytest框架实现一些前后置(固件,夹具)的处理,常用的有三种 一.setup/teardown,setup_class/teardown_class所有 为什么需要这些功能? 比如:web自动化执 ...

最新文章

  1. 青少年编程竞赛交流群周报(第039周)
  2. js脚本屏蔽页面点击
  3. 使用Base64进行string的加密和解密
  4. SAP Spartacus cost-center.config.ts里定义的paramsMapping
  5. 解决a different object with the same identifier value was already associated with the session错误...
  6. win10更新后开不了机_win7在线更新window10系统
  7. 优酷股东变更 阿里通过全资子公司土豆继续持有优酷
  8. 构建私有的 CA 机构
  9. tomcat 在linux下的关闭问题
  10. 如何安装GlobalMapper
  11. php扩展-ioncube组件的安装方法_最新Phpstudy 安装 Ioncube Loader扩展方法分享
  12. java 调度_几种任务调度的Java实现方法与比较
  13. 2023年入学华东师范大学MBA提前面试流程及时间-文都管联院
  14. 如何读懂和利用你的微生物多样性测序结果?
  15. 东华考研复试21-30oj
  16. 游戏开发程序员可能会遇到的英文单词
  17. Unity游戏开发前置知识
  18. 买服务器为何选择华为云?
  19. 使用weixin-java-miniapp实现微信小程序登录接口
  20. PDF文件压缩的简单方法

热门文章

  1. bug_ renren-fast注册到 nacos上
  2. Java输入输出流代码示例
  3. 小数分频锁相环中的整数边界杂散IBS
  4. eggs和egg是什么意思_eggs怎么读,是什么意思?
  5. Xcode10打包引起iOS9.0-9.2系统的用户启动App随机崩溃的问题修复记录
  6. LAMP编程之Linux-1
  7. 【C语言】文件管理<2>
  8. 信息爆炸时代的知识获取
  9. 线性代数笔记-线性空间和矩阵复习
  10. Photoshop学习笔记之色彩学的概念与常识