pytest的fixture框架的两种实现方式是怎样的
Admin 2022-08-04 群英技术资讯 333 次浏览
代码版的测试用例也不例外。在自动化测试框架当中,我们也需要编写:
用例执行之前的环境准备工作代码(前置工作代码)
用例执行之后的环境清理工作(后置工作代码)
通常,在自动化测试框架当中,都叫做fixture。
pytest作为python语言的测试框架,它的fixture有2种实现方式。
pytest的xunit-style有三个级别的fixture:测试模块、测试类、测试函数。
测试类内部的测试方法:
模块下的测试函数:
注意:用@classmethod装饰
3、测试模块级别:一个测试模块只执行一次前置和后置。
from selenium import webdriver from time import sleep from random import randint def setup_module(): print("==== 模块级的 setup 操作 ====") def teardown_module(): print("==== 模块级的 teardown 操作 ====") def test_random(): assert randint(1, 5) == 3 class TestWeb: @classmethod def setup_class(cls): print("==== 测试类级的 setup 操作 ====") @classmethod def teardown_class(cls): print("==== 测试类级的 teardown 操作 ====") def setup_method(self): print("==== 测试用例级的 setup 操作 ====") self.driver = webdriver.Chrome() def teardown_method(self): print("==== 测试用例级的 teardown 操作 ====") self.driver.quit() def test_search(self): self.driver.get("https://www.baidu.com/") self.driver.find_element_by_id("kw").send_keys("柠檬班") self.driver.find_element_by_id("su").click() sleep(1)
pytest也支持运行unittest的测试用例。支持unittest以下特性:
通过@pytest.fixture装饰器来定义fixture。一个函数被@pytest.fixture装饰,那么这个函数就是fixture。
使用fixture时,分为二个部分:fixture定义、fixture调用。
除此之外,还有fixture的共享机制,嵌套调用机制。
1)fixture通过函数实现。
2)使用@pytest.fixture进行装饰
import pytest @pytest.fixture def init(): pass
3)前置准备工作代码和后置清理工作代码,都写在一个函数里面。
4)通过yeild关键字,区分前置代码和后置代码 。yeild之前的代码为前置代码,yeild之后的代码为后置代码
在实际应用场景当中,可以只有前置准备工作代码,也可以只有后置清理工作代码。
import pytest @pytest.fixture def init(): print("用例执行之前,执行的代码") # 前置代码 yield print("用例执行之后,执行的代码") # 后置代码 @pytest.fixture def init2(): print("用例执行之前,执行的代码") # 只有用例执行之前的前置准备代码 @pytest.fixture def init3(): yield print("用例执行之后,执行的代码") # 只有用例执行之后的后置清理代码
5)fixture有4个作用域:测试会话(session)、测试模块(module)、测试类(class)、测试用例(function)
测试会话:pytest执行测试用例的整个过程,称为会话。
比如pytest收集到了100条用例并执行完成,这个过程称为测试会话。
设置fixture的作用域:通过@pytest.fixture(scope=作用域)来设置。默认情况下,scope=function
import pytest # 没有设置scope,默认为测试函数级别。即调用此fixture的测试类/模块/函数下,每个测试函数都会执行一次这个fixture @pytest.fixture def init(): print("用例执行之前,执行的代码") # 前置代码 yield print("用例执行之后,执行的代码") # 后置代码 # 设置scope为class。调用此fixture的测试类下,只执行一次这个fixture. @pytest.fixture(scope="class") def init2(): print("用例执行之前,执行的代码") # 只有用例执行之前的前置准备代码 # 设置scope为session。autouse表示自动使用。 # 那么在pytest收集用例后,开始执行用例之前会自动化执行这个fixture当中的前置代码, # 当所有用例执行完成之后,自动化执行这个fixture的后置代码。 @pytest.fixture(scope="session",autouse=True) def init3(): yield print("用例执行之后,执行的代码") # 只有用例执行之后的后置清理代
6)fixture的返回值设置:yeild 返回值
当测试用例当中,要使用fixture里生成的数据时,则需要fixture返回数据。
若有数据返回则:yeild 返回值
import pytest from selenium import webdriver from time import sleep # 设置scope为class。调用此fixture的测试类下,只执行一次这个fixture. @pytest.fixture(scope="class") def init2(): print("==== 测试类下,执行所有用例之前,执行的代码 ====") driver = webdriver.Chrome() yield driver # 返回driver对象 print("==== 测试类下,执行所有用例之后,执行的代码 ====") driver.quit()
在fixture定义好之后,可以明确:
在以上2点都定下来了之后,接下来就是,在测试用例当中,根据需要调用不同的fixture。
调用方法有2种:
第2种用法,主要是用参数来接收fixture的返回值,以便在测试用例中使用。
第一种方式案例如下:
第二种方式案例如下:
在某些大的业务场景下,很多用例当中,会使用相同的前置准备工作,和后置清理工作。
如果在每个测试模块下,都把前置准备工作,和后置清理工作写一遍,在维护上和优化上讲不够好。
pytest框架提供了一个fixture共享的机制 ,可以让不同的用例模块,使用同一个fixture。这就是conftest.py文件。
1)在项目根目录下,创建一个conftest.py文件。
2)文件名必须是conftest.py,大小写敏感,不可改名字。
3)conftest.py当中,可以编写多个fixture
4)在测试用例文件当中,不需要引入conftest.py文件。直接调用fixture的函数名,会自动去conftest.py当中查找的。
conftest.py在项目根目录下,则项目下的所有测试用例,均可使用conftest.py中定义的fixture。即项目根目录下的conftest.py,作用域是整个项目。
那,如果,conftest.py当中的fixture,只想在某个python包内可用呢?
conftest.py实现了层级作用域。
简单来说就是:conftest.py 在哪个目录下,此目录下(包含子目录)的所有用例可使用其中的fixture。
如下图:
moduleB下的用例文件test_module_b.py中的用例,即可以使用根目录下的conftest.py中的fixuture,又可以使用自己目录下的conftest.py的fixture:
那么有个问题,如果出现了同名fixture怎么办呢?
这里涉及到了,测试用例在执行时,调用fixture的顺序。一般来讲,按就近原则调用。
测试用例文件中的fixture > 当前目录中的fixture > 上级目录中的fixture > 根目录中的fixture
fixture不但支持共享 ,还支持嵌套使用。
嵌套使用即:一个fixture,可以做另外一个fixture的参数。
如下图所示:名为init2的fixture,可以作为init的参数。
并且,init当中,将init2的返回值,同样返回。
当在用例当中,调用init时,init会自动去调用init2。
下图案例中,init2为class级作用域,init为function级作用域。
fixture的执行顺序如下:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
大家好,本篇文章主要讲的是Python OpenCV读取视频报错的问题解决,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
这篇文章主要为大家介绍了Keras搭建分类网络平台VGG16 MobileNet ResNet50,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
这篇文章主要为大家介绍了Python线程编程之Thread,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
1.两个连续的print()函数为什么在输出时内容会分行显示?解:print()中有两个默认参数sep和end,其中sep是代替分隔符,end是代替末尾的换行符,默认使用‘,’代替空格,且默认末尾加上换行符,end函数用来定义一行输出的末尾coffee_cup='coffee' print("Ilovemy",coffee_cup,"!",end="end_flag") """
今天给大家带来的是关于Python的相关知识,文章围绕着Python自动化中这八大元素定位展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008