上篇文章中提到了,在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. Vulkan Tutorial 04 理解Validation layers

    操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 What are validation layers? Vulkan API的设计核 ...

  2. 在页面完成读取EXCEL

    protected void btnUpload_Click(object sender, EventArgs e) { if (Page.IsValid) { string sFILENAME = ...

  3. 26.COUNT() 函数

    COUNT() 函数返回匹配指定条件的行数. SQL COUNT() 语法 SQL COUNT(column_name) 语法 COUNT(column_name) 函数返回指定列的值的数目(NULL ...

  4. numpy ndarray 返回 index 问题

    经常遇到需要返回满足条件的index. python中没有which函数,但有列表推导式, 可以实现类似功能 y= np.array([3,2,5,20]) yOut[131]: array([ 3, ...

  5. Luogu 4721 【模板】分治 FFT

    还不会这题的多项式求逆的算法. 发现每一项都是一个卷积的形式,那么我们可以使用$NTT$来加速,直接做是$O(n^2logn)$的,我们考虑如何加速转移. 可以采用$cdq$分治的思想,对于区间$[l ...

  6. Entity Framework Tutorial Basics(42):Colored Entity

    Colored Entity in Entity Framework 5.0 You can change the color of an entity in the designer so that ...

  7. React项目中的registerServiceWorker的作用

    在公司的React前端项目中,发现有一个registerServiceWorker.js文件, 很久都没弄明白这个文件是干什么用的,查询了一些资料后,了解了一些 service worker是在后台运 ...

  8. Java List集合和Map集合的综合应用

    public static void main(String[] args) { //--------------------------------------------------------- ...

  9. SQLServer 附加数据库后只读或报错解决方法

    百度文库地址 http://wenku.baidu.com/link?url=3EnK52mOtll3svjce0OGUUu7h9EOWkUgty8VChkxRdX7LQlm9Ll6N_78ENngN ...

  10. SxsTrace使用的方法

    Windows7平台上有一个强大的SxsTrace工具,可以跟踪调试应用程序运行时需要的动态库的版本和路径.   SxsTrace使用的方法:   1.首先必须以Administrator用户身份登录 ...