zoukankan      html  css  js  c++  java
  • pytest文档39-参数化(parametrize)结合allure.title()生成不同标题报告

    前言

    pytest的参数化(parametrize)可以实现只需维护测试数据,就能生成不同的测试用例目的。可以在参数化的时候加 ids 参数对每个用例说明使用场景。
    最终我们希望在 allure 报告上能详细的展示出每个用例的标题描述,这样才能更直观的知道每个用例是干什么的。

    参数化parametrize

    先看一个简单的pytest参数化案例演示test_a.py

    # test_a.py
    import pytest
    import allure
    # 作者:上海-悠悠 QQ交流群:779429633
    
    
    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 参数,用于描述每个用例的运行场景。

    # 作者:上海-悠悠 QQ交流群:779429633
    @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
    # 作者:上海-悠悠 QQ交流群:779429633
    
    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
    # 作者:上海-悠悠 QQ交流群:779429633
    
    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
    

  • 相关阅读:
    centos/7/isos/x86_64 下载
    Zend Guard Run-time support missing 问题的解决
    php.ini
    PS 基础知识 .pat文件如何使用
    PS 基础知识 .atn文件如何使用
    PS 如何用制作键盘图标
    PS 如何制作WIN7的玻璃化透明窗口效果
    PS常用平面设计制作尺寸
    如何使用Medieval CUE Splitter分割ape,合并ape,制作cue
    如何将MID音乐转换成MP3
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/12853605.html
Copyright © 2011-2022 走看看