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

pytest文档68-pytest-lazy-fixture 插件解决 pytest.mark.parametrize 中使用 fixture 问题

pytest文档67-pytest.mark.parametrize 中使用 fixture

python-pytest学习(十三)-fixture之autouse=True