目录:导读
- 前言
 - 一、Python编程入门到精通
 - 二、接口自动化项目实战
 - 三、Web自动化项目实战
 - 四、App自动化项目实战
 - 五、一线大厂简历
 - 六、测试开发DevOps体系
 - 七、常用自动化测试工具
 - 八、JMeter性能测试
 - 九、总结(尾部小惊喜)
 
前言
pytest的参数化(parametrize)可以实现只需维护测试数据,就能生成不同的测试用例目的。可以在参数化的时候加 ids 参数对每个用例说明使用场景。
最终我们希望在 allure 报告上能详细的展示出每个用例的标题描述,这样才能更直观的知道每个用例是干什么的。
参数化 parametrize
先看一个简单的pytest参数化案例演示test_a.py
# test_a.py
import pytest
import allure
def login(username, password):
    '''登录'''
    print("输入账号:%s" % username)
    print("输入密码:%s" % password)
    # 返回
    return {"code": 0, "msg": "success!"}
# 测试数据
test_datas = [
    ({"username": "yoyo1", "password": "123456"}, "success!"),
    ({"username": "yoyo2", "password": "123456"}, "failed!"),
    ({"username": "yoyo3", "password": "123456"}, "success!"),
]
@allure.story("登录用例")
@pytest.mark.parametrize("test_input,expected",
                         test_datas
                         )
def test_login(test_input, expected):
    '''测试登录用例'''
    # 获取函数返回结果
    result = login(test_input["username"], test_input["password"])
    # 断言
    assert result["msg"] == expected
 
cmd命令行运行用例
> pytest --alluredir ./report test_a.py
> allure serve ./report
 
生成报告

这样生成的报告在用例列表里面并不能很友好的展示出每个用例的执行场景,只知道哪个用例报错了。
于是需要对每个用例加上描述,加一个 ids 参数
ids 参数使用
在上面用例部分代码里面加个 ids 参数,用于描述每个用例的运行场景。
@allure.story("登录用例")
@pytest.mark.parametrize("test_input,expected",
                         test_datas,
                         ids=[
                             "输入正确账号,密码,登录成功",
                             "输入错误账号,密码,登录失败",
                             "输入正确账号,密码,登录成功",
                         ]
                         )
def test_login(test_input, expected):
    '''测试登录用例'''
    # 获取函数返回结果
    result = login(test_input["username"], test_input["password"])
    # 断言
    assert result["msg"] == expected
 
cmd命令行运行用例
> pytest --alluredir ./report test_a.py
> allure serve ./report
 
生成报告

allure.title描述用例
上面是通过在 parametrize 里面添加 ids 参数解决,接下来再讲一个用 allure.title(“用例描述”) 添加用例描述的方式解决。
使用 @allure.title(“用例描述”) 时,可以加上传入的参数,如传入的参数 “test_input,expected” ,需拼接test_input参数的值,可以这样写
@allure.title(“用例描述,测试输入:{test_input}”)
在 allure_pytest/utils.py 源码里面可以找到对应的代码
# allure_pytest/utils.py
def allure_name(item, parameters):
    name = escape_name(item.name)
    title = allure_title(item)
    return title.format(**parameters) if title else name
 
当没有加allure.title()时候,用例的描述就是 item.name 值(也就是上面的 ids 用例的名称),
 如果加了allure.title(),那么用例的描述就是添加的title值,这两个地方取其中的一个。
import pytest
import allure
def login(username, password):
    '''登录'''
    print("输入账号:%s" % username)
    print("输入密码:%s" % password)
    # 返回
    return {"code": 0, "msg": "success!"}
# 测试数据
test_datas = [
    ({"username": "yoyo1", "password": "123456"}, "success!"),
    ({"username": "yoyo2", "password": "123456"}, "failed!"),
    ({"username": "yoyo3", "password": "123456"}, "success!"),
]
@allure.story("登录用例")
@allure.title("用例描述,测试输入:{test_input}")
@pytest.mark.parametrize("test_input,expected",
                         test_datas,
                         ids=[
                             "输入正确账号,密码,登录成功",
                             "输入错误账号,密码,登录失败",
                             "输入正确账号,密码,登录成功",
                         ]
                         )
def test_login(test_input, expected):
    '''测试登录用例'''
    # 获取函数返回结果
    result = login(test_input["username"], test_input["password"])
    # 断言
    assert result["msg"] == expected
 
cmd命令行运行用例
> pytest --alluredir ./report test_a.py
> allure serve ./report
 
生成报告

优化用例title
结合上面两种实现方式,把用例描述当成一个测试输入的参数,继续优化后如下
 需注意的是 parametrize 里面三个参数 test_input,expected,title 跟 test_login(test_input, expected, title) 里面三个参数保持一致
import pytest
import allure
def login(username, password):
    '''登录'''
    print("输入账号:%s" % username)
    print("输入密码:%s" % password)
    # 返回
    return {"code": 0, "msg": "success!"}
# 测试数据
test_datas = [
    ({"username": "yoyo1", "password": "123456"}, "success!", "输入正确账号,密码,登录成功"),
    ({"username": "yoyo2", "password": "123456"}, "failed!", "输入错误账号,密码,登录失败"),
    ({"username": "yoyo3", "password": "123456"}, "success!", "输入正确账号,密码,登录成功"),
]
@allure.story("登录用例")
@allure.title("{title}")
@pytest.mark.parametrize("test_input,expected,title",
                         test_datas
                         )
def test_login(test_input, expected, title):
    '''测试登录用例'''
    # 获取函数返回结果
    result = login(test_input["username"], test_input["password"])
    # 断言
    assert result["msg"] == expected
 

| 下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 | 
一、Python编程入门到精通

二、接口自动化项目实战

三、Web自动化项目实战

四、App自动化项目实战

五、一线大厂简历

六、测试开发DevOps体系

七、常用自动化测试工具

八、JMeter性能测试

九、总结(尾部小惊喜)
只有经历过磨难的人,才能品味到成功的甜蜜;只有奋斗不息的人,才能迎来辉煌的明天。无论前方有多少风雨,记住一切困难都是成长的催化剂,坚持向前,你将成为自己生命中最伟大的英雄!
只有在磨砺中才能砥砺前行,唯有坚持奋斗才能绽放辉煌,不要畏惧困难与挑战,无论何时都要相信自己的潜力与能力,勇往直前,追逐属于你的辉煌人生!
只有付出努力,才能创造属于自己的辉煌;只有坚持奋斗,才能迈向更高的人生巅峰;只有勇敢面对困难,才能收获真正的成功。相信自己,不停追求梦想,你一定能够成就非凡!

















