pytest+allure

一、pytest装饰器

参数化测试用例

@pytest.mark.parametrize

import pytest
 
# 定义测试函数
def test_example(param1, param2):
    print(f"Testing with param1: {param1} and param2: {param2}")
    assert param1 + param2 > 0
 
# 使用@pytest.mark.parametrize装饰器传入参数,这样是三个case,用例会执行3遍
@pytest.mark.parametrize("param1,param2", [(1, 2), (3, -2), (-5, 5)])
def test_multiple_params(param1, param2):
    print(f"Testing with param1: {param1} and param2: {param2}")
    assert param1 + param2 > 0


# 多个参数话,每个input都和output中的数据组成一个测试用例,例子中一共有6个用例
@pytest.mark.parametrize('input', [1, 2, 3])
@pytest.mark.parametrize("output, expected", [
    (4, 5),
    (6, 7)
])
def test_square(input, output, expected):

 pytest.param参数化标识

在参数化测试中,每个测试用例可能包含多组参数,可能会产生大量的测试结果。为了更好地理解和调试测试结果,给每个参数化测试用例指定一个易于理解的标识是很有意义的。而 pytest.param 函数的 id 参数就能做到这一点。


import pytest
​
@pytest.mark.parametrize(
    "input, expected", 
    [
        pytest.param(2, 4, id="用例1"),
        pytest.param(3, 9, id="用例2"),
        pytest.param(5, 25, id="用例3")
    ]
)

def test_multiply(input, expected):

# 运行用例时,会出现id展示的unicode编码,非中文,需使用 pytest_collection_modifyitems 钩子函数,对输出的 item.name 和 item.nodeid 重新编码。
# 原因是Pytest默认将IDs视为ASCII字符串,并在测试报告中按原样显示。由于中文字符不属于ASCII字符范围,因此Pytest会将其转换为Unicode编码表示。


# conftest.py 
def pytest_collection_modifyitems(items):
    """
    测试用例收集完成时,将收集到的item的name和nodeid的中文显示在控制台上
    """
    for item in items:
        item.name = item.name.encode("utf-8").decode("unicode_escape")
        item._nodeid = item.nodeid.encode("utf-8").decode("unicode_escape")

参数化-传入字典数据

# test_data.py
def get_request_param():
    return (
        {
            'param1': '1',
            'param2': '2'
        },
        {
            'param1': '3',
            'param2': '4'
        }
    )

@pytest.mark.parametrize("dict", get_request_param(), ids=['case1', 'case2'])
def test_case(dict):
    some_code(dict['param1'], dict['param2'])

二、allure装饰器

@allure.title

import allure

# 添加用例的描述,使得在报告中很清楚看到执行了哪个场景
@allure.title("这是一个case")
def test_case()

 @allure.title与@pytest.mark.parametrize:

当没有加allure.title()时候,用例的描述就是 ids 用例的名称,
如果加了allure.title(),那么用例的描述就是添加的ids 用例的名称值,这两个地方取其中的一个。

三、函数

pytest.main

用于控制测试的运行方式和输

import pytest

# -s:用于显示程序中的print/logging输出,即在测试执行过程中显示任何通过print或logging产生的输出。
# -v:启用详细模式,输出更详细的用例执行信息,提供更丰富的测试结果反馈。
# -k:允许通过逻辑运算符(如and、not、or)匹配范围(如文件名、类名、函数名),执行用例名称中包含某字符段的测试。
if __name__ == '__main__':
    pytest.main(['-s', '-v', '-k' 'test_cases02']) # 匹配目录名、模块名、类名、用例名,包含test_cases02的用例

    pytest.main() # 运行所有用例,以test_开始或_test结尾的py

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值