上篇文章中提到了,在pytest中的fixture可以完成unitest中setUp、tearDown。今天就来详细看一下。

一、pytest中的fixture是什么

为可靠的和可重复执行的测试提供固定的基线(可以理解为测试的固定配置,使不同范围的测试都能够获得统一的配置),fixture提供了区别于传统单元测试(setup/teardown)风格的令人惊喜的功能,而且pytest做得更炫。

二、pytest中fixture的使用

1.fixture 可以作为一个函数的参数被调用



如上图, 这里的 test_ehlo函数,需要参数值smtp_connection,pytest就是找到并且调用这个用@pytest.fixture装饰的smtp_connection函数。

换句话讲,被装饰器装饰的函数或者方法,仍然可以被调用。步骤是这样的:

  • pytest 找到test_ 开头的函数,于是找到了test_ehlo
  • test_ehlo这个测试函数,需要一个参数smtp_connection,于是函数smtp_connection被找到
  • smtp_connection被调用来创建一个实例

2.fixture可以在一个类、或者一个模块、或者整个session中被共享,加上范围即可



如上图,加入scope=“module”的参数,可以让fixture function在每次模块测试的时候只请求一次。这样不同的test function在同一个test module中接收到的 smtpfixture参数都是一样的。这里的smtp_connection,就可以在这个模块中,共享使用。类似的:

如果想在一个类中使用,那么@pytest.fixture(scope="class");

如果想在全部会话中使用,那么@pytest.fixture(scope="session")。

3.fixture也可以单独存放

有的时候为了方便配置和访问,也可以将这样的fixture放到conftest.py文件中单独存放(注意:该文件要放在case同级目录下哦)。

4.同一个模块里出现多个范围的装饰

当出现多个范围装饰的时候,优先实例化范围优先级高的。

也就是优先级从大到小:session-->module–->class–->function

5.fixture的如何实现teardown



上图代码中的 print("teardown smtp")和smtp.close(),会在module范围内的最后一个测试完成后执行,不管测试中有没有exception的状态。

如果我们在装饰器中指定scope="function",那么stmp将会在每次单个测试中建立和清除。

6.fixture中的参数 autouse

关于autouse,默认是False, 如果不加scope='session',的使用autouse,只在当前module下有效。

① 如果你想一个module下的都用上,那就打开改成True, 如下,这样就不需要往每个函数里传入fixture,例如:



看下运行结果:

② 同样的,当我加上scope="class"时,当前模块下的所有类,都会调用一次fixture。



看下运行结果:

③ 文件中同时包含了function,class,就不可以使用autouse了,否则function也会执行到



看运行结果:

④ 如何运行类的fixture

这里使用一个更加通用的方法即可,@pytest.mark.usefixtures("这里是你要用的fixture"),标记在你要使用的类。



看下运行结果:



这里要注意的是:scope=“class”,别忘记添加,否则类下的每个function都会执行。

⑤ 当scope='session'时,要注意的点!

如果你的scope='session',那么不要像function,class,module那样,和case放在一起,我们要放在另一个文件,conftest.py下,才可以。

这里是同一个项目下的,2个case文件:





还有个同项目下的 conftest.py:



运行测试case,这个2个case文件下的所有case都会被找到,但是只会执行一次conftest.py中的 fixture。

⑥ 当case里需要传入多个 fixture 或者 yield 怎么办呢? 先后执行的顺序是什么?

在后续使用的过程中,遇到了case里我想传入多个yield,于是写了demo验证了下。下面上结果,就不放截图啦(形式传参“before”表示执行在case前,“yield”表示执行在case后)

  • def test_1(before, yield) 与 def test_1(yield,before)

    结论:不管你顺序如何,依旧会先执行case前的before,case结束后执行yield
  • def test_2(before1, before2, yield)

    结论:这样有多个before,会依次按传参顺序先后执行。
  • def test_3(before, yield1, yield2)

    结论:这样有多个yield的,会依次从后往前执行,这里先执行yield2,再执行yield1。

关于pytest的fixture使用,就先写这么多吧,应该可以满足日常使用的场景了,欢迎补充。

