接口自动化测试框架:Pytest+Allure+Excel

1. Allure 简介

简介

Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具,它不仅以 Web 的方式展示了简介的测试结果,而且允许参与开发过程的每个人可以从日常执行的测试中,最大限度地提取有用信息。

Allure 是由 Java 语言开发的,支持 Pytest,JaveScript、PHP、Ruby 等。 

  • 从 DEV/QA 的角度来看,Allure 提供了详尽的测试报告,比如简化了常见缺陷的统计;失败的测试可以分为 bug 和被中断的测试;还可以配置日志、步骤、fixture、附件、计时、执行历史;以及与 TMS、BUG 管理系统、Jenkins 集成等。所以,通过以上配置,所有负责的开发人员和测试人员可以尽可能地掌握测试信息。
  • 从管理者的角度来看,Allure 提供了一个清晰的“大图”,即 High Level 的统计报告,其中包括已覆盖的特性、缺陷聚集的位置、执行时间轴的外观以及许多其他方便的事情。Allure 的模块化和可扩展性保证了你总是能够对某些东西进行微调,使得 Allure 更适合你。

那么下面就来说说如何使报告更加详细的显示我们需要的信息,以及 Allure 与 Jenkins 的集成。

安装

(Windows/Mac 通用安装方法) 

下载地址:https://github.com/allure-framework/allure2/releases,下载所需版本的 zip 包。

安装:

  1. 解压 —> 进入 bin 目录 —> 运行 allure.bat
  2. 把 bin 目录加入 Path 环境变量
  3. 配合 pytest,使用 allure2 生成更加精美的测试报告:pip install allure-pytest

运行方法

在测试执行期间收集结果

pytest [测试文件] -s -q --alluredir=./result/ --clean-alluredir
  • -s:表示将执行成功的案例日志打印出来
  • -q:若跟文件执行路径则代表只需要执行的文件
  • --alluredir:指定存储测试结果的路径(若目录不存在则会新建)
  • --clean-alluredir:清除历史结果数据

查看测试报告

方式一:用于在本地渲染后对外展示结果

allure serve ./result/

方式二:用于在本地渲染和查看结果

# 生成报告
allure generate ./result/ -o ./report/ --clean  # 注意:覆盖路径加 --clean

# 打开报告
allure open -h 127.0.0.1 -p 8883 ./report/

 注意:/report/ 目录中的 index.html 就是最终的结果页面,但直接通过浏览器打开这个文件是看不到实际报告内容的,这是因为实际报告内容需要 allure 进行渲染后才能看到。

2. Allure 常用特性

场景:

  • 希望在报告中看到测试功能,子功能或场景,测试步骤,包括测试附加信息。

解决: 

  • import allure
  • @allure.feature('功能名称')
  • @allure.story('子功能名称')
  • @allure.title('测试用例名称')
  • @allure.step('步骤细节')
  • @allure.description('测试用例描述')
  • @allure.attach('具体文本信息'):需要附加的信息,可以是数据,文本,图片,视频,网页
  • 如果只测试登录功能运行的时候可以加限制过滤,如:pytest 文件名 --allure_features '购物车功能' --allure_stories '加入购物车'

@alllure.feature() 与 @allure.store() 的关系

feature 相当于一个大的功能或模块。将 case 分类到某个 feature 中,并在报告中的 behaviors 中显示,相当于 testsuite。

story 相当于分支功能/模块,属于 feature 之下的结构,并在报告中的 features 中显示,相当于 testcase。

feature 与 story 类似于父子关系。

@allure.step() 与 with allure.step() 的区别
  •  测试过程中每个步骤,一般放在具体逻辑方法中。
  • 可以放在关键步骤中,在报告中显示。
  • 在 App、Web 自动化测试当中,建议每切换到一个新的页面当做一个 step。

用法:

  • @allure.step():只能以装饰器的形式放在类或者方法上。
  • with allure.step():可以放在测试用例方法里面,但测试步骤的代码需要被该语句包含

