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 ==============================
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下生效
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,默认是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的文件,作用范围只能在改层级以及以下目录生效。