pytest-fixture常用参数详解

fixture调用方式

@pytest.fixture(scope = "function",params=None,autouse=False,ids=None,name=None)

参数详解

SCOPE

  • 用于控制fixture的作用范围
  • 作用类似于pytest的setup/teardown
  • 默认取值为function(函数级别),控制范围的排序为:session > module > class > function
取值 范围 说明
function 函数级 每一个函数或方法都会调用
class 类级别 每个测试类只运行一次
module 模块级 每一个.py文件调用一次
session 会话级 每次会话只需要运行一次,会话内所有方法及类,模块都共享这个方法

scope = ‘function’

# -*- coding: utf-8 -*-
'''
@Time : 2021/1/14
@Author : 
@File : a.py
@describe : 
'''
import pytest

@pytest.fixture()
def login():
    print("进行用户登陆操作")


@pytest.fixture()
def logout():
    print("退出登陆")

class TestLogin:
    # 传入lonin fixture
    def test_001(self, login):
        print("用例一,执行登陆")

    # 传入logout fixture
    def test_002(self, logout):
        print("用例二,执行退出")

    def test_003(self, login, logout):
        print("用例三,执行登陆和退出")

    def test_004(self):
        print("用例四,无需登录")


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

运行结果如下:
pytest-fixture常用参数详解_第1张图片
从运行结果可以看出,fixture做为参数传入时,会在执行函数之前执行该fixture函数。再将值传入测试函数做为参数使用,这个场景多用于登录

scope=‘class’

  • 当测试类内的每一个测试方法都调用了fixture,fixture只在该class下所有测试用例执行前执行一次
# -*- coding: utf-8 -*-
'''
@Time : 2021/1/14
@Author : 
@File : b.py
@describe : 
'''
import pytest

@pytest.fixture(scope='class')
def login():
    print("进行用户登陆操作,scope为class")


class TestLogin:

    def test_001(self,login):
        print("用例一,执行登陆")

    def test_002(self,login):
        print("用例二,执行登陆")

    def test_003(self, login):
        print("用例三,执行登陆")


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

运行结果:
pytest-fixture常用参数详解_第2张图片

  • 当测试类中仅有部分方法调用了fixture,那么fixture会在第一个调用fixture的测试用例之前进行仅进行一次调用
# -*- coding: utf-8 -*-
'''
@Time : 2021/1/14
@Author : 
@File : b.py
@describe : 
'''
import pytest

@pytest.fixture(scope='class')
def login():
    print("进行用户登陆操作,scope为class")


class TestLogin:

    def test_001(self):
        print("用例一,不执行登陆")

    def test_002(self,login):
        print("用例二,执行登陆")

    def test_003(self, login):
        print("用例三,执行登陆")


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

运行结果:
pytest-fixture常用参数详解_第3张图片
scope=‘module’

  • 调用与class大致相同,从整个.py文件的第一个引用位置生效
# -*- coding: utf-8 -*-
'''
@Time : 2021/1/14
@Author : 
@File : a.py
@describe : 
'''
import pytest

@pytest.fixture(scope='module')
def login():
    print("进行用户登陆操作,scope为class")

def test_1():
    print('test1')

def test_2(login):
    print('test2')

class TestLogin:

    def test_001(self):
        print("用例一,不执行登陆")

    def test_002(self,login):
        print("用例二,执行登陆")

    def test_003(self, login):
        print("用例三,执行登陆")


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

pytest-fixture常用参数详解_第4张图片
scope = “session”:

  • session是针对.py来生效的,与module不同的是,module仅对当前.py文件生效,而session可以对多个.py文件生效
  • session多与contest.py一起使用

params

  • 是一个可选参数列表,默认为None
  • 若测试用例调用的fixture包含params参数,那么将在执行测试用例的时候对params中的参数进行循环调用
  • 必须使用request.param写法
# -*- coding: utf-8 -*-
'''
@Time : 2021/1/15
@Author : 
@File : b.py
@describe : 
'''

import pytest

@pytest.fixture(params=['chrome','firefox','ie'])
def demo(request):
    return request.param

def test_1(demo):
    print('选用浏览器为:{}'.format(demo))

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

运行结果:
pytest-fixture常用参数详解_第5张图片

你可能感兴趣的:(pytest学习笔记,python)