目录

前言

用例运行级别

函数式

setup_function/teardown_function

setup_module/teardown_module

类和方法

函数和类混合

后置固件yield和终结函数addfinalizer

引入

yield

addfinalizer函数


前言

学过unittest的都知道里面用前置和后置setup和teardown非常好用,在每次用例开始前和结束后都去执行一次。
当然还有更高级一点的setupClass和teardownClass,需配合@classmethod装饰器一起使用,在做selenium自动化的时候,它的效率尤为突出,可以只启动一次浏览器执行多个用例。
pytest框架也有类似于setup和teardown的语法,并且还不止这四个

用例运行级别

  • 模块级(setup_module/teardown_module)开始于模块始末,全局的

  • 函数级(setup_function/teardown_function)只对函数用例生效(不在类中)

  • 类级(setup_class/teardown_class)只在类中前后运行一次(在类中)

  • 方法级(setup_method/teardown_method)开始于方法始末(在类中)

  • 类里面的(setup/teardown)运行在调用方法的前后

函数式

setup_function/teardown_function

1.pytest框架支持函数和类两种用例方式,先看函数里面的前置与后置用法:

setup_function/teardown_function 每个用例开始和结束调用一次

# test_fixt.py# coding:utf-8
import pytest
# 函数式** 作者:上海-悠悠 QQ交流群:588402570**def setup_function():print("setup_function:每个用例开始前都会执行")def teardown_function():print("teardown_function:每个用例结束后都会执行")def test_one():print("正在执行----test_one")x = "this"assert 'h' in xdef test_two():print("正在执行----test_two")x = "hello"assert hasattr(x, 'check')def test_three():print("正在执行----test_three")a = "hello"b = "hello world"assert a in bif __name__ == "__main__":pytest.main(["-s", "test_fixt.py"])

运行结果:

============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.6.3, py-1.5.4, pluggy-0.6.0
rootdir: E:\YOYO, inifile:
collected 3 itemstest_fixt.py setup_function:每个用例开始前都会执行
正在执行----test_one
.teardown_function:每个用例结束后都会执行
setup_function:每个用例开始前都会执行
正在执行----test_two
Fteardown_function:每个用例结束后都会执行
setup_function:每个用例开始前都会执行
正在执行----test_three
.teardown_function:每个用例结束后都会执行================================== FAILURES ===================================
__________________________________ test_two ___________________________________def test_two():print("正在执行----test_two")x = "hello"
>       assert hasattr(x, 'check')
E       AssertionError: assert False
E        +  where False = hasattr('hello', 'check')test_fixt.py:19: AssertionError
===================== 1 failed, 2 passed in 0.03 seconds ======================

2.从结果可以看出用例执行顺序:setup_function》用例1》teardown_function, setup_function》用例2》teardown_function, setup_function》用例3》teardown_function

备注:-s参数是为了显示用例的打印信息。 -q参数只显示结果,不显示过程

setup_module/teardown_module

1.setup_module是所有用例开始前只执行一次,teardown_module是所有用例结束后只执行一次

# test_fixt.py# coding:utf-8
import pytest
# 函数式** 作者:上海-悠悠 QQ交流群:588402570**def setup_module():print("setup_module:整个.py模块只执行一次")print("比如:所有用例开始前只打开一次浏览器")def teardown_module():print("teardown_module:整个.py模块只执行一次")print("比如:所有用例结束只最后关闭浏览器")def setup_function():print("setup_function:每个用例开始前都会执行")def teardown_function():print("teardown_function:每个用例结束前都会执行")def test_one():print("正在执行----test_one")x = "this"assert 'h' in xdef test_two():print("正在执行----test_two")x = "hello"assert hasattr(x, 'check')def test_three():print("正在执行----test_three")a = "hello"b = "hello world"assert a in bif __name__ == "__main__":pytest.main(["-s", "test_fixt.py"])

2.从运行结果可以看到setup_module和teardown_module只执行了一次

test_fixt.py setup_module:整个.py模块只执行一次
比如:所有用例开始前只打开一次浏览器
setup_function:每个用例开始前都会执行
正在执行----test_one
.teardown_function:每个用例结束前都会执行
setup_function:每个用例开始前都会执行
正在执行----test_two
Fteardown_function:每个用例结束前都会执行
setup_function:每个用例开始前都会执行
正在执行----test_three
.teardown_function:每个用例结束前都会执行
teardown_module:整个.py模块只执行一次
比如:所有用例结束只最好关闭浏览器

备注:setup_function/teardown_function和setup_module/teardown_module这四种方法是可以任意组合的,用一个和多个都可以

类和方法

1.setup/teardown和unittest里面的setup/teardown是一样的功能,setup_class和teardown_class等价于unittest里面的setupClass和teardownClass

