pytest之fixture前置和后置

2021-04-26  本文已影响0人  阿登20

一、conftest.py

定义公共的fixture,多个测试类中都可以调用
pytest提供了conftest.py文件,可以将fixture定义在此文件中
运行测试用例时,不需要去导入这个文件,会自动去查找conftest.py文件,然后去找到对用的fixture

二、前置和后置

fixture函数根据关键字yield作为前置和后置的分割线,并且yield也可以接收返回值,作用相当于return

unittest的前置后置写在setUp和tearDown中的,如果其他测试类有一样的前置后置我要重复运用这些前置后置unittest办不到,或者我需要用之前的部分前置 后置.pytest的共享conftest.py的函数里面的前置后置,可以做到前置后置共享。也不要引用。

image.png
@pytest.fixture(scope="class")
def access_web():
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get(cd.login_url)
    yield driver
    driver.quit()


@pytest.fixture(scope="class")
def longin_web(access_web):  # 继承access_web的前置后置 access_web作为参数,也作为返回值
    # 以学生帐叼,登陆系统。这里是在网页上操作
    # driver = webdriver.Chrome()
    # driver.maximize_window()
    # driver.get(cd.login_url)
    LoginPage(access_web).login(*cd.student_user)
    # ip = IndexPage(access_web)
    yield access_web
    # driver.quit()
# 先调用access_web的前置
# 在调用自己的前置
# 在执行用例
# 在执行自己的后置
# 在执行access_web的后置
#继承顺序 函数可以继承类 类可以继承模块 模块可以继承会话 低级别可以跨越继承高级别

import pytest

@pytest.fixture()
def init_demo():
    print("这是测试用例的前置")
    a = 1
    yield a  # 分割线(yield + 返回值)
    print("这是测试用例的后置")

三、调用fixture

1.在测试用例中直接调用

def test_add_01(init_demo):
    b = init_demo + 2
    assert 3 == b

如图打断点分析

image.png

2.用fixture装饰器调用fixture

import pytest


@pytest.mark.usefixtures('init_demo')
def test_add_02():
    b = 1 + 2
    assert 3 == b
image.png

3.用autos调用fixture


import pytest

@pytest.fixture(autouse=True)
def init_demo():
    print("这是测试用例的前置")
    yield
    print("这是测试用例的后置")

测试代码如下

import pytest


def test_add_02():
    b = 1 + 2
    assert 3 == b
image.png

四、fixture的继承(前置的前置,后置的后置)

import pytest

@pytest.fixture(scope='session')
def init_session():
    print("这是测试会话的前置")
    yield
    print("这是测试会话的后置")


@pytest.fixture(scope='module')
def init_module(init_session):
    print("这是测试模块的前置")
    yield
    print("这是测试模块的后置")


@pytest.fixture(scope='class')
def init_class(init_module):
    print("这是测试类的前置")
    yield
    print("这是测试类的后置")


@pytest.fixture  # 相当于@pytest.fixture(scope='function')
def init_function(init_class):
    print("这是测试用例的前置")
    yield
    print("这是测试用例的后置")
image.png

打印结果

image.png

fixture不同级别的执行次数

演示代码

mport pytest

@pytest.fixture(scope='session')
def init_session():
    print("这是测试会话的前置")
    yield
    print("这是测试会话的后置")


@pytest.fixture(scope='module')
def init_module():
    print("这是测试模块的前置")
    yield
    print("这是测试模块的后置")


@pytest.fixture(scope='class')
def init_class():
    print("这是测试类的前置")
    yield
    print("这是测试类的后置")


@pytest.fixture  # 相当于@pytest.fixture(scope='function')
def init_function():
    print("这是测试用例的前置")
    yield
    print("这是测试用例的后置")

测试代码 全程打断点 可以看得非常清楚

image.png image.png image.png image.png

fixture的参数params接收一个容器比如list 元组 嵌套的list等等。传个内置的fixturerequest通过request.para返回。这种也可以类似parametrize功能。

image.png
上一篇下一篇

猜你喜欢

热点阅读