洛阳网站建设哪家便宜,公司可以备案几个网站,wordpress密文,南阳做个网站多少钱目录#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结#xff08;尾部小惊喜#xff09; 前言
参数化#xff1… 目录导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结尾部小惊喜 前言
参数化 通俗点理解就是定义一个测试类或测试函数可以传入不同测试用例对应的参数从而执行多个测试用例。
例如 对登录接口进行测试假设有3条用例正确账号正确密码登录、正确账号错误密码登录、错误账号正确密码登录那么我们只需要定义一个登陆测试函数test_login()然后使用这3条用例对应的参数去调用test_login()即可。
在unittest中可以使用ddt进行参数化而pytest中也提供非常方便的参数化方式即使用装饰器pytest.mark.parametrize()。
一般写为pytest.mark.parametrize(“argnames”, argvalues)。 其中 argnames为参数名称可以是单个或多个多个写法为argname1, argname2, … argvalues为参数值类型必须为list单个参数时可以为元组多个参数时必须为list所以最好统一
例如有下接口 请求的登陆接口信息
接口urlhttp://127.0.0.1:5000/login
请求方式post
请求参数
响应信息1、单个参数
只需要传入一个参数时示例如下
# 待测试函数
def sum(a):return a1# 单个参数
data [1, 2, 3, 4]
pytest.mark.parametrize(item, data)
def test_add(item):actual sum(item)print(\n{}.format(actual))# assert actual 3if __name__ __main__:pytest.main()注意 pytest.mark.parametrize()中的第一个参数必须以字符串的形式来标识测试函数的入参如上述示例中定义的测试函数test_login()中传入的参数名为item那么pytest.mark.parametrize()的第一个参数则为item。
运行结果如下
rootdir: E:\blog\python接口自动化\apiAutoTest, configfile: pytest.ini
plugins: html-2.1.1, metadata-1.10.0, ordering-0.6, rerunfailures-9.1.1
collecting ... collected 4 itemstest_case_2.py::test_add[1] PASSED [ 25%]
2test_case_2.py::test_add[2] PASSED [ 50%]
3test_case_2.py::test_add[3] PASSED [ 75%]
4test_case_2.py::test_add[4] PASSED [100%]
5 4 passed in 0.02s 从结果可以看到测试函数分别传入了data中的参数总共执行了5次。
2、多个参数
测试用例需传入多个参数时pytest.mark.parametrize() 的第一个参数同样是字符串 对应用例的多个参数用逗号分隔。
示例
import pytest
import requests
import json# 列表嵌套元组
data [(lilei, 123456), (hanmeimei, 888888)]
# 列表嵌套列表
# data [[lilei, 123456], [hanmeimei, 888888]]pytest.mark.parametrize(username, password, data)
def test_login(username, password):headers {Content-Type: application/json;charsetutf8}url http://127.0.0.1:5000/login_data {username: username,password: password}res requests.post(urlurl, headersheaders, json_data).textres json.loads(res)assert res[code] 1000if __name__ __main__:pytest.main()需要注意 代码中data的格式可以是列表嵌套列表也可以是列表嵌套元组列表中的每个列表或元组代表一组独立的请求参数。 username, password不能写成 “username”, “password”。
运行结果如下 从结果中我们还可以看到每次执行传入的参数如下划线所示部分。
这里所举示例是2个参数传入3个或更多参数时写法也同样如此一定要注意它们之间一一对应的关系如下图 3、对测试类参数化
上面所举示例都是对测试函数进行参数化那么对测试类怎么进行参数化呢
其实对测试类的参数化就是对测试类中的测试方法进行参数化。
pytest.mark.parametrize()中标识的参数个数必须与类中的测试方法的参数一致。示例如下
# 将登陆接口请求单独进行了封装仅仅只是为了方便下面的示例
def login(username, password):headers {Content-Type: application/json;charsetutf8}url http://127.0.0.1:5000/login_data {username: username,password: password}res requests.post(urlurl, headersheaders, json_data).textres json.loads(res)return res# 测试类参数化
data [(lilei, 123456), (hanmeimei, 888888)
]
pytest.mark.parametrize(username, password, data)
class TestLogin:def test_login_01(self, username, password):res login(username, password)assert res[code] 1000def test_login_02(self, username, password):res login(username, password)assert res[msg] 登录成功if __name__ __main__:pytest.main([-s])运行结果如下 从结果中可以看出来总共执行了4次测试类中的每个测试方法都执行了2次即每个测试方法都将data中的每一组参数都执行了一次。
注意 这里还是要强调参数对应的关系即pytest.mark.parametrize()中的第一个参数需要与测试类下面的测试方法的参数一一对应。
4、参数组合
在编写测试用例的过程中有时候需要将参数组合进行接口请求如示例的登录接口中username有 lilei、hanmeimeipassword有 123456、888888进行组合的话有下列四种情况
{username: lilei, password: 123456}
{username: lilei, password: 888888}
{username: hanmeimei, password: 123456}
{username: hanmeimei, password: 888888}在pytest.mark.parametrize()也提供了这样的参数组合功能编写格式示例如下
import pytest
import requests
import jsonusername [lilei, hanmeimei]
password [123456, 888888]pytest.mark.parametrize(password, password)
pytest.mark.parametrize(username, username)
def test_login(username, password):headers {Content-Type: application/json;charsetutf8}url http://127.0.0.1:5000/login_data {username: username,password: password}res requests.post(urlurl, headersheaders, json_data).textres json.loads(res)assert res[code] 1000if __name__ __main__:pytest.main()运行结果如下
rootdir: E:\blog\python接口自动化\apiAutoTest, configfile: pytest.ini
plugins: html-2.1.1, metadata-1.10.0, ordering-0.6, rerunfailures-9.1.1
collecting ... collected 4 itemstest_case_5.py::test_login[lilei-123456] PASSED [ 25%]
test_case_5.py::test_login[lilei-888888] FAILED [ 50%]
test_case_5.py::test_login[hanmeimei-123456] FAILED [ 75%]
test_case_5.py::test_login[hanmeimei-888888] PASSED [100%]short test summary info
FAILED test_case_5.py::test_login[lilei-888888] - assert 1001 1000
FAILED test_case_5.py::test_login[hanmeimei-123456] - assert 1001 10002 failed, 2 passed in 0.18s 从结果可以看出来2个username、2个password 有4中组合方式总执行了4次。如果是3个username、2个password那么就有6中参数组合方式依此类推。
注意 以上这些示例中的测试用例仅仅只是用于举例实际项目中的登录接口测试脚本与测试数据会不一样。
5、增加测试结果可读性
从示例的运行结果中我们可以看到为了区分参数化的运行结果在结果中都会显示由参数组合而成的执行用例名称很方便就能看出来执行了哪些参数组合的用例。
示例 但这只是简单的展示如果参数多且复杂的话仅仅这样展示是不够清晰的需要添加一些说明才能一目了然。
因此在pytest.mark.parametrize()中有两种方式来自定义上图中划线部分的显示结果即使用pytest.mark.parametrize()提供的参数 ids 自定义或者使用pytest.param()中的参数id自定义。
ids推荐 ids使用方法示例如下
import pytest
import requests
import jsondata [(lilei, 123456), (hanmeimei, 888888)]
ids [username:{}-password:{}.format(username, password) for username, password in data]
pytest.mark.parametrize(username, password, data, idsids)
def test_login(username, password):headers {Content-Type: application/json;charsetutf8}url http://127.0.0.1:5000/login_data {username: username,password: password}res requests.post(urlurl, headersheaders, json_data).textres json.loads(res)assert res[code] 1000if __name__ __main__:pytest.main()从编写方式可以看出来ids就是一个list且它的长度与参数组合的分组数量一致。
运行结果如下 比较上面个执行结果我们能看出ids自定义执行结果与默认执行结果展示的区别。使用过程中需要根据实际情况来自定义。
id 使用方式示例如下
import pytest
import requests
import jsondata [pytest.param(lilei, 123456, idcorrect username and correct password),pytest.param(lilei, 111111, idcorrect user name and wrong password)
]pytest.mark.parametrize(username, password, data)
def test_login(username, password):headers {Content-Type: application/json;charsetutf8}url http://127.0.0.1:5000/login_data {username: username,password: password}res requests.post(urlurl, headersheaders, json_data).textres json.loads(res)assert res[code] 1000if __name__ __main__:pytest.main()运行结果如下 下面是我整理的2023年最全的软件测试工程师学习知识架构体系图
一、Python编程入门到精通 二、接口自动化项目实战 三、Web自动化项目实战 四、App自动化项目实战 五、一线大厂简历 六、测试开发DevOps体系 七、常用自动化测试工具 八、JMeter性能测试 九、总结尾部小惊喜
奋斗是一段漫长的旅程痛苦与磨难只是通往成功的试炼。不惧困难坚守信念用汗水浇灌梦想的花朵。相信自己勇往直前你将创造属于自己的辉煌留下无悔的足迹
执着的火焰燃烧内心不屈的勇气驱散黑暗。放下畏惧迎接挑战奋斗的脚步不停歇。每一次努力铸就坚韧每一次拼搏开启新篇章。勇往直前追逐梦想。
人生的舞台唯有奋斗才能谱写出绚丽的乐章。不要畏惧困难要勇敢地迎接挑战。坚持努力永不放弃相信自己的力量你将创造出意想不到的精彩人生