Pytest之参数化

ITester软件测试小栈

共 3342字,需浏览 7分钟

 ·

2020-09-03 14:47

VOL 154

02

2020-09

今天距2021年120天

这是ITester软件测试小栈第154次推文

点击上方蓝字“ITester软件测试小栈“关注我,每周一五早上 08:30准时推送,每月不定期赠送技术书籍


微信公众号后台回复“资源测试工具包”领取测试资源,回复“微信群”一起进群打怪。


本文3090字,阅读约需8分钟






在上一篇Pytest系列文章:Pytest之自定义mark,主要介绍pytest自定义配置及用例运行实战。以下主要介绍pytest参数化讲解及实战。


熟悉unittest单元测试框架的小伙伴知道,使用ddt进行数据驱动测试,那么身为功能更加强大且更加灵活的Pytest框架怎么可能没有数据驱动的概念呢?Pytest使用@pytest.mark.parametrize装饰器来实现数据驱动测试的,也就是常说的参数化。


parametrize语法


parametrize(self,argnames, argvalues, indirect=False, ids=None, scope=None)


argnames:参数名。


argvalues参数对应值,类型必须为list。果只有一个参数,里面则是值的列表:

如:@pytest.mark.parametrize("username", ["yy", "yy2", "yy3"])。如果有多个参数,则需要用元组来存放值,一个元组对应一组参数的值,如:@pytest.mark.parametrize("name,pwd", [("yy1", "123"), ("yy2", "123"), ("yy3", "123")])。


indirect:如果设置成True,则把传进来的参数当函数执行,而不是一个参数。


ids:用例的ID,传一个字符串列表,用来标识每一个测试用例,自定义测试数据结果,增加可读性。



参数讲解


1

单个数据


import pytest
data = ["小红""小明"]
@pytest.mark.parametrize("name",data)
def test_demo(name):
    print("测试数据为{}".format(name))


运行结果为:



2

一组数据


01表嵌套字典

import pytest
data_1 = [
    {"username""admin1""password""123456"},
    {"username""admin2""password""12345678"},
]
@pytest.mark.parametrize("data", data_1)
def test_login(data):
    print("账号:{},密码:{}".format(data["username"],data["password"]))


运行结果为:


02 列表嵌套列表

import pytest
data_1 = [
    ["admin1""123456"],
    ["admin2""12345678"],
]
@pytest.mark.parametrize("username,password", data_1)
def test_login(username,password):
    print("账号:{},密码:{}".format(username, password))


运行结果为:



03 列表嵌套元组

import pytest
data_1 = [
    ("admin1""123456"),
    ("admin2""12345678"),
]
@pytest.mark.parametrize("username,password", data_1)
def test_login(username,password):
    print("账号:{},密码:{}".format(username, password))

运行结果为:




场景运用



1

装饰函数


import pytest
@pytest.mark.parametrize("username,password",[("admin01","123456"),("admin02","12345678")])
def test_demo(username,password):
    print("用户名:{},密码:{}".format(username,password))


运行结果为:




2

装饰类

import pytest
@pytest.mark.parametrize("username,password",[("admin01","123456"),("admin02","12345678")])
class TestDemo:
    def test_demo(self,username,password):
        print("用户名:{},密码:{}".format(username,password))


运行结果为:


注意:装饰测试类时,类内所有的方法必须接收测试数据,否则会报错;装饰测试函数时比较灵活,如果函数不使用数据就可以不装饰。



3

多个参数化装饰器


使用多个参数化装饰器,数据会进行交叉组合的方式传递给测试函数,进而生成n*n个测试用例(笛卡尔积)。

test_demo.py

import pytest
username = ["admin1""admin2""admin3"]
password = ["123456""1234567""12345678"]
@pytest.mark.parametrize("uname",username)
@pytest.mark.parametrize("pwd",password)
def test_demo(uname,pwd):
    print("用户名:{},密码:{}".format(uname, pwd))


运行结果如下:



4

增加可读性


parametrize参数中的ids,可以标识每一个测试用例,自定义测试数据结果的显示,增加可读性。

test_demo.py

import pytest
data_1 = [
    (123),
    (459)
]
ids = ["a:{} + b:{} = expect:{}".format(a, b, expect) for a, b, expect in data_1]
def add(a, b):
    return a + b
@pytest.mark.parametrize('a, b, expect', data_1, ids=ids)
def test_parametrize_1(a, b, expect):
    print('\n测试函数1测试数据为\n{}-{}'.format(a, b))
    assert add(a, b) == expect


命令行输入:pytest -v




以上

That‘s all
更多系列文章
敬请期待

ITester软件测试小栈
往期内容宠幸


1.Pytest之基本介绍

2.Pytest之断言


3.Pytest之fixture


4.Pytest之自定义mark

5.Pytest之收集用例及命令行参数


6.Pytest之skip、skipif、xfail


7.Python接口自动化之requests请求封装


8.Python接口自动化之pymysql数据库操作


9.Python接口自动化之logging日志


10.Python接口自动化之logging封装及实战

想获取更多最新干货内容
快来星标 置顶 关注
每周一、三、五 08:30见

<<  滑动查看下一张图片  >>


 后台 回复"资源"取干货
回复"微信群"一起打怪升级

测试交流Q群:727998947

点亮一下在看,你更好看


浏览 33
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报