
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 支持为测试用例添加一段文字说明,解释该用例的测试场景、预期结果或业务背景。有两种实现:
- 使用 @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, "测试用例失败"
- 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