Pytest fixture实现测试用例前置&后置操作

大家好,我是杨叔。每天进步一点点,关注微信公众号【程序员杨叔】,了解更多测试开发技术知识!

一、背景

自动化测试时必然会碰到用例执行前,需要做一些前置操作,以及用例执行后,需要做一些后置操作的时候。本文主要通过:conftest.py中结合@pytest.fixture()实现用例前置、后置操作,比如:登录和退出

同时也主要想说明白以下几点:
1.什么是conftest.py?
2.什么是pytest.fixture?
3.pytest的setup和teardown也能实现用例的前置和后置操作,为什么还要用fixture呢?

二、conftest.py

介绍:pytest里面默认读取conftest.py里面的配置,conftest.py配置脚本名称是固定的,不能改名称,是单独存放的一个家居配置文件。

原则上,conftest.py与运行的用例要在同一个pakage下,并且有init.py文件,用处可以在不用的py文件中使用同一个fixture函数。

conftest.py 文件的作用:conftest.py 配置里可以实现数据共享,不需要import导入 conftest.py,pytest用例会自动查找
在这里插入图片描述

三、@pytest.fixture

介绍:fixture是pytest特有的功能,它用pytest.fixture标识,定义在函数前面。在你编写测试函数的时候,你可以将此函数名称做为传入参数,pytest将会以依赖注入方式,将该函数的返回值作为测试函数的传入参数,适合于那些许多测试用例都只需要执行一次的操作,比如登录和退出操作。主要的目的是为了提供一种可靠和可重复性的手段去运行那些最基本的测试内容。

使用:在函数声明之前加上“@pytest.fixture”。其他函数要来调用这个Fixture,只用把它当做一个输入的参数即可
在这里插入图片描述
@pytest.fixture(scope=“function”, params=None, autouse=False, ids=None, name=None)

scope:有四个级别参数 "function" (默认), "class", "module" or "session"
scope参数为session,那么所有的测试文件执行前执行一次
scope参数为module,那么每一个测试文件执行前都会执行一次
scope参数为class,那么每一个测试文件中的测试类执行前都会执行一次
scope参数为function,那么每一个测试文件中的每一个测试用例执行前都会执行一次

params:fixture可以带参数,可以把参数赋值给params,默认是None。对于param里面的每个值,fixture都会去调用执行一次,就像执行for循环一样把params里的值遍历一次
在这里插入图片描述

autouse: 默认值为False,只有方法调用了fixture,才可以执行。如果设置为True,则所有测试的方法都自动执行,一般不会设置为True。

yield关键字:fixture 使用yield关键字实现后置操作。另外如果前置操作要返回值,直接在yield后面加上要返回的值即可。也就是yield既可以实现后置,又可以起到return返回值的作用
在这里插入图片描述

pytest的setup和teardown也能实现用例的前置和后置操作,为什么还要用fixture呢?

答案是fixture更灵活,可以灵活的自定义测试用例的预置条件,想用在哪里就用在哪里,不想用的地方也不会被影响到。

比如:一个py文件中,用例1需要先登录,用例2不需要登录,用例3需要先登录, 很显然这就无法用setup和teardown来实现了。而通过conftest.py和fixture,则用例1和3调用fixture,用例2不调用即可达成目的。

conftest.py代码

# 获取到登录请求返回的ticket值,@pytest.fixture装饰后,testcase文件中直接使用函数名"login_ticket"即可得到ticket值
@pytest.fixture(scope="session")
def login_ticket():
    header = {
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
    }
    params = {
        "loginId": "username",
        "pwd": "password",
    }
    url = 'http://testxxxxx.xx.com/doLogin'
    logging.info('开始调用登录接口:{}'.format(url))
    res = requests.post(url, data=params, headers=header, verify=False)  # verify:忽略https的认证
    try:
        ticket = res.headers['Set-Cookie']
    except Exception as ex:
        logging.error('登录失败!接口返回:{}'.format(res.text))
        traceback.print_tb(ex)
    logging.info('登录成功,ticket值为:{}'.format(ticket))
    return ticket

#测试一下conftest.py文件和fixture的作用
@pytest.fixture(scope="session")
def login_test():
    print("运行用例前先登录!")

    # 使用yield关键字实现后置操作,如果上面的前置操作要返回值,在yield后面加上要返回的值
    # 也就是yield既可以实现后置,又可以起到return返回值的作用
    yield "runBeforeTestCase"
    print("运行用例后退出登录!")

test.py代码:

import pytest

def test1(login_test):
    print("运行test1()")
    print("测试conftest传值:{}".format(login_test))

=========================================================
以上就是本篇文章的全部内容,如果对你有帮助,

欢迎搜索关注【程序员杨叔】的微信公众号,获取更多测试开发干货内容资料,一起交流成长
在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
pytest提供了很多方便的功能来封装测试用例。下面是一些常见的封装测试用例的方法: 1. 使用装饰器:pytest可以使用装饰器来标记测试用例,例如使用`@pytest.mark.parametrize`装饰器来参数化测试用例使用`@pytest.mark.skip`装饰器来跳过某些测试用例等。 ```python import pytest @pytest.mark.parametrize("input, expected", [ (1, 2), (3, 6), ]) def test_multiply(input, expected): assert input * 2 == expected @pytest.mark.skip(reason="not implemented yet") def test_skip(): assert 1 + 1 == 2 ``` 2. 使用fixture:pytestfixture机制可以用来封装测试用例前置条件和后置操作测试用例可以通过参数的方式使用fixture。 ```python import pytest @pytest.fixture def setup_data(): data = [1, 2, 3] return data def test_length(setup_data): assert len(setup_data) == 3 def test_sum(setup_data): assert sum(setup_data) == 6 ``` 3. 使用conftest.py:如果多个测试模块需要共享fixture,可以将fixture定义在conftest.py文件pytest会自动搜索项目的conftest.py文件,并加载其fixture。 ```python # conftest.py import pytest @pytest.fixture def setup_data(): data = [1, 2, 3] return data # test_module.py def test_length(setup_data): assert len(setup_data) == 3 def test_sum(setup_data): assert sum(setup_data) == 6 ``` 这些方法可以帮助你更好地封装和组织pytest测试用例。当然,pytest还提供了其他很多强大的功能,你可以根据具体的需求选择合适的方式来封装测试用例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值