pytest 15 fixture之autouse=True, usefixture的单个使用和多个使用,以及fixture调用fixture

前言

平常写自动化用例会写一些前置的fixture操作,用例需要用到就直接传该函数的参数名称就行了。当用例很多的时候,每次都传这个参数,会比较麻烦。
fixture里面有个参数autouse,默认是Fasle没开启的,可以设置为True开启自动使用fixture功能,这样用例就不用每次都去传参了

调用fixture三种方法

    • 1.函数或类里面方法直接传fixture的函数参数名称

    • 2.使用装饰器@pytest.mark.usefixtures()修饰

    • 3.autouse=True自动使用

用例传fixture参数

方法一:先定义start功能,用例全部传start参数,调用该功能

#!/usr/bin/env/python
# -*-coding:utf-8-*-

import pytest

@pytest.fixture(scope="function")
def start(request):
    print('\n-----开始执行function----')

def test_a(start):
    print("-------用例a执行-------")

class Test_aaa():

    def test_01(self, start):
        print('-----------用例01--------------')

    def test_02(self, start):
        print('-----------用例02------------')

运行结果:

============================= test session starts ==============================
platform darwin -- Python 3.7.0, pytest-3.9.1, py-1.7.0, pluggy-0.8.0
rootdir: /Users/newcomer/gitByMyself, inifile:
plugins: datadir-1.2.1, allure-adaptor-1.7.10collected 3 items

python_work_apple/pytest_package/fixtureDemo/test_01.py 
-----开始执行function----
.-------用例a执行-------

-----开始执行function----
.-----------用例01--------------

-----开始执行function----
.-----------用例02------------
              [100%]

=========================== 3 passed in 0.02 seconds ===========================

方法2.多个fixture被同时调用

#!/usr/bin/python 
# -*- coding: utf-8 -*-
# author:xiaomin pei
import pytest

@pytest.fixture()
def test1():
    a = 'zzz'
    print('\n传出a')
    return a

@pytest.fixture()
def test2():
    b = '123456'
    print('\n传出b')
    return b

def test_3(test1, test2):
    u = test1
    p = test2
    assert u == 'zzz'
    assert p == '123456'
    print('传入多个fixture参数正确')


if __name__ == '__main__':
    pytest.main(['-vs', 'test_multi.py'])

装饰器usefixtures

方法二:使用装饰器@pytest.mark.usefixtures() :主要作用就是定义多个fixture,只用其中的一个或多个,传入的还是fixture的名字

#!/usr/bin/python
#
-*- coding: utf-8 -*- # author:xiaomin pei import pytest @pytest.fixture(scope="function") def start(): print('\n-----开始执行function----') @pytest.fixture(scope="function") def second(): print('\n-----开始执行second function----') @pytest.mark.usefixtures("start") def test_a(): print("-------用例a执行,用start fixture,不用second-------") @pytest.mark.usefixtures("second") class Test_aaa: def test_01(self): print('-----------用例01--------------') def test_02(self): print('-----------用例02------------') if __name__ == '__main__': pytest.main(['-vs'#!/usr/bin/env/python

运行结果:

test_usefixture.py::test_a 
-----开始执行function----
-------用例a执行,用start fixture,不用second-------
PASSED
test_usefixture.py::Test_aaa::test_01 
-----开始执行second function----
-----------用例01--------------
PASSED
test_usefixture.py::Test_aaa::test_02 
-----开始执行second function----
-----------用例02------------
PASSED

============================== 3 passed in 0.18s ==============================

多个userfixture同时使用,用的是就近原则。比如以下用例,

 

#!/usr/bin/python 
# -*- coding: utf-8 -*-
# author:xiaomin pei
import pytest

@pytest.fixture(scope="function")
def fix1():
    print('\n-----开始执行fix1 function----')

@pytest.fixture(scope="function")
def fix2():
    print('\n-----开始执行fix2 function----')

@pytest.mark.usefixtures("fix1")
@pytest.mark.usefixtures("fix2")
def test_1():
    print("-------用例1执行,都用一下,先执行2,在执行1,就近原则-------")

