test_fixture.py

import pytest@pytest.fixture()
def fixtureFunc():return 'fixtureFunc'def test_fixture(fixtureFunc):print('我调用了{}'.format(fixtureFunc))if __name__=='__main__':pytest.main(['-v', 'test_fixture.py'])

执行结果

test_fixture.py .我调用了fixtureFunc                 [100%]
========================== 1 passed in 0.02 seconds ===========================
Process finished with exit code 0

1.fixtureFunc 这个函数就是一个fixture,fixture函数内部可以实现一些初始化操作。

2.调用fixture有三种方式

2.1.fixture名字作为用例的参数。

2.2.fixture的名字直接作为测试用例的参数。

test_fixture.py

import pytest@pytest.fixture()
def fixtureFunc():return 'fixtureFunc'def test_fixture(fixtureFunc):print('我调用了{}'.format(fixtureFunc))class TestFixture(object):def test_fixture_class(self, fixtureFunc):print('在类中使用fixture "{}"'.format(fixtureFunc))if __name__=='__main__':pytest.main(['-v', 'test_fixture.py'])

3.(前面文章3.2)fixture功能的名称可以在以后使用引用它会在运行测试之前调用它:test模块或类可以使用pytest.mark.usefixtures(fixturename标记), 在测试功能可以直接使用fixture名称作为输入参数。

3.1.使用@pytest.mark.usefixtures(‘fixture’)装饰器

3.2.每个函数或者类前使用@pytest.mark.usefixtures(fixturename标记)装饰器装饰。

test_fixture.py

import pytest
@pytest.fixture()
def fixtureFunc():print('\n fixture->fixtureFunc')@pytest.mark.usefixtures('fixtureFunc')
def test_fixture():print('in test_fixture')@pytest.mark.usefixtures('fixtureFunc')
class TestFixture(object):def test_fixture_class(self):print('in class with text_fixture_class')if __name__=='__main__':pytest.main(['-v', 'test_fixture.py'])

4.使用autouse参数

4.1.指定fixture的参数autouse=True这样每个测试用例会自动调用fixture(其实这里说的不是很准确,因为还涉及到fixture的作用范围,那么我们这里默认是函数级别的,后面会具体说fixture的作用范围)。

test_fixture.py

import pytest
@pytest.fixture(autouse=True)
def fixtureFunc():print('\n fixture->fixtureFunc')def test_fixture():print('in test_fixture')class TestFixture(object):def test_fixture_class(self):print('in class with text_fixture_class')if __name__=='__main__':pytest.main(['-v', 'test_fixture.py'])

结果:从结果可以看到每个测试用例执行前都自动执行了fixture。

fixture->fixtureFunc
.in test_fixturefixture->fixtureFunc
.in class with text_fixture_class[100%]========================== 2 passed in 0.04 seconds ===========================

5.小结

5.1.掌握上面的方法,就可以使用fixture了,那么这几种方式又有是区别呢?

5.2.其实从代码中就能看出来,如果测试用例需要使用定义fixture中返回的参数,那么通过后面这两种方式是无法使用返回的参数的。因为fixture中返回的数据默认存在fixture名字里面存储,所以只能使用第一种方式才可以调用fixture中的返回值。

6.fixture作用范围

6.1.上面所有的实例默认都是函数级别的,所以测试函数只要调用了fixture,那么在测试函数执行前都会先指定fixture。说到作用范围就不得不说fixture 的第二个参数scope参数。

7.scope参数可以是session, module,class,function; 默认为function

7.1.session 会话级别(通常这个级别会结合conftest.py文件使用,所以后面说到conftest.py文件的时候再说)。

7.2.module 模块级别: 模块里所有的用例执行前执行一次module级别的fixture。

7.3.class 类级别 :每个类执行前都会执行一次class级别的fixture。

7.4.function :前面实例已经说了,这个默认是默认的模式,函数级别的,每个测试用例执行前都会执行一次function级别的fixture。

test_fixture.py