6. 重点来啦,pytest的各种装饰圈fixtures的更多相关文章

  1. pytest自动化6:pytest.mark.parametrize装饰器--测试用例参数化

    前言:pytest.mark.parametrize装饰器可以实现测试用例参数化. parametrizing 1.  下面是一个简单是实例,检查一定的输入和期望输出测试功能的典型例子 2.  标记单 ...

  2. 『德不孤』Pytest框架 — 11、Pytest中Fixture装饰器(一)

    目录 1.Fixture装饰器的用途 2.Fixture参数说明 3.Fixture装饰器简单应用 4.yield执行后置函数 1.Fixture装饰器的用途 做测试前后的初始化设置,如测试数据准备, ...

  3. 『德不孤』Pytest框架 — 12、Pytest中Fixture装饰器(二)

    目录 5.addfinalizer关键字 6.带返回值的Fixture 7.Fixture实现参数化 (1)params参数的使用 (2)进阶使用 8.@pytest.mark.usefixtures ...

  4. 『德不孤』Pytest框架 — 13、Pytest中Fixture装饰器(三)

    目录 9.ids参数说明 10.name参数说明 11.scope参数说明 (1)scope="function" (2)scope="class" (3)sc ...

  5. 10、pytest -- skip和xfail标记

    目录 1. 跳过测试用例的执行 1.1. @pytest.mark.skip装饰器 1.2. pytest.skip方法 1.3. @pytest.mark.skipif装饰器 1.4. pytest ...

  6. Pytest系列(9) - 参数化@pytest.mark.parametrize

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 pytest允许在多个级别启 ...

  7. pytest学习纪要123-针对经常用到的内容详实记录

    pytest123 本文主要参考:https://www.cnblogs.com/yoyoketang/tag/pytest 如有侵权,请站内联系我 目录 pytest123 1.setup和tear ...

  8. Python 自动化测试框架 unittest 和 pytest 对比

    一.用例编写规则 1.unittest提供了test cases.test suites.test fixtures.test runner相关的类,让测试更加明确.方便.可控.使用unittest编 ...

  9. pytest 8 参数化parametrize

    pytest.mark.parametrize装饰器可以实现用例参数化 1.以下是一个实现检查一定的输入和期望输出测试功能的典型例子 import pytest @pytest.mark.parame ...

随机推荐

  1. Open XML 检索 EXCEL

    1.Excel 隐藏行判断 项目的 Hidden 属性不为 null,且 Hidden 属性的值为 True var itemList = ws.Descendants<Row>(). W ...

  2. android 记录所有打开的Activity,退出程序

    android 记录所有打开的Activity,退出程序   package com.main.server; import java.util.LinkedList; import java.uti ...

  3. go语言 robfig/cron包 实现定时 调用

    package main import ( "github.com/robfig/cron" "time" "fmt" "os&q ...

  4. 4-3 线程安全性-原子性-synchronized

    原子性它提供了互斥访问,同一时刻只能有一个线程来对它进行操作.能保证同一时刻只有一个线程来对其进行操作的,除了Atomic包之外,还有锁.JDK提供锁主要分两种,synchronized是一个Java ...

  5. 170318 11:44:26 [ERROR] Can't start server: can't create PID file: No space left on device

    数据库挂了.打开远程,进了系统,service mysqld stop 失败.service mysqld start等了好大一会,提示Timeout error occurred trying to ...

  6. 【HDU4970】Killing Monsters

    题意 数轴上有n个点,有m座炮塔,每个炮塔有一个攻击范围和伤害,有k个怪物,给出他们的初始位置和血量,问最后有多少怪物能活着到达n点.n<=100000 分析 对于某个怪物,什么情况下它可以活着 ...

  7. Angular23 loading组件、路由配置、子路由配置、路由懒加载配置

    1 需求 由于Angular是单页面的应用,所以在进行数据刷新是进行的局部刷新:在进行数据刷新时从浏览器发出请求到后台响应数据是有时间延迟的,所以在这段时间就需要进行遮罩处理来提示用户系统正在请求数据 ...

  8. 重命名Docker容器

    重命名Docker容器: Docker rename [Old container name]  [New container name]

  9. shell chmod中数字与字母的含义

    数字与字母的组合是chmod命令赋予文件,目录访问权限的方式 访问权限:可读,可写,可执行 字母表示:r      , w    , x 数字表示:4     , 2     , 1        , ...

  10. 2.一个简单的c++程序。

    每个程序员的Hello World程序 //This is a small c++ program #include <iostream> int main() { std::cout & ...