#test_fixtclass.py# coding:utf-8
import pytest
# 类和方法** 作者:上海-悠悠 QQ交流群:588402570**class TestCase():def setup(self):print("setup: 每个用例开始前执行")def teardown(self):print("teardown: 每个用例结束后执行")def setup_class(self):print("setup_class:所有用例执行之前")def teardown_class(self):print("teardown_class:所有用例执行之前")def setup_method(self):print("setup_method:  每个用例开始前执行")def teardown_method(self):print("teardown_method:  每个用例结束后执行")def test_one(self):print("正在执行----test_one")x = "this"assert 'h' in xdef test_two(self):print("正在执行----test_two")x = "hello"assert hasattr(x, 'check')def test_three(self):print("正在执行----test_three")a = "hello"b = "hello world"assert a in bif __name__ == "__main__":pytest.main(["-s", "test_fixtclass.py"])

运行结果

test_fixtclass.py setup_class:所有用例执行之前
setup_method:  每个用例开始前执行
setup: 每个用例开始前执行
正在执行----test_one
.teardown: 每个用例结束后执行
teardown_method:  每个用例结束后执行
setup_method:  每个用例开始前执行
setup: 每个用例开始前执行
正在执行----test_two
Fteardown: 每个用例结束后执行
teardown_method:  每个用例结束后执行
setup_method:  每个用例开始前执行
setup: 每个用例开始前执行
正在执行----test_three
.teardown: 每个用例结束后执行
teardown_method:  每个用例结束后执行
teardown_class:所有用例执行之前

2.从结果看出,运行的优先级:setup_class》setup_method》setup 》用例》teardown》teardown_method》teardown_class
备注:这里setup_method和teardown_method的功能和setup/teardown功能是一样的,一般二者用其中一个即可

函数和类混合

1.如果一个.py的文件里面既有函数用例又有类和方法用例,运行顺序又是怎样的呢?

# coding:utf-8
import pytest
# 类和方法** 作者:上海-悠悠 QQ交流群:588402570**def setup_module():print("setup_module:整个.py模块只执行一次")print("比如:所有用例开始前只打开一次浏览器")def teardown_module():print("teardown_module:整个.py模块只执行一次")print("比如:所有用例结束只最后关闭浏览器")def setup_function():print("setup_function:每个用例开始前都会执行")def teardown_function():print("teardown_function:每个用例结束前都会执行")def test_one():print("正在执行----test_one")x = "this"assert 'h' in xdef test_two():print("正在执行----test_two")x = "hello"assert hasattr(x, 'check')class TestCase():def setup_class(self):print("setup_class:所有用例执行之前")def teardown_class(self):print("teardown_class:所有用例执行之前")def test_three(self):print("正在执行----test_three")x = "this"assert 'h' in xdef test_four(self):print("正在执行----test_four")x = "hello"assert hasattr(x, 'check')if __name__ == "__main__":pytest.main(["-s", "test_fixtclass.py"])

运行结果:

test_fixtclass.py setup_module:整个.py模块只执行一次
比如:所有用例开始前只打开一次浏览器
setup_function:每个用例开始前都会执行
正在执行----test_one
.teardown_function:每个用例结束前都会执行
setup_function:每个用例开始前都会执行
正在执行----test_two
Fteardown_function:每个用例结束前都会执行
setup_class:所有用例执行之前
正在执行----test_three
.正在执行----test_four
Fteardown_class:所有用例执行之前
teardown_module:整个.py模块只执行一次
比如:所有用例结束只最后关闭浏览器

2.从运行结果看出,setup_module/teardown_module的优先级是最大的,然后函数里面用到的setup_function/teardown_function与类里面的setup_class/teardown_class互不干涉

后置固件yield和终结函数addfinalizer

引入

我们之前学习的都是测试用例的前置固件(@pytest.mark.xxx),也就是相当于“setup”。说到这,细心的你可能想到了,那有没有什么方式可以表示出“teardown”?这就是我们今天学习的yield和addfinalizer。

yield

yield是一个关键字,它不是单独存在的,要写在fixtrue标记的固件中。

吃个小荔枝:我们在声明的固件myfixture中加入yield关键字,在它下面写测试用例执行后想要运行的代码;其他有关于固件的使用没有任何差别。需要说明的一点是我们在pytest主函数中增加了一个参数“–setup-show”,他会显示出固件的执行情况。

import pytest@pytest.fixture()
def myfixture():print("执行myfixture前半部分")yieldprint("执行myfixture的后半部分")class Test_firstFile():def test_one(self,myfixture):print("执行test_one")assert 1+2==3def test_two(self):print("执行test_two")assert 1==1def test_three(self):print("执行test_three")assert 1+1==2if __name__=="__main__":pytest.main(["--setup-show","-s","test_firstFile.py"])

运行结果如下图所示:我们可以清楚的看到,测试代码的执行顺序是 固件中yield前的代码–测试用例中的代码–固件中yield后的代码

NOTE:如果测试用例中的代码出现异常或者断言失败,并不会影响他的固件中yield后的代码执行;但是如果固件中的yield之前的代码也就是相当于setup部分的带代码,出现错误或断言失败,那么yield后的代码将不会再执行,当然测试用例中的代码也不会执行

addfinalizer函数

我们也可以通过request.addfinalizer()的方式实现“teardown”。