import pytest@pytest.fixture(scope='module', autouse=True)
def module_fixture():print('\n-----------------')print('我是module fixture')print('-----------------')
@pytest.fixture(scope='class')
def class_fixture():print('\n-----------------')print('我是class fixture')print('-------------------')
@pytest.fixture(scope='function', autouse=True)
def func_fixture():print('\n-----------------')print('我是function fixture')print('-------------------')def test_1():print('\n 我是test1')@pytest.mark.usefixtures('class_fixture')
class TestFixture1(object):def test_2(self):print('\n我是class1里面的test2')def test_3(self):print('\n我是class1里面的test3')
@pytest.mark.usefixtures('class_fixture')
class TestFixture2(object):def test_4(self):print('\n我是class2里面的test4')def test_5(self):print('\n我是class2里面的test5')if __name__=='__main__':pytest.main(['-v', '--setup-show', 'test_fixture.py'])

7.5.运行结果:在cdm里面执行使用 --setup-show 可以查看到具体setup和teardoen顺序。

7.6.可以很清楚的看到 整个模块只执行了一次module级别的fixture , 每个类分别执行了一次class级别的fixture, 而每一个函数之前都执行了一次function级别的fixture。

test_fixture.py SETUP    M module_fixtureSETUP    F func_fixture
-----------------
我是module fixture
----------------------------------
我是function fixture
-------------------test_fixture.py::test_1 (fixtures used: func_fixture, module_fixture).我是test1TEARDOWN F func_fixtureSETUP    C class_fixtureSETUP    F func_fixture
-----------------
我是class fixture
------------------------------------
我是function fixture
-------------------test_fixture.py::TestFixture1::test_2 (fixtures used: class_fixture, func_fixture, module_fixture).
我是class1里面的test2TEARDOWN F func_fixtureSETUP    F func_fixture
-----------------
我是function fixture
-------------------test_fixture.py::TestFixture1::test_3 (fixtures used: class_fixture, func_fixture, module_fixture).
我是class1里面的test3TEARDOWN F func_fixtureTEARDOWN C class_fixtureSETUP    C class_fixtureSETUP    F func_fixture
-----------------
我是class fixture
------------------------------------
我是function fixture
-------------------test_fixture.py::TestFixture2::test_4 (fixtures used: class_fixture, func_fixture, module_fixture).
我是class2里面的test4TEARDOWN F func_fixtureSETUP    F func_fixture
-----------------
我是function fixture
-------------------test_fixture.py::TestFixture2::test_5 (fixtures used: class_fixture, func_fixture, module_fixture).
我是class2里面的test5TEARDOWN F func_fixtureTEARDOWN C class_fixtureTEARDOWN M module_fixture========================== 5 passed in 0.05 seconds ===========================

8.fixture实现teardown

8.1.前面的所有实例都只是做了测试用例执行之前的准备工作,那么用例执行之后该如何实现环境的清理工作呢?

8.2.这不得不说yield关键字了,相比大家都或多或少的知道这个关键字,他的作用其实和return差不多,也能够返回数据给调用者,唯一的不同是被调用的函数执行遇到yield会停止执行,接着执行调用处的函数,调用出的函数执行完后会继续执行yield关键后面的代码。

8.3.这个实例会先打开浏览器,然后执行测试用例,最后关闭浏览器。大家可以试试! 通过yield就实现了 用例执行后的teardown功能。

import pytest
from selenium import webdriver
import time
@pytest.fixture()
def fixtureFunc():'''实现浏览器的打开和关闭'''driver = webdriver.Firefox()yield driverdriver.quit()
def test_search(fixtureFunc):'''访问百度首页,搜索pytest字符串是否在页面源码中'''driver = fixtureFuncdriver.get('http://www.baidu.com')driver.find_element_by_id('kw').send_keys('pytest')driver.find_element_by_id('su').click()time.sleep(3)source = driver.page_sourceassert 'pytest' in sourceif __name__=='__main__':pytest.main(['--setup-show', 'test_fixture.py'])

9.总结

9.1.fixture如何定义。

9.2.fixture的使用方式。

9.3.fixture作用范围。

9.4.fixture用yield实现teardown功能。

10.最后提一句:实际工作中尽量少用auto=True这个参数,可能会引发意想不到的结果! 最常用的还是通过传递参数最好!

