Pytest框架学习16-fixture详解

1.fixture可以当做参数传入,并返回结果, 一个函数可以有多个fixture修饰

fixture使用时将函数名称传入,可以有返回值,没有return时返回None,一个函数可以有多个fixture修饰

如果用例需要用到多个fixture的返回数据,fixture也可以返回一个元组,list或字典,然后从里面取出对应数据

#!usr/bin/python
# -*- coding: utf-8 -*-
import pytest
@pytest.fixture(scope="function")
def login():
    print("登录。。。。。。。。。。。")
    return 1,2
def test_name(login):
    print(login)
    








Launching pytest with arguments test_1.py::test_name in E:\PycharmProject\TestLibrary1\xiecheng
============================= test session starts =============================
platform win32 -- Python 3.7.0, pytest-5.1.3, py-1.8.0, pluggy-0.13.0
rootdir: E:\PycharmProject\TestLibrary1\xiechengcollected 1 item

test_1.py 登录。。。。。。。。。。。
.(1, 2)
                                                              [100%]

============================== 1 passed in 0.01s ==============================
import pytest
@pytest.fixture(scope="function")
def login():
    print("登录。。。。。。。。。。。")
    return 1,2
@pytest.fixture(scope="function")
def login2():
    print("登录2。。。。。。。。。。。")
    return "33333"
def test_name(login,login2):
    print(login)
    print(login2)


test_1.py 登录。。。。。。。。。。。
登录2。。。。。。。。。。。
.(1, 2)
33333
                                                              [100%]

============================== 1 passed in 0.01s ==============================

fixture之间可以互相调用

import pytest
@pytest.fixture(scope="function")
def login():
    print("登录。。。。。。。。。。。")
    return 1,2
@pytest.fixture(scope="function")
def login2(login):
    print(login)
    print("登录2。。。。。。。。。。。")
    return "33333"
def test_name(login2):
    print(login2)

Launching pytest with arguments E:/PycharmProject/TestLibrary1/xiecheng/test_1.py in E:\PycharmProject\TestLibrary1\xiecheng
============================= test session starts =============================
platform win32 -- Python 3.7.0, pytest-5.1.3, py-1.8.0, pluggy-0.13.0
rootdir: E:\PycharmProject\TestLibrary1\xiechengcollected 1 item

test_1.py 登录。。。。。。。。。。。
(1, 2)
登录2。。。。。。。。。。。
.33333
                                                              [100%]

conftest.py一个工程文件中可以有多个,每个都只在当前package下生效

调用fixture的2种方法

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

2.使用装饰器@pytest.mark.usefixtures()修饰需要运行的用例

import pytest
# test_fixture1.py


@pytest.fixture()
def test1():
    print('\n开始执行function')


@pytest.mark.usefixtures('test1')
def test_a():
    print('---用例a执行---')


@pytest.mark.usefixtures('test1')
class TestCase:

    def test_b(self):
        print('---用例b执行---')

    def test_c(self):
        print('---用例c执行---')


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

输出结果:
platform win32 -- Python 3.7.0, pytest-4.0.2, py-1.7.0, pluggy-0.8.0
rootdir: C:\Program Files\PycharmProjects\exercise, inifile:collected 3 items

test_fixture1.py 
开始执行function
.---用例a执行---

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

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

========================== 3 passed in 0.06 seconds ===========================
Process finished with exit code 0

如果一个方法或者一个class用例想要同时调用多个fixture,可以使用@pytest.mark.usefixture()进行叠加。注意叠加顺序,先执行的放底层,后执行的放上层。

usefixtures与传fixture区别

 如果fixture有返回值,那么usefixture就无法获取到返回值,这个是装饰器usefixture与用例直接传fixture参数的区别。

当fixture需要用到return出来的参数时,只能讲参数名称直接当参数传入,不需要用到return出来的参数时,两种方式都可以。

fixture自动使用autouse=True

当用例很多的时候,每次都传这个参数,会很麻烦。fixture里面有个参数autouse,默认是False没开启的,可以设置为True开启自动使用fixture功能,这样用例就不用每次都去传参了

import pytest
# test_fixture1.py


@pytest.fixture(scope='module', autouse=True)
def test1():
    print('\n开始执行module')


@pytest.fixture(scope='class', autouse=True)
def test2():
    print('\n开始执行class')


@pytest.fixture(scope='function', autouse=True)
def test3():
    print('\n开始执行function')


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


def test_d():
    print('---用例d执行---')


class TestCase:

    def test_b(self):
        print('---用例b执行---')

    def test_c(self):
        print('---用例c执行---')


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


输出结果:
============================= test session starts =============================
platform win32 -- Python 3.7.0, pytest-4.0.2, py-1.7.0, pluggy-0.8.0
rootdir: C:\Program Files\PycharmProjects\exercise, inifile:collected 4 items

test_fixture1.py 
开始执行module

开始执行class

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

开始执行class

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

开始执行class

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

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

conftest.py的作用范围

一个工程下可以建多个conftest.py的文件,一般在工程根目录下设置的conftest文件起到全局作用。在不同子目录下也可以放conftest.py的文件,作用范围只能在改层级以及以下目录生效。

 

 

 

 

 

 

你可能感兴趣的:(Pytest)