它和yield相比不同的是:无论是固件的“setup”部分是否出现异常或断言失败,它都会执行(关于这一点我还没有演示出来,感觉setup中如果有异常addfinalizer依然不会执行,希望大佬指导);此外它还支持传入多个函数。

我们在固件中传入request参数;又在固件中定义了一个内置函数;最后将定义的内置函数添加到request的addfinalizer中

import pytest@pytest.fixture()
def myfixture(request):print ("执行固件myfixture的前半部分")def myteardown():print("执行固件myfture的后半部分")request.addfinalizer(myteardown)class Test_Pytest():def test_one(self,myfixture):print("test_one方法执行" )assert 1==1def test_two(self):print("test_two方法执行" )assert "o" in "love"def test_three(self):print("test_three方法执行" )assert 3-2==1if __name__=="__main__":pytest.main(['--setup-show','-s','test_Pytest.py'])

pytest——03 setup和teardown相关推荐

  1. Pytest框架 —— setUp()和tearDown()函数

    1.setUp()和tearDown()函数介绍 之前学过Unittest测试框架,知道前置setup()函数和后置teardown()函数非常好用,在每次用例开始前和结束后都去执行一次. 当然还有更 ...

  2. Pytest的setup和teardown

    pytest实际上是python自带测试框架unittest的扩展,那么pytest是如何实现unittest中的setup和teardown的呢? pytest初始化的类别和作用域 模块级别(Mod ...

  3. 5.pytest中setup和teardown

    文章目录 前言 函数级别 模块级别 类级别 前言 用过unittest的童鞋都知道,有两个前置方法,两个后置方法:分别是 setup() setupClass() teardown() teardow ...

  4. pytest中setup和teardown

    参考博客: pytest 2.测试用例setup和teardown以及使用@pytest.fixture()装饰器来实现部分用例的前后置,param参数化,ids(不显示unicode编码),name ...

  5. python pytest setupclass_简单了解pytest测试框架setup和tearDown

    pytest的setup与teardown 1)pytest提供了两套互相独立的setup 与 teardown和一对相对自由的setup与teardown 2)模块级与函数级 模块级(setup_m ...

  6. pytest—setup和teardown简单用法

    前言 小伙伴们好呀,我又来了我们今天聊聊关于pytest前后置应用,使用过unittest的小伙伴们都知道,setup和teardown是用来处理用例的开始前工作和结束后的工作,其中还有setupcl ...

  7. Python测试框架pytest(03)setup和teardown

    Python测试框架pytest系列可以查看下列 Python测试框架pytest(01)简介.安装.快速入门_编程简单学的博客-CSDN博客 ​​​​​​Python测试框架pytest(02)Py ...

  8. Pytest测试用例之setup与teardown方法(二)

    续 日常积累 | 初识Pytest  | 日常积累 | 初识pytest (二) | Pytest测试用例之setup与teardown方法(一)继续分享, 今天继模块级以及函数式setup与tear ...

  9. python:pytest中的setup和teardown

    原文:https://www.cnblogs.com/peiminer/p/9376352.html 之前我写的unittest的setup和teardown,还有setupClass和teardow ...

最新文章

  1. Android Studio 第四十九期 - Sqlite数据库四种写法
  2. TCP/IP详解--第十五章
  3. 修改代码的艺术----- 2.2 高层测试 2.3 测试覆盖
  4. 小菜的 VUE 使用技巧 持续更新
  5. 虚拟成像技术_AI帝国将崛起,国内幻真虚拟成像技术第一家
  6. 信息学奥赛一本通 1086:角谷猜想 | OpenJudge NOI 1.5 21
  7. python人工智能能干啥_人工智能首选什么语言 Python能做哪些事情
  8. 前端Vue3中级视频(240分钟)评分95分
  9. android开发mvp,Android开发模式之MVP
  10. aix linux tcp连接数,修改windows、linux、aix等系统TCP/IP 参数
  11. ajaxSubmit 提交form 表单
  12. VBS表白代码以及一些注意事项
  13. 使用DirectX播放wav声音文件
  14. c语言蜂鸣器放音乐程序,单片机蜂鸣器C语言程序
  15. IIS本地FTP服务器搭建
  16. 分段函数的期望和方差_2020考研数学一大纲
  17. 2022年劳务员-通用基础(劳务员)考试题库及答案
  18. java doc转图片_使用Java实现word文档转图片 在线预览
  19. 计算机名弹出输入网络密码错误,win10系统登录网络打印机出现用户名和密码错误的设置办法...
  20. 柠檬智慧 java,智慧职教2020Java程序设计基础(哈尔滨职业技术学院)作业答案

热门文章

  1. PHP生成两个sheet的excel
  2. 护网行动安全防守工作指南应看
  3. 怎么用java实现一二级菜单,以及对应的数据库表怎么设计?
  4. 服务器硬防和软防是什么?服务器软件防火墙 103.60.167 .x
  5. Android Studio——简单视频播放器
  6. PXE + kickstart批量装机及问题解决方案
  7. vpp 版本选择_苹果VPP协议中文版
  8. MPLS TE Lab FRR
  9. AES加密算法逆向分析
  10. 鱼群算法在上网行为管理系统中可以起到怎样的作用