PytestFixture实战应用+Pytest.ini与conftest.py应用详解+Fixture及yield实现用例前置后置

38 篇文章 6 订阅
23 篇文章 0 订阅


1.Pytest之Fixture介绍

import pytest

# 用例预置数据
@pytest.fixture
def first_fix():
    return ['a']

# 测试用例
def test_case01(first_fix):
    #用例步骤
    first_fix.append("b")
    print(first_fix)

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

def first_fix():
    return ["a"]


def test_case(varA):
    varA.append("b")
    print(varA)

varA = first_fix()
test_case(varA)

2.Fixture调用Fixture

import pytest


@pytest.fixture
def first_fix():
    # return "a"
    return {'username':'admin','password':'admin123'}

@pytest.fixture
def order(first_fix):
    first_fix['aaa'] = '1111'
    return first_fix


# 测试用例
def test_string(order):
    # order.append("b")
    # print(order)
    print(order)

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

def first_entry():
    return "a"


def order(first_entry):
    return [first_entry]

def test_string(order):
    order.append("b")
    assert order == ["a","b"]
    print(order)

entry = first_entry()
the_list = order(first_entry = entry)
test_string(order=the_list)

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

import pytest


@pytest.fixture
def fix1():
    print("fix1返回的值")


@pytest.fixture
def fix2():
    print("fix2返回的值")

@pytest.mark.usefixtures('fix1')
@pytest.mark.usefixtures('fix2')
class TestCase():
    def test_2(self):
        print("类里的用例test2")

    def test_3(self):
        print("类里的用例test3")

# 1.这种方法,在fixture+conftest.py的组合形式下,是无法被引用的
# 2.这种直接在类上统一的使用fix,类当中的用例就不用再重复使用了

@pytest.mark.usefixtures('fix1','fix2')
def test_1():
    print("测试用例一")

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

4.使用多个fixture

import pytest


@pytest.fixture
def fix():
    a = "zz"
    b = "123456"
    print("传出a,b")
    return (a,b)


def test_case(fix):
    username = fix[0]
    password = fix[1]
    print('通过fixture的元组取出用户名和密码')
    print(username)
    print(password)

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

import pytest

@pytest.fixture
def fix1():
    a = "zz"
    print("\n传出a")
    return a


@pytest.fixture
def fix2():
   b = "123456"
   print("\n传出b")
   return b

def test_case(fix1,fix2):
    username = fix1
    password = fix2
    print("传入多个fix")
    print(username)
    print(password)

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

5.conftest.py+fixture+yield实现用例前置后置

conftest.py

import pytest


@pytest.fixture
def fix1():
    print('\nconftest里的fix1')
    yield
    print("\n用例执行完成,我来扫尾")

import pytest


def test_case(fix1):
    print("测试用例一")

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

6.fixture的自动使用与作用域

conftest.py
import pytest


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


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

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

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

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

def test_a():
    print("用例a执行")

def test_b():
    print("用例b执行")

class TestCase:
    def test_c(self):
        print("类里的用例c执行")

    def test_d(self):
        print("类里的用例d执行")

7.python中yield关键字的用法详解

"""
    1.程序开始执行以后,因为test函数中有yield关键字
    所以test函数并不会真正的执行,而是先得到一个生成器g
    2.直到调用next方法,test函数正式开始执行,先执行test函数中的print方法,然后进入while循环
    3.程序遇到yield关键字,然后把yield想成是return,return了一个8之后,程序停止,并没有执行赋值给a操作,此时next(g)语句执行完成
    所以输出前面两行(第一行是while上面print的结果,第二行是return出来的结果)
    4.程序执行print("*******************************************")
    5.又开始执行下面的print(next(g)),这个时候是从刚才next程序停止的地方开始执行
    也就是要执行a的赋值操作,这个时候因为赋值操作的右边是没有值的,已经被return出去了
    这个时候a的值是none,所以接下来的输出是a:none
    6.程序会继续在while里执行,又一次碰到yield,这个时候同样return出8,然后程序停止。
    print函数输出的8就是这次retur出的8
"""



def test():
    print("begin......")
    while True:
        a = yield 8
        print("a:" ,a)

g = test()
print(next(g))
print("******************************")
print(next(g))

import pytest

def test_a():
    print("用例a执行")

def test_b():
    print("用例b执行")

class TestCase:
    def test_c(self):
        print("类里的用例c执行")

    def test_d(self):
        print("类里的用例d执行")

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

8.fixture之params参数化

import pytest


def read_list():
    return ['1','2','3']

@pytest.fixture(params = read_list())
def fix(request):
    #request是pytest的内置fixture,主要用于传递参数
    return request.param

def test_01(fix):
    print("测试用例: "+fix)
    print(fix)

if __name__ == '__main__':
    if __name__ == '__main__':
        pytest.main(['-s','test_params_13.py'])
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

司小幽

真诚赞赏,手留余香。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值