pytest-fixture

pytest-fixture

一、适用范围

1.替代setup和teardown
2.参数化
如何使用:
1.给要使用的方法传入fixture的函数名
2.使用装饰器@pytest.mark.usefixtures(’’)
3.可以使用多个fixture
4.作用域:session>module>class>function

二、替代setup和teardown

替代setup

给要使用的方法传入fixture的函数名
使用装饰器@pytest.mark.usefixtures(’’)

import pytest


@pytest.fixture()
def login():
    print('登陆操作')

def test_case1(login):
    print('这是一个测试用例1,需要提前登陆')

def test_case2():
    print('这是一个测试用例2,不需要提前登陆')
@pytest.mark.usefixtures('login')
def test_case3():
    print('这是一个测试用例3,需要提前登陆')


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

登陆操作
这是一个测试用例1,需要提前登陆

这是一个测试用例2,不需要提前登陆

登陆操作
这是一个测试用例3,需要提前登陆

替代teardown使用yield

import pytest


@pytest.fixture()
def login():
    print('登陆操作')
    yield
    print('退出登陆')

def test_case1(login):
    print('这是一个测试用例1,需要提前登陆')

def test_case2():
    print('这是一个测试用例2,不需要提前登陆')
@pytest.mark.usefixtures('login')
def test_case3():
    print('这是一个测试用例3,需要提前登陆')


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

登陆操作
这是一个测试用例1,需要提前登陆
退出登陆

这是一个测试用例2,不需要提前登陆

登陆操作
这是一个测试用例3,需要提前登陆
退出登陆

替代return,返回值

import pytest


@pytest.fixture()
def login():
    print('登陆操作')
    username='登录名'
    password='6543210y'
    token='654127'
    yield [username,password,token]
    print('退出登陆')

def test_case1(login):
    print(f'打印用户名密码{login}')
    print('这是一个测试用例1,需要提前登陆')

登陆操作
打印用户名密码[‘登录名’, ‘6543210y’, ‘654127’]
这是一个测试用例1,需要提前登陆
退出登陆

import pytest


@pytest.fixture()
def login():
    print('登陆操作')
    username='登录名'
    password='6543210y'
    token='654127'
    yield [username,password,token]
    print('退出登陆')

def test_case1(login):
    print(f'打印用户名密码{login[0],login[1]}')
    print('这是一个测试用例1,需要提前登陆')

登陆操作
打印用户名密码(‘登录名’, ‘6543210y’)
这是一个测试用例1,需要提前登陆
退出登陆

三、作用域:session>module>class>function,特别注意尽量在第一个方法中引入fixture函数名

import pytest

@pytest.fixture(scope='module')
def env():
    print('初始化环境')
    yield
    print('环境恢复')
@pytest.fixture(scope='class')
def open():
    print('打开网页')
    yield
    print('关闭网页')
@pytest.fixture(scope='function')
def login():
    print('登陆操作')
    yield
    print('退出登陆')

class Testcase1:
    def test_case1(self,login):
        print('这是一个测试用例1,需要提前登陆')

    def test_case2(self,open):
        print('这是一个测试用例2,需要提前登陆')

    def test_case3(self):
        print('这是一个测试用例3,需要提前登陆')
class Testcase2:
    def test_case4(self,env):
        print('这是一个测试用例4,不需要提前登陆')


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

登陆操作
这是一个测试用例1,需要提前登陆
退出登陆
打开网页
这是一个测试用例2,需要提前登陆
初始化环境
这是一个测试用例3,需要提前登陆
关闭网页
这是一个测试用例4,不需要提前登陆
环境恢复
注意:
如果是scope='function’那么需要使用的每个方法都要传入fixture方法名
如果scope='class’那么需要在对应调用fixture的class中的第一个方法就要传入,否则只能在这个class中这个传入的方法后面的方法才能使用
如果scope=‘module’,和scope='class’一样
上段代码改成

class Testcase1:
    def test_case1(self,login,open,env):
        print('这是一个测试用例1,需要提前登陆')

    def test_case2(self,open):
        print('这是一个测试用例2,不需要提前登陆')

    def test_case3(self,login):
        print('这是一个测试用例3,需要提前登陆')
class Testcase2:
    def test_case4(self,env):
        print('这是一个测试用例4,不需要提前登陆')


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

初始化环境
打开网页
登陆操作
这是一个测试用例1,需要提前登陆
退出登陆
这是一个测试用例2,不需要提前登陆
登陆操作
这是一个测试用例3,需要提前登陆
退出登陆
关闭网页
这是一个测试用例4,不需要提前登陆
环境恢复

scope='session’的用法,多个.py文件同时使用
conftest.py

import pytest

@pytest.fixture(scope='session')
def Multiple():
    print('open session')
    yield
    print('close session')
@pytest.fixture(scope='module')
def env():
    print('初始化环境')
    yield
    print('环境恢复')
@pytest.fixture(scope='class')
def open():
    print('打开网页')
    yield
    print('关闭网页')
@pytest.fixture(scope='function')
def login():
    print('登陆操作')
    yield
    print('退出登陆')

test_f1.py

import pytest
class Testcase1:
    def test_case1(self,login,open,env,Multiple):
        print('这是一个测试用例1,需要提前登陆')

    def test_case2(self,open):
        print('这是一个测试用例2,不需要提前登陆')

    def test_case3(self,login):
        print('这是一个测试用例3,需要提前登陆')
class Testcase2:
    def test_case4(self,env):
        print('这是一个测试用例4,不需要提前登陆')

test_f2.py

class Testcase1:
    def test_case5(self,Multiple):
        print('这是一个测试用例5')

执行pytest -sq test_f1.py test_f2.py

open session
初始化环境
打开网页
登陆操作
这是一个测试用例1,需要提前登陆
.退出登陆
这是一个测试用例2,不需要提前登陆
.登陆操作
这是一个测试用例3,需要提前登陆
.退出登陆
关闭网页
这是一个测试用例4,不需要提前登陆
.环境恢复
这是一个测试用例5
.close session

conftest.py可以放前期操作,运行.py文件会先执行conftest.py,要和.py文件放在同一个包下面

四、参数化

使用@pytest.fixture(params=)定义
使用request接参数
request.param取出参数
conftest.py

import pytest

@pytest.fixture(params=[1,2,3])
def data(request):
    print('参数化')
    data=request.param
    return data  
    #或者用yield data

test_f2.py

class Testcase1:
    def test_case5(self,data):
        print('这是一个测试用例')
        print(f'获取传入数据{data}')

pytest-fixture_第1张图片

你可能感兴趣的:(pytest,python)