前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pytest(七) pytest之参数化

Pytest(七) pytest之参数化

作者头像
雷子
发布2022-04-06 08:34:36
1K0
发布2022-04-06 08:34:36
举报
文章被收录于专栏:雷子说测试开发

系列分享

Pytest系列(一)初次了解

Pytest(二)执行规则以及编写执行多条用例

Pytest(三)Pytest执行命令

Pytest(四)Pytest断言

Pytest(五)标记函数

Pytest(六)跳过测试


在unittest测试中,我们有参数化的概念,那么在pytest中也有。

如何理解参数化:

当对一个测试函数进行测试时,通常会给函数传递多组参数。比如测试账号登陆,我们需要模拟各种千奇百怪的账号密码。可以把这些参数写在测试函数内部进行遍历。不过虽然参数众多,但仍然是一个测试,当某组参数导致断言失败。我们想要的是一个的失败不影响其他的失败。通过参数化的方式来管理组织。那么我们看下pytest如何实现参数化的。

代码语言:javascript
复制
pytest.mark.parametrize(argnames, argvalues)

我们看下如何使用呢,我们假设要测试密码的长度必须大于8位且小于16位。设计了几个密码

代码语言:javascript
复制
['123','12345678','1234567890123456','12345678901234561']

我们看下如何使用

代码语言:javascript
复制
import pytest
@pytest.mark.parametrize('passwd',
                      ['123','12345678','1234567890123456','12345678901234561'])
def test_passwd_length(passwd):
    assert len(passwd) >= 8
    assert len(passwd)<=16
    

正常应该执行四个测试用例,我们看下

失败用例:

符合我们预期,可以看到用参数化的思路可以减少代码编写。

如果我们要验证用户名和密码呢,两个参数如何实现呢。

代码语言:javascript
复制
import pytest
@pytest.mark.parametrize('user,passwd',
                      [('leizi','123'),('leizi','12345678'),('lei','1234567890123456'),('leizishuoceshikaifa','12345678901234561')])
def test_passwd_length(user,passwd):
    assert len(passwd) >= 8
    assert len(passwd)<=16
    assert  user=='leizi'

执行结果

在执行可以用-v看到更加详细写信息

当然还可以给每组参数增加id

代码语言:javascript
复制
import pytest
@pytest.mark.parametrize('user,passwd',
                      [pytest.param('leizi','123',id='User:leizi'),
                       pytest.param('leizi','12345678',id='User:leizi'),
                       pytest.param('lei','1234567890123456',id='User:lei'),
                       pytest.param('leizishuoceshikaifa','12345678901234561',id='User:leizishuoceshikaifa')])
def test_passwd_length(user,passwd):
    assert len(passwd) >= 8
    assert len(passwd)<=16
    assert  user=='leizi'

执行结果为:

上面的都是写固定的,但是,实际的工作中呢,很多时候的参数都是实时读取的。这些参数数据都是动态读取来的,那么看下如何给参数动态传递呢,这里获取数据,写了一个demo。

代码语言:javascript
复制
import pytest

def getparame()->list:
    '''
    返回用例如有入参
    :return:
    '''
    return [('leizi','123'),('leizi','12345678'),('lei','1234567890123456'),('leizishuoceshikaifa','12345678901234561')]

@pytest.mark.parametrize('user,passwd',
                      getparame())
def test_passwd_length(user,passwd):
    assert len(passwd) >= 8
    assert len(passwd)<=16
    assert  user=='leizi'

执行下

用例可以正常执行

这样就可以把我们的参数完全放到Excel等,然后读取即可。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雷子说测试开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档