pytest-参数化与fixture

pytest身为强大的测试单元测试框架,那么同样支持DDT数据驱动测试的概念。也就是当对一个测试函数进行测试时,通常会给函数传递多组参数。比如测试账号登陆,我们需要模拟各种千奇百怪的账号密码。

当然,我们可以把这些参数写在测试函数内部进行遍历。不过虽然参数众多,但仍然是一个测试,当某组参数导致断言失败,测试也就终止了。

通过异常捕获,我们可以保证程所有参数完整执行,但要分析测试结果就需要做不少额外的工作。

在 pytest 中,我们有更好的解决方法,就是参数化测试,即每组参数都独立执行一次测试。使用的工具就是 pytest.mark.parametrize(argnames, argvalues)

  • argnames表示参数名。
  • argvalues表示列表形式的参数值。

使用就是以装饰器的形式使用。
示例:

import pytest

phone = [10086, 10010, 110]  # 可以是列表 元祖,字典 集合
code = ['xxx', 'ooo', 'zzz']
'''
[[10086, xxx], [10010, ooo], ...]
'''

@pytest.mark.parametrize("phone_item,code", list(zip(phone, code)))
def test_phone(phone_item,code):
    print(phone_item,code)
    assert code

注意:

@pytest.mark.parametrize("phone_item,code", list(zip(phone, code)))第一个参数必须是字符串,字符中的多个参数以隔开,在函数中,形参必须一一对应,并且名字也要一样,具体参考上例。

固件fixture

测试夹具,类似于setup

import pytest

@pytest.fixture()
def login():  # login: 固件
    print('登录函数')

def test_index(login):  # 访问主页前需要登录
    print('主页')
    assert 1

相对于setup和teardown来说,固件的名字比较灵活。

import pytest

@pytest.fixture()
def db():
    print('Connection successful')

    yield

    print('Connection closed')


def search_user(user_id):
    d = {
        '001': 'xiaoming',
        '002': 'xiaohua'
    }
    return d[user_id]

def test_case_01(db):
    assert search_user('001') == 'xiaoming'
#
def test_case_02(db):
    assert search_user('002') == 'xiaohua'

  • 每个用例执行之前,调用db,yield之前
  • 每个用例执行之后,调用db,yield之后
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从年底换工作就没怎么写学习笔记了,期间在公司边学边用了 Android Python 过年在家看了iOS,还是b站...
    勇者与王者阅读 3,701评论 0 0
  • 引言 如果你想快速上手pytest,只关注"Pytest必会知识点"章节就可以了(该章节已经能够解决基础的ui和接...
    测试开发Kevin阅读 5,539评论 0 15
  • 目录: 安装及入门 使用和调用方法 原有TestSuite使用方法 断言的编写和报告 Pytest fixture...
    韩志超阅读 6,006评论 0 2
  • 本文参考了官方文档和一些乐于分享的大佬的博客,结合自己的理解完成。学习pytest框架的小白,需要按照教程自己敲一...
    成都_阿木木阅读 14,816评论 1 5
  • 推荐指数: 6.0 书籍主旨关键词:特权、焦点、注意力、语言联想、情景联想 观点: 1.统计学现在叫数据分析,社会...
    Jenaral阅读 10,997评论 0 5