Allure 插件不仅收集 pytest 标准功能提供的测试结果数据,还提供附加功能对测试结果数据进行改进。

多层分类结构

可以一起使用 @allure.epic 、@allure.feature 、 @allure.story 和 @allure.title ,形成多级分类结构。epic 是最高层级,其次 feature ,再次之是 story ,最后是 title。

层级怎么对应呢?先假设一个场景:系统中包括用户管理、订单管理、售后管理等模块。

使用 epic 对应用户管理模块;使用 feature 对应用户注册;使用 story 对应邮箱注册或手机号注册;使用 title 对应具体测试用例。

在代码中使用非常简单:

import allure

@allure.epic("用户管理模块")
@allure.feature("用户注册")
@allure.story("用户邮箱注册")
@allure.title("邮箱注册成功")
def test_user_email_registration_successful():
    assert True, "测试用例通过"


@allure.epic("用户管理模块")
@allure.feature("用户注册")
@allure.story("用户邮箱注册")
@allure.title("邮箱注册失败-格式错误")
def test_user_email_registration_failed():
    assert False, "测试用例失败"


@allure.epic("用户管理模块")
@allure.feature("用户注册")
@allure.story("用户手机注册")
@allure.title("手机注册成功")
def test_user_phone_number_registered_successfully():
    assert True, "测试用例通过"


@allure.epic("用户管理模块")
@allure.feature("用户注册")
@allure.story("用户手机注册")
@allure.title("手机注册失败-格式错误")
def test_user_phone_number_registration_failed():
    assert False, "测试用例失败"

生成的测试报告如下:

添加描述信息

Allure 支持为测试用例添加一段文字说明,解释该用例的测试场景、预期结果或业务背景。有两种实现:

  1. 使用 @allure.description 添加描述信息,不仅支持文本格式,还支持 html 格式
import allure

@allure.epic("用户管理模块")
@allure.feature("用户注册")
@allure.story("用户手机注册")
@allure.title("手机注册成功")
@allure.description("昵称格式符合....,密码格式符合......,手机号格式符合......。预期注册成功。")
def test_user_phone_number_registered_successfully():
    assert True, "测试用例通过"


@allure.epic("用户管理模块")
@allure.feature("用户注册")
@allure.story("用户手机注册")
@allure.title("手机注册失败-手机号格式错误-01")
@allure.description("昵称格式不符合....,密码格式不符合......,手机号格式符合01代码错误。预期注册失败。")
def test_user_phone_number_registration_failed():
    assert False, "测试用例失败"
  1. allure-pytest 支持函数注释作为描述信息
import allure

@allure.epic("用户管理模块")
@allure.feature("用户注册")
@allure.story("用户手机注册")
@allure.title("手机注册成功")

def test_user_phone_number_registered_successfully():
    """
    昵称格式符合....,密码格式符合......,手机号格式符合......。预期注册成功。
    """
    assert True, "测试用例通过"


@allure.epic("用户管理模块")
@allure.feature("用户注册")
@allure.story("用户手机注册")
@allure.title("手机注册失败-手机号格式错误-01")
def test_user_phone_number_registration_failed():
    """
    昵称格式不符合....,密码格式不符合......,手机号格式符合01代码错误。预期注册失败。
    """
    assert False, "测试用例失败"

生成的测试报告如下:

添加标签

可以使用 @allure.tag 给测试用例添加标签(可以添加多个),可以配合 pytest 的 mark 一起使用。

import allure
import pytest


@allure.epic("用户管理模块")
@allure.feature("用户注册")
@allure.story("用户邮箱注册")
@allure.title("邮箱注册成功")
@pytest.mark.smoke
@allure.tag("冒烟测试")
def test_user_email_registration_successful():
    assert True, "测试用例通过"


@allure.epic("用户管理模块")
@allure.feature("用户注册")
@allure.story("用户邮箱注册")
@allure.title("邮箱注册失败-格式错误")
def test_user_email_registration_failed():
    assert False, "测试用例失败"


@allure.epic("用户管理模块")
@allure.feature("用户注册")
@allure.story("用户手机注册")
@allure.title("手机注册成功")
@pytest.mark.smoke
@allure.tag("冒烟测试")
def test_user_phone_number_registered_successfully():
    assert True, "测试用例通过"


@allure.epic("用户管理模块")
@allure.feature("用户注册")
@allure.story("用户手机注册")
@allure.title("手机注册失败-格式错误")
def test_user_phone_number_registration_failed():
    assert False, "测试用例失败"

生成的测试报告如下:

添加相关链接地址

Allure 支持使用 @allure.testcase 添加测试用例管理系统中测试用例链接地址,使用 @allure.lssue 添加缺陷管理系统中的 BUG 链接地址,使用 @allure.link 添加任意链接地址。

import allure

