Pytest自动化测试fixture之conftest.py

时间:2022-07-22
本文章向大家介绍Pytest自动化测试fixture之conftest.py,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

之前我们讲到用例前后置方法 [ setup 、teardown ] Pytest测试用例之setup与teardown方法(一) Pytest测试用例之setup与teardown方法(二) 可以实现在自动化测试用例执行前或执行后进行特定的操作

但是不足之处是 [ setup 、teardown ] 只满足在全局或者每条case前、后。不能满足A测试用例执行,B测试用例不执行,那么我们还有什么方法能够实现这自定义的场景呢

来看看我们今天的猪脚fixture

01前言

fixture优势

[ firture相对于setup与teardown来说应该有以下几点优势 ]

1.命名方式灵活,不限于setup与teardown这几个命名

2.conftest.py 配置里可以实现数据共享,不需要import就能自动找到一些配置

3.scope="module" 可以实现多个.py跨文件共享前置

4.scope="session" 以实现多个.py跨文件使用一个session来完成多个用例

fixture介绍

fixture(scope="function", params=None, autouse=False, ids=None, name=None):
    """使用装饰器标记fixture的功能
     可以使用此装饰器(带或不带参数)来定义fixture功能。fixture功能的名称可以在以后使用
     引用它会在运行测试之前调用它:test模块或类可以使用pytest.mark.usefixtures(fixturename标记。
     测试功能可以直接使用fixture名称作为输入参数,在这种情况下,夹具实例从fixture返回功能将被注入。

    :arg scope: scope 有四个级别参数 "function" (默认), "class", "module" or "session".

    :arg params: 一个可选的参数列表,它将导致多个参数调用fixture功能和所有测试使用它

    :arg autouse:  如果为True,则为所有测试激活fixture func 可以看到它。如果为False(默认值)则显式需要参考来激活fixture

    :arg ids: 每个字符串id的列表,每个字符串对应于params 这样他们就是测试ID的一部分。如果没有提供ID它们将从params自动生成

    :arg name:   fixture的名称。这默认为装饰函数的名称。如果fixture在定义它的同一模块中使用,夹具的功能名称将被请求夹具的功能arg遮蔽; 解决这个问题的一种方法是将装饰函数命名
                       “fixture_ <fixturename>”然后使用”@ pytest.fixture(name ='<fixturename>')“”。

02 fixture实战代码

实现场景:例如我们实际项目中登录有case执行前与case执行后俩种测试用例,那么我们该用什么方法去设计这种呢?

例如第一条测试用例需要执行登录,第二条测试用例不需要执行,第三条测试用例需要执行,看看实现的代码

# coding=utf-8
# authou:shichao
# python测试社区学习记录


import pytest


# 不带参数时默认scope='function' 如果@pytest.fixture()里面没有参数,那么默讣 scope=”
# function”,也就是此时的级别的 function,针对函数有效
@pytest.fixture()
def login():
    print('前置进行输入账号密码登录')


def test_a1(login):
    print('执行测试用例1,继承login函数、前置登录后,继续下一步操作')


def test_a2():  # 不传login
    print('用例2 不需要登录,做其他动作')


def test_a3(login):  # 不传login
    print('执行测试用例3,继承login函数、 前置登录后,继续下一步操作')


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

运行结果

rootdir: F:python3python_codeStudyAPI_AutoTest_Pytest
collecting ... collected 3 items

test_fix_0708.py::test_a1 前置进行输入账号密码登录
PASSED                                         [ 33%]执行测试用例1,继承login函数、前置登录后,继续下一步操作

test_fix_0708.py::test_a2 PASSED                                         [ 66%]用例2 不需要登录,做其他动作

test_fix_0708.py::test_a3 前置进行输入账号密码登录
PASSED                                         [100%]执行测试用例3,继承login函数、 前置登录后,继续下一步操作


============================== 3 passed in 0.02s ==============================

Process finished with exit code 0

总结:如果@pytest.fixture()里面没有参数,那么默认scope=”function”,也就是此时的级别的function,针对函数有效

03 conftest.py配置

上面一个案例是在同一个.py文件中,多个用例调用一个登录功能,如果有多个.py的文件都需要调用这个登陆功能的话,那就不能把登录写到用例里面去了。

此时应该要有一个配置文件,单独设计管理一些预置的操作场景,在pytest里面是默认读取conftest.py里面的配置

conftest.py配置需要注意以下点:

1.conftest.py配置脚本名称是固定的,不能改名称

2.conftest.py与运行的用例要在同一个pakage下,并且有init.py文件

3.不需要import导入 conftest.py,pytest用例会自动查找

以下分别是新建三个文件conftest.py、test_fix_0708_01.py、test_fix_0708_02.py

# coding =utf-8
# authou:shichao
# python测试社区记录#
'''
conftest.py 配置需要注意以下点:
conftest.py 配置脚本名称是固定的,丌能改名称
conftest.py 不运行的用例要在同一个 pakage 下,并且有
__init__.py 文件
不需要 import 导入 conftest.py,pytest 用例会自动查找
'''

import pytest


@pytest.fixture()
def login():
    print('输入账号,密码先登录')
# coding=utf-8

import pytest


def test_a1(login):
    print('执行测试用例1,继承login函数、前置登录后,继续下一步操作')


def test_a2():
    print('执行测试用例2,不需要登录,继续下一步操作')


def test_a3(login):
    print('执行测试用例3,继承login函数、前置登录后,,继续下一步操作')


if __name__ == '__main__':
    pytest.main(['-s', 'test_fix_0708_01.py'])
# coding=utf-8

import pytest


def test_a4(login):
    print("用例4:继承login函数、前置登录后,继续下一步操作")


def test_a5():  # 不传login
    print("用例5:不需要登录,继续下一步操作")


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

总结:单独运行test_fix1.py与test_fix2.py都能调用到login()方法,这样就能实现一些公共的操作可以单独拿出来

fixture之conftest.py本期分享到这里简单告一段落,后期再总结分享,关注小编查看更多测试好文,学到各种测试小知识点