pytest扫盲5--fixture之conftest.py文件

conftest.py:

  1)专门存放 fixture 的文件

  2)conftest.py 可以存放多个 fixtures

  3)conftest.py 文件名称是固定的,不能改变

  4)conftest.py 只对同一个 package 下的用例生效

  5)不同目录可以有自己的 conftest.py,一个项目中可以有多个 conftest.py

  6)pytest 执行用例时,会自动查找 conftest.py

  7)fixture 可以使用 return 和 yield 产生返回值,供函数调用,调用直接使用 函数名,yield 返回值后仍可以继续进行 teardown 处理

  8)yield 遇到异常后,不会影响后面的 teardown 运行

 

示例代码:

# File  : conftest.py
# IDE   : PyCharm

import pytest

@pytest.fixture(scope='module')
def login_():
    print('conftest.py中module级别登录,.py文件只执行一次')
    yield
    print('module级别中的 yield 执行,退出登录,用例执行结束!')


@pytest.fixture(scope='function')
def databaseConnection():
    print('function级别,数据库连接成功!')
    yield
    print('function级别,断开数据库连接!')

@pytest.fixture(scope='function')
def add():
    print('function级别,这里使用了 return 返回值')
    a = 0
    a += 3
    return a

@pytest.fixture(scope='function')
def add_():
    print('function级别,这里使用了 yield 返回值')
    a = 0
    a += 4
    yield a
    print('yield 返回值后,打印测试结束!')

 

调用fixture:使用 fixture 函数名 作为函数或方法的参数

# File  : test_demo_6.py
# IDE   : PyCharm

import pytest

def test_1(login_):     # fixture函数名 作为函数或方法的参数传入
    print('正在执行测试用例test_1,', end='')
    a = int(3/2)
    print('a的结果为:{}'.format(a))
    assert a == 1

def test_4(add):
    """使用return返回值"""
    print('正在执行测试用例test_4,', end='')
    print('这里使用了return返回值,add()的结果为:{}'.format(add))
    assert add <= 6

def test_5(add_):
    """使用yield返回值"""
    print('正在执行测试用例test_5,', end='')
    print('这里使用了yield返回值,add_()的结果为:{}'.format(add_))
    assert add_ <= 6

class TestCases():
    def getPhoneNum(self):
        return '1008611'

    def getEmail(self):
        return 'admin@163.com'

    def test_2(self, databaseConnection):
        phoneNum = self.getPhoneNum()
        print('执行test_2,电话号码为{0}'.format(phoneNum))
        assert phoneNum == '1008611'

    def test_3(self):
        email = self.getEmail()
        print('\n执行test_3,邮箱为{0}'.format(email))
        assert email == 'admin@163.com'


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

执行:

E:\personal\python38\python.exe E:/personal/GitWorkSpace/pytest_basic/main.py
conftest.py中module级别登录,.py文件只执行一次
正在执行测试用例test_1,a的结果为:
1
.function级别,这里使用了 return 返回值 正在执行测试用例test_4,这里使用了return返回值,add()的结果为:3
.function级别,这里使用了 yield 返回值 正在执行测试用例test_5,这里使用了yield返回值,add_()的结果为:4 .yield 返回值后,打印测试结束!
function级别,数据库连接成功! 执行test_2,电话号码为1008611 .function级别,断开数据库连接! 执行test_3,邮箱为admin@
163.com
.
module级别中的 yield 执行,退出登录,用例执行结束!
5 passed in 0.02s

  

调用fixture:使用 @pytest.mark.usefixtures('function_name') 方式修饰或方法, 此方法没法获取返回值,但是此方式可以叠加使用

# File  : test_demo_7.py
# IDE   : PyCharm

import pytest

# 使用 @pytest.mark.usefixtures('function_name') 修饰方法或者类
@pytest.mark.usefixtures('login_')
@pytest.mark.usefixtures('databaseConnection')
def test_1():
    print('\n正在执行测试用例test_1,', end='')
    a = int(3/2)
    print('a的结果为:{}'.format(a), end='\n\n')
    assert a == 1

 执行: 

E:\personal\python38\python.exe E:/personal/GitWorkSpace/pytest_basic/main.py
conftest.py中module级别登录,.py文件只执行一次
function级别,数据库连接成功!

正在执行测试用例test_1,a的结果为:1

.function级别,断开数据库连接!
module级别中的 yield 执行,退出登录,用例执行结束!

1 passed in 0.04s

Process finished with exit code 0

 

posted @ 2020-08-18 18:11  子非鱼焉知鱼之乐丶  阅读(499)  评论(0编辑  收藏  举报