pytest之allure(七)之Tag标记(@allure.epic()、@allure.feature()、@allure.story()、@allure.severity())
前言
执行测试用例时,有的时候我们希望能够更加灵活的指定执行某些测试用例,pytest支持我们通过使用marker装饰器@pytest.mark来实现这个需求,而allure也同样提供了三种类似的方法来实现这个需求。
allure的三种方式:
- BDD(行为驱动开发)的风格标记:Epics、Features、Stories;
- Severity标签;
- 自定义标签;
一、BDD markers:
allure提供的两个装饰器:@allure.feature和@allure.story,可以将我们的用例根据Feature和Story分类,通过将name使用epic_ 开头的前缀就能够指定Feature和Story属于哪一个epic。
举例:
# file_name: test_allure_tag_BDD.py import pytest import allure def test_without_any_annotations_that_wont_be_executed(): """ 没有任何注解 :return: """ pass @allure.story('epic_1') def test_with_epic_1(): """ 通过指定name为epic_前缀的方式来指定story属于哪一个epic :return: """ pass @allure.story('story_1') def test_with_story_1(): """ 指定该测试用例属于的story :return: """ pass @allure.story('story_2') def test_with_story_2(): """ 指定该测试用例属于的story :return: """ pass @allure.feature('feature_2') @allure.story('story_2') def test_with_story_2_and_feature_2(): """ 指定该测试用例属于的feature和story :return: """ pass if __name__ == '__main__': pytest.main(['-s', 'test_allure_tag_BDD.py'])
可以通过下面命令行选项来指定想要执行的测试用例集,如果命令行选项的值有多个就用逗号分隔:
- --allure-epics
- --allure-features
- --allure-stories
比如:
1、下面截图中,通过指定--allure-stories为story_1、story_2来指定运行用例,结果中可以看到我们只执行了用例属于story_1和story_2的测试用例。
2、下面截图中,指定--allure-features为feature_2,--allure-stories为story_2,运行结果中能看到只运行了用例属于feature_2和story_2的测试用例。
二、Severity markers:
使用@allure.severity来标识测试用例的严重等级;
严重等级是allure.severity_level枚举中的一个。【severity_level是一个单独的类,用例等级是该类的属性参数】
severity装饰器可以用在函数、方法和类上面。
通过使用--allure-severities 命令行选项指定运行哪些测试用例,如果命令行选项的值有多个就用逗号分隔。
用例等级:
allure划分用例等级为5个:
- blocker:阻塞缺陷(功能未实现,无法下一步)
- critical:严重缺陷(功能点缺失)
- normal:一般缺陷(边界情况,格式错误)
- minor:次要缺陷(界面错误与ui需求不符)
- trivial:轻微缺陷(必须项无提示,或者提示不规范)
举例:
file_name: test_allure_tag_severity.py import pytest import allure def test_with_no_severity_label(): """ 不定义任何severity标签 :return: """ pass @allure.severity(allure.severity_level.TRIVIAL) def test_with_trivial_severity(): """ 定义severity标签为TRIVIAL :return: """ pass @allure.severity(allure.severity_level.NORMAL) def test_with_normal_severity(): """ 定义severity标签为NORMAL :return: """ pass @allure.severity(allure.severity_level.NORMAL) class TestClassWithNormalSeverity(object): """ 定义类的severity标签为NORMAL """ def test_inside_the_normal_severity_test_class(self): pass @allure.severity(allure.severity_level.CRITICAL) def test_inside_the_normal_severity_test_class_with_overriding_critical_severity(self): pass if __name__ == '__main__': pytest.main(['-s', 'test_allure_tag_severity.py'])
下面截图为运行用例等级标识为normal、critical的测试用例。
脚本中allure.story()、allure.feature()、allure.severity()、allure.epic()在allure测试报告中的展示效果
allure的标记装饰器
- BDD样式的标记装饰器
- 优先级(严重程度)标记装饰器
- 自定义标记装饰器
BDD标记装饰器
提供了三个装饰器
- @allure.epic:敏捷里面的概念,定义史诗,往下是 feature
- @allure.feature:功能点的描述,理解成模块往下是 story
- @allure.story:故事,往下是 title
栗子一(story+feature)
测试代码:
#!/usr/bin/env python # -*- coding: utf-8 -*- """ __title__ = __Time__ = 2020-04-19 14:27 __Author__ = 小菠萝测试笔记 __Blog__ = https://www.cnblogs.com/poloyy/ """ import allure def test_without_any_annotations_that_wont_be_executed(): pass @allure.story('epic_1') def test_with_epic_1(): pass @allure.story('story_1') def test_with_story_1(): pass @allure.story('story_2') def test_with_story_2(): pass @allure.feature('feature_2') @allure.story('story_2') def test_with_story_2_and_feature_2(): pass
无标记装饰器allure报告显示结果:
我们先看看没有设置标记装饰器时,allure报告是啥样的:
添加装饰器:加了 @allure.feature 和 @allure.story 之后的 allure 报告:
知识点:
1、story 是 feature 的子集,当测试用例有 @allure.feature、@allure.story 时,在报告上会先显示 feature,点开之后再显示 story【可以想象成,安徒生童话(feature)有很多个童话故事(story)】
2、如果不加 @allure.feature、@allure.story 时,在Behaviors栏目下,测试用例都不会分类显示,当用例数量过多时导致观看感极差。
栗子二
测试代码:
#!/usr/bin/env python # -*- coding: utf-8 -*- """ __title__ = __Time__ = 2020/10/27 19:44 __Author__ = 小菠萝测试笔记 __Blog__ = https://www.cnblogs.com/poloyy/ """ import os import allure import pytest @pytest.fixture(scope="session") def login_fixture(): print("=== 前置登录 ===") @allure.step("步骤1") def step_1(): print("操作步骤---------------1") @allure.step("步骤2") def step_2(): print("操作步骤---------------2") @allure.step("步骤3") def step_3(): print("操作步骤---------------3") @allure.epic("epic 相当于总体描述") @allure.feature("测试模块") class TestAllureALL: @allure.testcase("https://www.cnblogs.com/poloyy/", '测试用例,点我一下') @allure.issue("https://www.cnblogs.com/poloyy/p/12219145.html", 'Bug 链接,点我一下') @allure.title("用例的标题") @allure.story("story one") @allure.severity("critical") def test_case_1(self, login_fixture): """ 小菠萝测试笔记地址:https://www.cnblogs.com/poloyy/ """ print("测试用例1") step_1() step_2() @allure.story("story two") def test_case_2(self, login_fixture): print("测试用例2") step_1() step_3() @allure.epic("另一个 epic") @allure.feature("查找模块") class TestAllureALL2: @allure.story("story three") def test_case_3(self, login_fixture): print("测试用例3") step_1() @allure.story("story four") def test_case_4(self, login_fixture): print("测试用例4") step_3() if __name__ == '__main__': pytest.main(['-s', '-q', '--alluredir', './allure']) os.system('allure -c ./allure') os.system('allure serve ./allure-report')
allure测试报告展示:
用命令行方式运行时,可以指定运行某个story、feature、epic吗?
当然可以,跟 @pytest.mark.xxx 指定标签运行的方式没啥区别,添加下面的命令行参数就行
- --allure-epics
- --allure-features
- --allure-stories
举栗子
# 只运行 epic 名为 test 的测试用例 pytest --alluredir ./report/allure --allure-epics=test # 只运行 feature 名为 模块 的测试用例 pytest --alluredir ./report/allure --allure-features=模块 # 只运行 story1、story2 的测试用例(也可以不用=号 空格就行了哦) pytest tests.py --allure-stories story1,story2 # 指定 feature+story pytest tests.py --allure-features feature2 --allure-stories story2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!