给测试用例划分优先级

场景:

通常测试有冒烟测试、回归测试、线上验证测试等,那么就需要按照重要性级别来分别执行,比如上线时要把主流程和重要模块都跑一遍。

解决:

  • 通过附加 pytest.mark 标记描述
  • 通过 allure.feature、allure.story 标记描述
  • 通过 allure.severity 直接标记用例级别

根据测试用例的重要性划分测试用例等级,如果没指定等级,默认为 NORMAL 级别:

  • BLOCKER:阻塞缺陷(功能未实现,无法下一步)
  • CRITICAL:严重缺陷(功能点缺失)
  • NORMAL:一般缺陷(边界情况,格式错误)
  • MINOR:次要缺陷(界面错误与ui需求不符)
  • TRIVIAL:轻微缺陷(必须项无提示,或者提示不规范)
     

步骤: 

  1. 在方法、函数和类上面加:@allure.severity(allure.severity_level.TRIVIAL)
  2. 指定执行对应级别的用例:pytest -s -v 文件名 --allure-severities normal, critical

给 Allure 测试报告添加内容(图片、附件、文本、截图、HTML 等)

场景:

  • 前端自动化测试经常需要附加图片或 html,比如在适当的地方、适当的时机截图等。

解决:

  • @allure.attach() 显示许多不同类型的提供的附件,可以补充测试、步骤或测试结果。

步骤:

 在测试报告里附加网页:

  • 格式:allure.attach(body(内容), name, attachment_typeextension)
  • 示例:allure.attach('<head>/head><body>首页</body>', '这是错误页的结果信息', allure.attachment_type.HTML)
     

在测试报告里附加图片:

  • 格式:allure.attach.file(source, name, attachment_type, extension)
  • 示例:allure.attach.file("./result/b.png", attachment_type=allure.attachment_type.PNG)
     
集成测试管理系统

@allure.link()、@allure.issue()、@allure.testcase() 主要是为了将 Allure 报告和测试管理系统集成,可以更快速地跳转到公司内部地址。

先看看三个装饰器的源码:

  1. def link(url, link_type=LinkType.LINK, name=None):

  2. return safely(plugin_manager.hook.decorate_as_link(url=url, link_type=link_type, name=name))

  3. def issue(url, name=None):

  4. return link(url, link_type=LinkType.ISSUE, name=name)

  5. def testcase(url, name=None):

  6. return link(url, link_type=LinkType.TEST_CASE, name=name)

小结

  • issue() 和 testcase() 其实调用的也是 link(),只是 link_type 不一样。
  • 必传参数 url:跳转的链接。
  • 可选参数 name:显示在 Allure 报告的名字,如果不传就是显示完整的链接(建议传,不然可读性不高)。
  • 可以理解成:三个方法是一样的,我们都提供跳转链接和名字,只是链接的 type 不一样,最终显示出来的样式不一样而已(type 不一样,样式不一样)。
  • 如果你喜欢,只用 @allure.link() 也可以。
  • 而出现三个装饰器的原因是为了更好地将链接进行分类(访问链接、Bug 链接、测试用例链接)。

代码示例

  1. import allure

  2. TEST_CASE_LINK = 'https://github.com/qameta/allure-integrations/issues/8#issuecomment-268313637'

  3. @allure.link('https://www.youtube.com/watch?v=4YYzUTYZRMU')

  4. def test_with_link():

  5. pass

  6. @allure.link('https://www.youtube.com/watch?v=Su5p2TqZxKU', name='点击我看一看youtube吧')

  7. def test_with_named_link():

  8. pass

  9. @allure.issue('140', 'bug issue链接')

  10. def test_with_issue_link():

  11. pass

  12. @allure.testcase(TEST_CASE_LINK, '测试用例地址')

  13. def test_with_testcase_link():

  14. pass

运行结果,查看 Allure 报告

