010、fixture作为测试用例的入参

fixture优势

1.firture相对于setup和teardown来说应该有以下几点优势

  • 命名方式灵活,不局限于setup和teardown这几个命名
  • conftest.py 配置里可以实现数据共享,不需要import就能自动找到一些配置
  • scope="module" 可以实现多个.py跨文件共享前置, 每一个.py文件调用一次
  • scope="session" 以实现多个.py跨文件使用一个session来完成多个用例
fixture(scope="function", params=None, autouse=False, ids=None, name=None):
arg params: 一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它
arg autouse: 如果为True,则为所有测试激活fixture func 可以看到它。 如果为False(默认值)则显式需要参考来激活fixture
arg ids: 每个字符串id的列表,每个字符串对应于params 这样他们就是测试ID的一部分。 如果没有提供ID它们将从params自动生成
arg name: fixture的名称。 这默认为装饰函数的名称。 如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽;
解决这个问题的一种方法是将装饰函数命名 “fixture_ <fixturename>”然后使用”@ pytest.fixture(name ='<fixturename>')“”。
scope="function"  方法层级,方法每调用login()一次,login()被执行一次; 
scope="class" 类层级,类执行一次,login()被执行一次;即使类里面多处调用login(),也只执行一次;
scope="module" 模块层级,模块执行一次,login()被执行一次;即使模块里面多处调用login(),也只执行一次;
scope="session" package/目录 层级,package/目录 被执行一次,login()被执行一次;即使package里面多处调用login(),也只执行一次;

Fixtures可以选择使用yield语句为测试函数提供它们的值,而不是return。 在这种情况下,yield语句之后的代码块作为拆卸代码执行,而不管测试结果如何。fixture功能必须只产生一次

 

实现场景:用例1需要先登录,用例2不需要登录,用例3需要先登录

010、fixture作为测试用例的入参
# 实现场景:用例1需要先登录,用例2不需要登录,用例3需要先登录
import pytest


@pytest.fixture()
def login():
    print('先登录')


def test_01(login):
    print('============test_01==========')


def test_02():
    print('============test_02==========')


def test_03(login):
    print('============test_03==========')
View Code

执行结果如下:

010、fixture作为测试用例的入参
D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee>pytest -s
================================================= test session starts =================================================
platform win32 -- Python 3.8.6, pytest-5.4.3, py-1.10.0, pluggy-0.13.1
rootdir: D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee
plugins: allure-pytest-2.9.43, html-2.1.1, metadata-1.11.0
collected 3 items

test_ee.py 先登录
============test_01==========
.============test_02==========
.先登录
============test_03==========
.

================================================== 3 passed in 0.03s ==================================================

D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee>
View Code

 

获取 fixture 的返回值

010、fixture作为测试用例的入参
# -*- coding:utf-8 -*-
# @Author:  Sky
# @Email:   2780619724@qq.com
# @Time:    2021/7/18 20:44

# fixture的返回值如何获取到
# 实现场景:用例1需要先登录,用例2不需要登录,用例3需要先登录

import pytest


@pytest.fixture()
def login():
    print('先登录')
    result ={
        'code': 200,
        'state': 'sucess'
    }
    return result


def test_01(login):
    print('============test_01==========')
    print(login['code'])
    print(login['state'])


def test_02():
    print('============test_02==========')


def test_03(login):
    print('============test_03==========')
View Code

执行结果如下:

010、fixture作为测试用例的入参
D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee>pytest -s
================================================= test session starts =================================================
platform win32 -- Python 3.8.6, pytest-5.4.3, py-1.10.0, pluggy-0.13.1
rootdir: D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee
plugins: allure-pytest-2.9.43, html-2.1.1, metadata-1.11.0
collected 3 items

test_ee.py 先登录
============test_01==========
200
sucess
.============test_02==========
.先登录
============test_03==========
.

================================================== 3 passed in 0.05s ==================================================

D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee>
View Code

 

用class写的用例同样适用

