pytest 中 fixture的参数设置autouse=True使用方法 (标记预置条件,自动在用例之前执行)
Posted qika
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytest 中 fixture的参数设置autouse=True使用方法 (标记预置条件,自动在用例之前执行)相关的知识,希望对你有一定的参考价值。
#官方文档: https://docs.pytest.org/en/stable/fixture.html #fixture
查看fixture帮助源码:
fixture(scope="function", params=None, autouse=False, ids=None, name=None):
"""使用装饰器标记fixture的功能
可以使用此装饰器(带或不带参数)来定义fixture功能。
fixture功能会在运行测试之前调用它:test模块或类可以使用pytest.mark.usefixtures(fixturename标记)
测试功能可以直接使用fixture名称作为输入参数,在这种情况下,夹具实例从fixture返回功能将被注入。
"""
:scope: scope 有四个级别参数 "function" (默认), "class", "module" or "session".
:params: 一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它
:autouse: 如果为True,则为所有测试激活fixture func 可以看到它。 如果为False(默认值)则显式需要参考来激活fixture
:ids: 每个字符串id的列表,每个字符串对应于params 这样他们就是测试ID的一部分。 如果没有提供ID它们将从params自动生成
:name: fixture的名称。 这默认为装饰函数的名称。 如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽;
解决这个问题的一种方法是将装饰函数命名。“fixture_ <fixturename>”
然后使用”@ pytest.fixture(name =‘<fixturename>‘)
参数scope的四种类型:
function:每个test都运行,默认是function的scope
class:每个测试类之前执行一次
module:每个module的所有test只运行一次
session:每个session只运行一次
前面也说到了使用fixture装饰器的方法,但是避免重复操作,让其自动执行如何操作呢?
作用:在用例执行前的预置条件,可使用@pytest.fixture达到目的,而使用fixture夹具自带参数autouse可实现自动使用(用例执行前先自动执行)。
默认是Fasle没开启的,可以设置为True开启自动使用fixture功能(后面在执行用例之前默认自动执行这个被fixture装饰过的预置条件)
具体方法:(三种)
1.函数或类方法直接传fixture的函数参数名
2.使用装饰器@pytest.mark.usefixtures()
3.设置autouse=True自动使用
1、定义一个预置条件函数,然后用例直接传入函数名当做参数,进行调用这个预知条件
import time import pytest @pytest.fixture(scope="function") def start(request): #start为自定义的预置条件名称 print(‘预置条件执行‘) class Test_News(): def test_case01(self, start): #直接传入定义的一个被@pytest.fixture装饰的预置条件,作为test_case01的参数,这样test_case01执行时,会默认先执行预置条件项 print(‘case01‘) #测试使用时,可写具体实现脚本 if __name__ == "__main__": pytest.main(["-s", "test_demo.py"])
2、使用@pytest.mark.usefixtures()装饰器
对函数、对类进行引用使用装饰器(即:使用了这个装饰器后,无论这个函数、还是类,都会在执行之前执行预置条件项)
import time import pytest @pytest.fixture(scope="function") def start(request): print(‘预置条件执行‘) @pytest.mark.usefixtures("start") #这是一个函数case,这个@pytest.mark.usefixtures(),是可以作用于函数,和 class类 def test_News(): print("执行函数case")
@pytest.mark.usefixtures("start") #这是对一个类进行装饰 class Test_News(): def test_case01(self): print(‘case01‘) def test_case02(self): print(‘case02‘) if __name__ == "__main__": pytest.main(["-v", "test_demo.py"])
3、设置fixture中参数 autouse=True,在用例执行前自动运行fixture装饰的预置条件项(默认是False,不会自动执行,需要自己手动设置)
import pytest @pytest.fixture(scope="module", autouse=True) #scope的参数为module:表示每个module的所有test只运行一次 def start(request): print(‘开始‘) print("module: %s" %request.module.__name__) print(‘打开浏览器‘) yield print("结束") @pytest.fixture(scope="function", autouse=True) #scope参数为默认的function:每个test都运行一次 def open_home(request): print("%s 访问菜单初始化主页" % request.function.__name__)
#因为设置了autouse=True,因此下面的函数在执行前,会自动先执行上面的start、open_home两个函数方法(因此这个用在登录和登陆后操作是一个道理) def test_case01(): print(‘执行case01‘) def test_case02(): print(‘执行case02‘) if __name__ == "__main__": pytest.main(["-v", "test_demo.py"])
这样设置了fixture的参数autouse=True后,如上。
当用例执行时,会先自动运行预置条件start,
然后访问菜单主页,
然后执行用例,
最后结束(使用yield表示teardown操作,仅执行一次)
(注:这样是不是就实现了打开浏览器-->访问要测试的主页-->进行执行多条用例测试,在每个用例执行完都恢复到初始的测试主页-->结束、关闭浏览器)
以上是关于pytest 中 fixture的参数设置autouse=True使用方法 (标记预置条件,自动在用例之前执行)的主要内容,如果未能解决你的问题,请参考以下文章
pytest-17-fixture之autouse=True
pytest文档17-fixture之autouse=True
pytest文档68-pytest-lazy-fixture 插件解决 pytest.mark.parametrize 中使用 fixture 问题