感谢大家关注,帮忙分享呦,你们的阅读就是我的动力!!!
公众号:小李测试随笔
第六章 应用pytest测试框架(6.4章节-参数化)
6.4 参数化的应用
参数化是接口测试人员必须掌握的技能。在执行接口测试用例时,需要从数据库中读取所有的测试用例,但是接口测试用例需要一条条执行,这个操作就可以用参数化技术来实现
6.4.1 单个参数的参数化应用
在接口自动化测试当中,单个参数的参数化主要是将要读出的所有测试用例放在列表中,然后依次读取到每一个用例,并供函数使用,从而完成每一个用例的执行。在pytest测试框架中,单个参数的参数化语法如下:
@pytest.mark.parametrize(argnames,argvalues)
语法说明:
@pytest.mark.parametrize:pytest中的装饰器,可以实现测试用例的参数化
argnames:单个参数名
argvalues:参数值,类型为列表。列表当中可以包含字符串、元组及字典对象
1)被参数化的内容是字符串
单个参数被参数化时,如果列表中包含多个字符串对象,其参数化的过程如下
import pytest '''一个参数的参数化,username依次取列表中的字符串对象 通过test_login()函数依次打印出来''' @pytest.mark.parametrize("username",["xiaoli","xiaowang","xiaohong"]) def test_login(username): #print()函数中的f表示格式化字符串 print(f"登录成功:登录用户为{username}") if __name__ == '__main__': '''运行方式,直接在文件内执行以下命令 其中,-v参数显示命令执行过程,-s参数显示打印的信息 如不加-s参数,则print()函数打印的信息不会显示''' pytest.main(['-s','-v','【例 6-3】 列表中的对象为字符串时的参数化.py'])
运行结果
2)被参数化的内容是元组
单个参数被参数化时,如果列表当中包含多个元组对象,其参数化过程如下
import pytest '''一个参数的参数化,userid依次取出列表中的两个元组对象 通过test_login()函数依次打印出来''' @pytest.mark.parametrize("userid",[(1,2),(3,4)]) def test_login(userid): #print()函数中的f表示格式化字符串 print(f"登录成功过:登录id为{userid}") if __name__ == '__main__': '''运行方式,直接在文件内执行以下命令 其中,-v参数显示命令执行过程,-s参数显示打印的信息 如不加-s参数,则print()函数打印的信息不会显示''' pytest.main(['-s','-v','【例 6-4】 列表中的对象为元组时的参数化.py'])
结果如下
3)被参数化的内容是字典
单个参数被参数化时,如果列表当中包含多个字典对象,器参数化过程如下
import pytest '''一个参数的参数化,register依次会取列表中的两个字典对象 通过test_register()函数依次打印出来''' @pytest.mark.parametrize("register",[{'name':'zhangsan'},{'password':123456}]) def test_register(register): # print()函数中的f表示格式化字符串 print(f":注册成功:注册信息为{register}") if __name__ == '__main__': '''运行方式,直接在文件内执行以下命令 其中,-v参数显示命令执行过程,-s参数显示打印的信息 如不加-s参数,则print()函数打印的信息不会显示''' pytest.main(['-s', '-v', '【例 6-5】 列表中的对象为字典时的参数化.py'])
运行结果
6.4.2 多个参数的参数化应用
在接口自动化测试中,随着测试的不断深入,接口测试用例中所包含的请求地址、请求头、请求的数据类型、请求的主体内容等均可以使用参数化,同时测试环境及相关配置也可以使用参数化。当测试用例及其他测试环境使用多个参数的参数化时,可以让程序的运行、维护变得更加高效和灵活。在语法使用方面,多个参数的参数化与单个参数的参数化并无太多区别,只是参数个数多了一些而已。
在pytest测试框架中,多个参数的参数化语法如下
@pytest.mark.parametrize(argnames001,argvalues)
@pytest.mark.parametrize(argnames002,argvalues)
或者
@pytest.mark.parametrize(argnames001,argnames002,argnames)
说明:
@pytest.mark.parametrize:pytest中的装饰器,可以实现测试用例的参数化
argnames001:第一个参数名
argnames002:第二个参数名
argvalues:参数值,类型为列表。列表当中可以包含字符串、元组及字典对象
1)被参数化的内容是字符串
import pytest '''多个参数的参数化,且列表中的对象为字符串类型 参数化顺序,username取"xiaoli"时,password取"test1234" username取"xiaowang"时,password取"test1234" username取"xiaohong"时,password取"test1234" username再一次取"xiaoli"时,password取"test5678" 依次类推''' @pytest.mark.parametrize("username",["xiaoli","xiaowang","xiaohong"]) @pytest.mark.parametrize("password",["test1234","test5678","test9876"]) def test_register(username,password): #将会打印出9组数据 print(f"登录成功:用户名为{username},密码为{password}") if __name__ == '__main__': '''运行方式,直接在文件内执行以下命令 其中,-v参数显示命令执行过程,-s参数显示打印的信息 如不加-s参数,则print()函数打印的信息不会显示''' pytest.main(['-s','-v','【例 6-6】 列表中的对象为字符串时的参数化.py'])
结果
说明:通过结果可以看到,参数username、password不是同步取值,而是交替取值!!!
2)被参数的内容是元组
import pytest '''多个参数的参数化,列表的对象为元组 参数化顺序为usernam和password同步取值
'''
@pytest.mark.parametrize("username,password",[("hua","test1"),("liu","test2")])
def test_register(username,password):
#将会打印出2组数据
print(f"登录成功:用户名为{username},密码为{password}")
if __name__ == '__main__':
'''运行方式,直接在文件内执行以下命令
其中,-v参数显示命令执行过程,-s参数显示打印的信息
如不加-s参数,则print()函数打印的信息不会显示'''
pytest.main(['-s','-v','【例 6-7】 列表中的对象为元组时的参数化.py'])
运行结果
说明:可以看到是同步取值
END