第八:Pytes中的fixture大解剖(二)相关推荐

  1. 第七:Pytes中的fixture大解剖(一)

    1.简介 1.1.fixture是pytest的一个闪光点,pytest要精通怎么能不学习fixture呢?一起深入学习fixture吧.其实unittest和nose都支持fixture,但是pyt ...

  2. 八十七、Python | 十大排序算法系列(上篇)

    @Author:Runsen @Date:2020/7/10 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  3. 区块链开发中的9大应用场景

    区块链开发中的9大应用场景 自从2008年区块链技术的概念在中本聪的手里诞生以来,至今已有10年的历史.伴随着比特币市值的巨大波动,不管是男女老少都多多少少对区块链技术有过一定的了解.当很多人听到&q ...

  4. 谈马云创业人生中的十大苦难

    马云的成功是很多人羡慕及向往的;也有不少人因各种原因指责唾骂的!乐晨也曾有一段时间因为听说阿里是日本商人孙正义的,认为他是在给日本人打工(没办法,痛恨日本人)心里不免骂他!但事后冷静后细想,如果那时国 ...

  5. Expo大作战(二十八)--expo sdk api之Speach(语音文字转换),Segment

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  6. JQuery中的九大选择器及其应用(下)

    第七种:子元素选择器 <!DOCTYPE html> <html lang="en"> <head><meta charset=" ...

  7. RPA教程丨银行RPA在银行业中的9大应用场景

    文 | 鄂攀 根据以往项目经验,总结了银行RPA在银行业中的9大应用场景,以供参考. 第一种:银行同业对账 流程图如下: 因为涉及各银行的网银登录,所以自动化中密码储存安全性至关重要,同时还得能识别银 ...

  8. 【pytest】(四) pytest中的fixture (3) : fixture的作用域、实例化顺序和可用性

    目录 1. fixture的作用域 1.1 scope 1.2 动态作用域(Dynamic scope) 2. fixture的实例化顺序 2.1 作用域级别高的fixture先执行 2.2 fixt ...

  9. 基础科研探索推进中的十大关系

    编者按 这篇文章论述了基础科研中的十大关系,对当前国内基础科研中存在的一些关系不清.学科不分和专业概念混淆等现象,给出了作者自己鲜明的看法和中肯的建议. 编者赞同作者的见解:科学认知是一种当前的&qu ...

最新文章

  1. java编译器使用教程_Java编译器API简介
  2. 安装 pptpd 服务
  3. python中错误和异常处理
  4. 算法当道!为什么人类和人工智能越来越像?
  5. vue混合开发笔记, this的指向
  6. ijkplayer之.so文件编译过程
  7. 苹果Mac 桌面下方Dock 的App icon名称出现乱码怎么办?一个简单指令帮你解决
  8. access通过身份证号提取性别_从身份证号码中提取出生年月,性别等都不掌握,那就真的Out了...
  9. 如何快速自学生物信息学
  10. 【嵌入式】学习心路历程与总结
  11. 微信运动小红心点赞脚本
  12. 【“到此一游”系列】(菜鸡参加“美亚杯” 电子取证大赛感受)
  13. 贝壳找房二手房信息爬虫
  14. 如果能理解医生的准确意图,深度学习会是医疗诊断的未来吗?
  15. XENOGEARS,延续万年的的永恒之爱(引)
  16. 动作游戏的战斗系统设计
  17. jquery $.fn $.fx是什么意思有什么用
  18. redis的集成在springbooot版本之间差异(主要分为1.4版本之前后之后)
  19. 哥本哈根大学计算机科学,计算机科学理科学士
  20. 麒麟信安参与共建的 中国首个桌面操作系统根社区openKylin即将发布

热门文章

  1. [leetcode]Word Ladder
  2. TFS数据服务器启动优化
  3. ASP.NET AJAX,WCF,ADO.NET Entity 开发实例
  4. 别不信!servlet获取到的参数值,也许完全出乎你的意料!
  5. Django day 36 支付宝支付,微信推送
  6. python 中参数*args, **kwargs
  7. Java中实现连接数据库并进行查询
  8. 使用 HTML5, javascript, webrtc, websockets, Jetty 和 OpenCV 实现基于 Web 的人脸识别
  9. asp当中的DateDiff的用法
  10. 解决SpringMVC中文乱码问题 -----这是服务器返回参数到前端中文乱码