pytest学习--fixture

import pytest
import smtplib
import contextlib


# @pytest.fixture(scope='function')
# def smtp_connection():
#     return smtplib.SMTP("smtp.gmail.com", 587, timeout=5)
#
#
# '''
#     pytest --fixtures test_simplefactory.py
#     查看可用的灯具(带前缀的灯具_仅在添加-v选项后才会显示)
# '''
#
#
# def test_ehlo(smtp_connection):
#     response, msg = smtp_connection.ehlo()
#     print('*'*50)
#     print(response, msg, end=' ')
#     print('*' * 50)
#     assert response == 250
#     assert 0  # for demo purposes
'''
     fixture(scope="function", params=None, autouse=False, ids=None, name=None)
        scope有四个级别的参数: function, class, Module, session
        params:一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它
         autouse:如果为True,则为所有测试激活fixture func可以看见他,如果为False(默认值)
        则显示需要参考来激活fixture
        每个字符串id的列表, 每个字符串对应于params这样他们就是测试ID的一部分。如果没有提供ID
        他们从params自动生成
        name:fixture的名称 这默认是装饰函数的名称
'''



# @pytest.fixture()默认是函数级别的 @pytest.fixture(scope="function")

# @python.fixture()函数级别次序
order = []


@pytest.fixture(scope="session")
def s1():
    order.append("session")
    assert 1


@pytest.fixture(scope="module")
def m1():
    order.append("module")
    assert 1


@pytest.fixture(scope="function")
def f1():
    order.append("function")
    assert 1


def test_order_list(s1, m1, f1):
    assert order == ['session', 'module', 'function']


@pytest.fixture(scope="module")
def login():
    """
        通过使用yield语句代替return,yield语句之后的所有代码都将用作结束调用的拆卸语句:
    :yield:
    """
    print("输入账号密码:")
    yield login
    print("我忘记了")


def test_s1(login):
    print("user:{},password:{}".format('Mike', '123456'))
    assert 1


# 无论夹具设置代码是否引发异常,都将始终使用contextlib.ExitStack上下文管理器终结器进行调用
@contextlib.contextmanager
def connect(port):
    print("引用{}".format(port))
    yield connect()
    print("关闭引用了")


@pytest.fixture(scope='function')
def equipments():
    with contextlib.ExitStack() as stack:
        yield [stack.enter_context(connect(port)) for port in ("C1", "C3", "C28")]
        """
            请注意,我们还可以将yield语法与with语句无缝结合使用
            如果"C28"失败,异常,"C1"并且"C3"将仍然被正确关闭
        """
# def setup_module():
#     print("模块级别开始")
#
#
# def teardown_module():
#     print("模块级别结束")
#
#
# def setup_function():
#     print("函数级别开始")
#
#
# def teardown_function():
#     print("函数级别结束")
#
#
# def test_print1():
#     print("输出用例1")
#
#
# def test_print2():
#     print("输出用例2")


# class TestMethod:
#     def setup_class(self):
#         print("类对象开始")
#
#     def teardown_class(self):
#         print("类对象结束")
#
#     def setup_method(self):
#         print("类对象方法开始")
#
#     def teardown_method(self):
#         print("类对象方法结束")
#
#     def setup(self):
#         print("setup开始")
#
#     def teardown(self):
#         print("teardown结束")
#
#     def test_1(self):
#         print('1')


# def setup_module():
#     print("模块级别开始")
#
#
# def teardown_module():
#     print("模块级别结束")
#
#
# def setup_function():
#     print("函数级别开始")
#
#
# def teardown_function():
#     print("函数级别结束")
#
#
# def test_print1():
#     print("输出用例1")
#
#
# def test_print2():
#     print("输出用例2")


# 参数化
@pytest.fixture(scope='module', params=['I am here', 'always waiting for you'])
def print_here(request):
    print(request.param)
    assert 1


def test_task1(print_here):
    print("这是参数化测试")
    assert 1


@pytest.fixture(params=[0, 1], ids=["spam", "ham"])
def a(request):
    return request.param


def test_a(a):
    pass


def idfnc(fixture_value):
    if fixture_value == 0:
        return "eggs"
    else:
        return None


@pytest.fixture(params=[0, 1], ids=idfnc)
def b(request):
    return request.param


def test_b(b):
    pass

猜你喜欢

转载自blog.csdn.net/hide_in_darkness/article/details/108439162