@allure.testcase("http://example.com/test_user_email_registration_successful", "测试用例1")
@allure.issue("http://example.com/issue_tracker/1", "问题追踪1")
@allure.link("http://example.com/test", "相关链接地址")
def test_user_email_registration_successful():
    assert True, "测试用例通过"

生成的测试报告如下:

添加用例等级

使用 @allure.severity 可以为测试用例添加等级,由高到低分为 blocker、critical、normal、minor、trivial 五级。

import allure

@allure.severity(allure.severity_level.BLOCKER)
def test_blocker():

    assert  True


@allure.severity(allure.severity_level.CRITICAL)
def test_critical():
    assert True

@allure.severity(allure.severity_level.NORMAL)
def test_normal():
    assert True

@allure.severity(allure.severity_level.MINOR)
def test_minor():
    assert True

@allure.severity(allure.severity_level.TRIVIAL)
def test_trivial():
    assert True

生成的测试报告如下:

添加测试步骤

Allure 支持标记测试用例调用的相关函数为步骤,当测试失败时,Allure 报告会明确指出在哪个步骤失败。

import allure

@allure.step("登录")
def login():
    pass


@allure.step("查询书籍")
def search_for_books():
    pass

@allure.step("下单书籍")
def order_books():
    raise Exception("下单失败")

@allure.step("付款")
def payment():
    pass
def test_case():
    login()
    search_for_books()
    order_books()
    payment()
    assert True

另外需要说明,allure-pytest 支持夹具函数作为前置:

import pytest


@pytest.fixture
def login():
    pass


@pytest.fixture
def search_for_books():
    pass


@pytest.fixture
def order_books():
    raise Exception("下单失败")

@pytest.fixture
def payment():
    pass

def test_case(login, search_for_books, order_books, payment):
    assert True

添加附件

Allure 支持两种方式添加附件:

  • allure.attach(body, name=None, attachment_type="text/plain", extension="attach")

    allure.attach() 的参数中,要求 body 的值必须是 bytes或str 类型,name 为此附件的名称(可作附件说明),attachment_type 指定数据的类型 ,extension 不必理会

  • allure.attach.file(source, name=None, attachment_type=None, extension=None)

    allure.attach.file() 的参数中,source 指定文件的路径,name 为此附件的名称(可作附件说明),attachment_type 指定数据的类型,extension 不必理会。

Allure 提供了预定义的类型枚举,用于正确渲染附件:

  • allure.attachment_type.TEXT 纯文本
  • allure.attachment_type.PNG PNG图片
  • allure.attachment_type.JPG JPG图片
  • allure.attachment_type.JSON JSON数据
  • allure.attachment_type.XML XML数据
  • allure.attachment_type.HTML HTML页面快照
  • allure.attachment_type.CSV CSV文件数据
  • allure.attachment_type.MP4 MP4视频文件
import allure

def test_text():
    allure.attach(
        body="这是 test_login 的文本附件",
        name="文本附件说明",
        attachment_type=allure.attachment_type.TEXT
    )
    assert True, "登录失败"


def test_files():
    allure.attach.file(
        source="allure.jpg",  # app.py的相对路径
        name="文件附件说明",
        attachment_type=allure.attachment_type.PNG
    )
    assert True, "登录失败"

运行结果:

动态使用附加功能

附加功能还都可以在函数(测试用例)中使用,如下:

import allure

def test_text():
    allure.dynamic.epic("Epic")
    allure.dynamic.feature("Feature")
    allure.dynamic.story("Story")
    allure.dynamic.title("Title")
    allure.dynamic.description("Description")
    allure.dynamic.tag("Tag")
    allure.dynamic.severity(allure.severity_level.CRITICAL)
    allure.dynamic.link("https://github.com/allure-framework/allure-python")
    allure.dynamic.issue("https://github.com/allure-framework/allure-python/issues/1")
    allure.dynamic.testcase("https://github.com/allure-framework/allure-python/issues/2")
    with allure.step("Step 2"):
        pass

参数化中使用

Allure 的附加功能可以应用于参数化测试中,比如:

import allure
import pytest

# 定义测试数据
test_data = [
    ("登录功能", "登录账号 - 正确密码", "admin", "123456"),
    ("登录功能", "登录账号 - 错误密码", "admin", "wrongpassword"),
    ("登录功能", "登录账号 - 错误账号", "adminerror", "123456"),
    ("登录功能", "登录账号 - 空密码", "admin", "")
]


# 参数化测试
@pytest.mark.parametrize("story, title, user_name, password", test_data)
def test_login(story, title, user_name, password):
    allure.dynamic.story(story)
    allure.dynamic.title(title)
    allure.dynamic.description(f"用户名: {user_name}, 密码: {password}")
    assert True , "登录失败"

PS: 还有一些用法我没有提及,这部分可以参考Allure 官方文档


THEEND



© 转载需要保留原始链接,未经明确许可,禁止商业使用。CC BY-NC-ND 4.0