010、fixture作为测试用例的入参
# -*- coding:utf-8 -*-
# @Author:  Sky
# @Email:   2780619724@qq.com
# @Time:    2021/7/18 20:44

# fixture的返回值如何获取到
# 实现场景:用例1需要先登录,用例2不需要登录,用例3需要先登录

import pytest


@pytest.fixture()
def login():
    print('先登录')
    result ={
        'code': 200,
        'state': 'sucess'
    }
    return result


class TestDemo:
    def test_01(self, login):
        print('============test_01==========')
        print(login['code'])
        print(login['state'])

    def test_02(self):
        print('============test_02==========')

    def test_03(self, login):
        print('============test_03==========')
        assert login['code'] == 200
        assert login['state'] == 'Fail'
View Code

执行结果如下:

010、fixture作为测试用例的入参
D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee>pytest -s
=================================================================================== test session starts ====================================================================================
platform win32 -- Python 3.8.6, pytest-5.4.3, py-1.10.0, pluggy-0.13.1
rootdir: D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee
plugins: allure-pytest-2.9.43, html-2.1.1, metadata-1.11.0
collected 3 items

test_ee.py 先登录
============test_01==========
200
sucess
.============test_02==========
.先登录
============test_03==========
F

========================================================================================= FAILURES =========================================================================================
_____________________________________________________________________________________ TestDemo.test_03 _____________________________________________________________________________________

self = <ee.test_ee.TestDemo object at 0x00000244D749A790>, login = {'code': 200, 'state': 'sucess'}

    def test_03(self, login):
        print('============test_03==========')
        assert login['code'] == 200
>       assert login['state'] == 'Fail'
E       AssertionError: assert 'sucess' == 'Fail'
E         - Fail
E         + sucess

test_ee.py:34: AssertionError
================================================================================= short test summary info ==================================================================================
FAILED test_ee.py::TestDemo::test_03 - AssertionError: assert 'sucess' == 'Fail'
=============================================================================== 1 failed, 2 passed in 0.20s ================================================================================

D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee>
View Code

 

调用多个 fixture 

010、fixture作为测试用例的入参
# -*- coding:utf-8 -*-
# @Author:  Sky
# @Email:   2780619724@qq.com
# @Time:    2021/7/18 20:44

# fixture的返回值如何获取到
# 实现场景:用例1需要先登录,用例2不需要登录,用例3需要先登录

import pytest


@pytest.fixture()
def register():
    print('先注册')
    result = {
        'code': 200,
        'state': '注册成功'
    }
    return result


@pytest.fixture()
def login():
    print('先登录')
    result = {
        'code': 200,
        'state': 'sucess'
    }
    return result


class TestDemo:
    def test_01(self, login):
        print('============test_01==========')
        print(login['code'])
        print(login['state'])

    def test_02(self):
        print('============test_02==========')

    def test_03(self, login):
        print('============test_03==========')
        assert login['code'] == 200
        assert login['state'] == 'sucess'

    # 调用多个fixture
    def test_04(self, register, login):
        assert register['state'] == '注册成功'
        assert login['state'] == 'sucess'
        print('============test_02==========')
View Code

执行结果如下:

010、fixture作为测试用例的入参
D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee>pytest -s
=================================================================================== test session starts ====================================================================================
platform win32 -- Python 3.8.6, pytest-5.4.3, py-1.10.0, pluggy-0.13.1
rootdir: D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee
plugins: allure-pytest-2.9.43, html-2.1.1, metadata-1.11.0
collected 4 items

test_ee.py 先登录
============test_01==========
200
sucess
.============test_02==========
.先登录
============test_03==========
.先注册
先登录
============test_02==========
.

==================================================================================== 4 passed in 0.05s =====================================================================================

D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day06\ee>
View Code

 

上一篇:pytest测试框架setup与fixture连用


下一篇:【pytest学习】fixture参数化,fixture(params=data)装饰器的data是函数返回值yield request.param ,将带到下面调用为参数的函数中