1)@allure.link() 不传 name 参数时的样式

如下图所示,不传 name 时,当链接很长,可读性就比较差啦。

2)@allure.link() 传了 name 参数时的样式

3)@allure.testcase() 的样式

如下图所示,和 link() 传了 name 参数时一样:

4)@allure.issue() 的样式

如下图所示,多了个虫子样式:

3. 接口自动化测试框架示例

完整工程:https://github.com/juno3550/InterfaceAutoTestWithPytest

测试方法示例
  1. import pytest

  2. 2 import allure

  3. 3 import logging

  4. 4 from util.assert_util import assert_keyword

  5. 5 from util.request_util import api_request

  6. 6 from util.global_var import *

  7. 7 from util.excel_util import excel_util

  8. 8

  9. 9

  10. 10 register_test_data = excel_util.get_sheet_data("注册")

  11. 11 login_test_data = excel_util.get_sheet_data("登录")

  12. 12

  13. 13

  14. 14 @allure.feature("登录模块")

  15. 15 @pytest.mark.dependency(name="TestLoginModule")

  16. 16 class TestLoginModule:

  17. 17

  18. 18 @allure.story("注册功能")

  19. 19 @allure.title('用户注册') # 指定测试用例标题,默认是函数名

  20. 20 @allure.description('通过接口进行用户注册') # 添加测试用例描述

  21. 21 @allure.severity(allure.severity_level.BLOCKER) # 阻塞级别

  22. 22 @pytest.mark.run(order=1)

  23. 23 @pytest.mark.parametrize('case_data', register_test_data)

  24. 24 def test_register(self, case_data):

  25. 25 with allure.step("读取请求数据,调用接口"):

  26. 26 logging.info("接口用例数据:%s" % case_data)

  27. 27 response = api_request(case_data[API_IP], case_data[API_URI], case_data[REQUEST_METHOD],

  28. 28 case_data[API_REQUEST_DATA], case_data[RESPONSE_EXTRACT_VAR],

  29. 29 case_data[REQUEST_HEADER], case_data[REQUEST_COOKIE])

  30. 30 with allure.step("获取响应数据,进行断言"):

  31. 31 assert_keyword(response, case_data[RESPONSE_ASSERT_KEYWORD])

  32. 32

  33. 33 @allure.story("登录功能")

  34. 34 @allure.title('用户登录') # 指定测试用例标题,默认是函数名

  35. 35 @allure.description('通过接口进行用户登录') # 添加测试用例描述

  36. 36 @allure.severity(allure.severity_level.BLOCKER) # 阻塞级别

  37. 37 @pytest.mark.run(order=2)

  38. 38 @pytest.mark.parametrize('case_data', login_test_data)

  39. 39 def test_login(self, case_data):

  40. 40 with allure.step("读取请求数据,调用接口"):

  41. 41 logging.info("接口用例数据:%s" % case_data)

  42. 42 response = api_request(case_data[API_IP], case_data[API_URI], case_data[REQUEST_METHOD],

  43. 43 case_data[API_REQUEST_DATA], case_data[RESPONSE_EXTRACT_VAR],

  44. 44 case_data[REQUEST_HEADER], case_data[REQUEST_COOKIE])

  45. 45 with allure.step("获取响应数据,进行断言"):

  46. 46 assert_keyword(response, case_data[RESPONSE_ASSERT_KEYWORD])

  47. 47

  48. 48

  49. 49 if __name__ == "__main__":

  50. 50 test_dir = os.path.dirname(__file__)

  51. 51 pytest.main(['-s', '-q', test_dir, '--alluredir', '../test_result/', "--clean-alluredir"])

  52. 52 os.system('allure generate ../test_result/ -o ../test_report/ --clean')

  53. 53 os.system('allure open -h 127.0.0.1 -p 8881 ../test_report/')

测试数据示例

Allure 报告结果示例

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方进群即可自行领取。

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值