@pytest.mark.usefixtures("fix2")
@pytest.mark.usefixtures("fix1")
class Test_case:
    def test_2(self):
        print("-------------------用例2执行----------------------")

    def test_3(self):
        print("-------------------用例3执行----------------------")


if __name__ == '__main__':
    pytest.main(['-vs', 'test_multi_usefixture.py'])

结果:用例1是先执行的fix2 ,才执行fix1  。

test_multi_usefixture.py::test_1 
-----开始执行fix2 function----

-----开始执行fix1 function----
-------用例1执行,都用一下,先执行2,在执行1,就近原则-------
PASSED
test_multi_usefixture.py::Test_case::test_2 
-----开始执行fix1 function----

-----开始执行fix2 function----
-------------------用例2执行----------------------
PASSED
test_multi_usefixture.py::Test_case::test_3 
-----开始执行fix1 function----

-----开始执行fix2 function----
-------------------用例3执行----------------------
PASSED

============================== 3 passed in 

设置autouse=True

方法三、autouse设置为True,自动调用fixture功能

  • start设置scope为module级别,在当前.py用例模块只执行一次,autouse=True自动使用

  • open_home设置scope为function级别,每个用例前都调用一次,自动使用

#!/usr/bin/env/python
# -*-coding:utf-8-*-
import pytest

@pytest.fixture(scope="module", autouse=True)
def start(request):
    print('\n-----开始执行moule----')
    print('module      : %s' % request.module.__name__)
    print('----------启动浏览器---------')
    yield
    print("------------结束测试 end!-----------")

@pytest.fixture(scope="function", autouse=True)
def open_home(request):
    print("function:%s \n--------回到首页--------" % request.function.__name__)

def test_01():
    print('-----------用例01--------------\n')

def test_02():
    print('-----------用例02------------\n')

运行结果:

============================= test session starts ==============================
platform darwin -- Python 3.7.0, pytest-3.9.1, py-1.7.0, pluggy-0.8.0
rootdir: /Users/newcomer/gitByMyself, inifile:
plugins: datadir-1.2.1, allure-adaptor-1.7.10collected 2 items

python_work_apple/pytest_package/fixtureDemo/test_03.py 
-----开始执行moule----
module      : test_03
----------启动浏览器---------
function:test_01 
--------回到首页--------
.-----------用例01--------------

function:test_02 
--------回到首页--------
.-----------用例02------------

------------结束测试 end!-----------
               [100%]

=========================== 2 passed in 0.02 seconds ===========================

 写在class里面也是一样的

#!/usr/bin/env/python
# -*-coding:utf-8-*-
import pytest

@pytest.fixture(scope="module", autouse=True)
def start(request):
    print('\n-----开始执行moule----')
    print('module      : %s' % request.module.__name__)
    print('----------启动浏览器---------')
    yield
    print("------------结束测试 end!-----------")

class Test_aaa():
    @pytest.fixture(scope="function", autouse=True)
    def open_home(self, request):
        print("function:%s \n--------回到首页--------" % request.function.__name__)

    def test_01(self):
        print('-----------用例01--------------\n')

    def test_02(self):
        print('-----------用例02------------\n')

运行结果:

============================= test session starts ==============================
platform darwin -- Python 3.7.0, pytest-3.9.1, py-1.7.0, pluggy-0.8.0
rootdir: /Users/newcomer/gitByMyself, inifile:
plugins: datadir-1.2.1, allure-adaptor-1.7.10collected 2 items

python_work_apple/pytest_package/fixtureDemo/test_04.py 
-----开始执行moule----
module      : test_04
----------启动浏览器---------
function:test_01 
--------回到首页--------
.-----------用例01--------------

function:test_02 
--------回到首页--------
.-----------用例02------------

------------结束测试 end!-----------
               [100%]

=========================== 2 passed in 0.02 seconds ===========================
Process finished with exit code 0

 

posted @ 2018-11-12 15:13  裴敏儿  阅读(347)  评论(0编辑  收藏  举报