python自动化之如何利用allure生成测试报告

Allure测试报告框架帮助你轻松实现”高大上”报告展示。本文通过示例演示如何从0到1集成Allure测试框架。重点展示了如何将Allure集成到已有的自动化测试工程中、以及如何实现报表的优化展示。Allure非常强大,支持多种语言多种测试框架,无论是Java/Python还是Junit/TestNG,其他语言或者框架实现的流程和本文一致,具体配置参照各语言框架规范

安装

安装allure

Windows用户:

  • scoop install allure    (需要先下载并安装Scoop,该方法无需配置环境变量)

MAC用户:

  • 通过Homebrew进行自动安装
  • brew install allure   (如果Homebrew版本比较旧,需要先升级Homebrew,否则安装的allure版本也很老,可能会与Python插件不兼容)

手动安装:

  • 可以从官网 Central Repository: io/qameta/allure/allure-commandline 手动下载
  • 目前最新版本为2.13.6   

下载后解压并配置环境变量

安装allure-pytest插件

  • pip install allure-pytest

allure常用特性

希望在报告中看到测试功能,子功能或场景,测试步骤,包括测试附加信息可以使用@feature,@story,@step,@attach

步骤:

  • import allure
  • 功能上加@allure.feature("功能名称")
  • 子功能上加@allure.story("子功能名称")
  • 步骤上加@allure.step("步骤细节")
  • @allure.attach("具体文本信息"),需要附加的信息,可以是数据,文本,图片,视频,网页
  • 如果只测试部分功能运行的时候可以加限制过滤:
    • pytest 文件名 --allure-features "需要运行的功能名称" 

allure特性—feature/story

@allure.feature与@allure.store的关系

  • feature相当于一个功能,一个大的模块,将case分类到某个feature中,报告中在behaviore中显示,相当于testsuite
  • story相当于对应这个功能或者模块下的不同场景,分支功能,属于feature之下的结构,报告在features中显示,相当于testcase
  • feature与story类似于父与子关系

step特性

  • 测试过程中每个步骤,一般放在具体逻辑方法中
  • 可以放在关键步骤中,在报告中显示
  • 在app,web自动化测试中,建议每切换到一个新的页面当做一个step
  • 用法:
    • @allure.step() 只能以装饰器的形式放在类或方法上面
    • with allure.step():  可以放在测试用例方法里面,但测试步骤的代码需要被该语句包含

运行:

  在测试执行期间收集结果

  pytest [测试文件] -s -q --alluredir=./result --clean-alluredir

  • --alluredir这个选项,用于指定存储测试结果的路径
  • --clean-alluredir 这个选项用来清除之前生成的结果

查看测试报告:

  方法一:测试完成后查看实际报告,在线看报告,会直接打开默认浏览器展示当前报告

      allure serve ./result

  方法二:从结果生成报告,这是一个启动tomcat的服务,需要两个步骤

      生成报告:

          allure generate ./result -o ./report --clean   (注意:--clean用来清除之前已生成的报告)

      打开报告:

          allure open -h 127.0.0.1 -p 8883 ./report   (该方法直接生成一个tomcat服务,可远程访问)

举个例子:

有如下代码文件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

#!/usr/bin/python

# -*- coding: UTF-8 -*-

"""

@author:chenshifeng

@file:test_allure.py

@time:2020/10/10

"""

import allure

import pytest

@allure.feature('登录模块')

class TestLogin():

    @allure.story('登录成功')

    @allure.title('登录成功标题')

    def test_login_sucess(self):

        with allure.step('步骤1:打开应用'):

            print('应用已打开')

        with allure.step('步骤2:进入登录页面'):

            print('登录页面已打开')

        with allure.step('步骤3:输入用户名和密码'):

            print('用户名和密码输入成功')

        print('登录测试用例:登录成功')

    @allure.story('登录成功')

    def test_login_sucess2(self):

        assert '1' == 1

        print('登录测试用例:登录成功')

    @allure.story('登录失败')

    def test_login_failure_a(self):

        print('登录测试用例:登录失败,用户名缺失')

    @allure.story('登录失败')

    def test_login_failure_b(self):

        print('登录测试用例:登录失败,密码缺失')

    @allure.story('登录失败')

    def test_login_failure_c(self):

        with allure.step('输入用户名'):

            print('已输入用户名')

        with allure.step('输入密码'):

            print('已输入密码')

        with allure.step('点击登录'):

            print('已点击登录')

        print('登录测试用例:登录失败,密码错误')

@allure.feature('搜索模块')

class TestSearch():

    def test_search1(self):

        print('搜索用例1')

    TEST_CASE_LINK = 'https://mirrors.huaweicloud.com/'

    @allure.testcase(TEST_CASE_LINK,'测试用例连接')

    def test_search2(self):

        print('搜索用例2')

    @allure.step('搜索步骤')

    def test_search3(self):

        print('搜索用例3')

依次执行命令: 

  pytest test_allure.py --alluredir=./result --clean-alluredir

  allure serve ./result

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

chenshifengdeMacBook-Pro:testcode chenshifeng$ pytest test_allure.py --alluredir=./result --clean-alluredir

============================================================================= test session starts =============================================================================

platform darwin -- Python 3.9.0, pytest-6.1.1, py-1.9.0, pluggy-0.13.1

rootdir: /Users/chenshifeng/MyCode/PythonCode/SFDSZL/test_pytest, configfile: pytest.ini

plugins: allure-pytest-2.8.18

collected 8 items                                                                                                                                                            

test_allure.py .F......                                                                                                                                                 [100%]

================================================================================== FAILURES ===================================================================================

________________________________________________________________________ TestLogin.test_login_sucess2 _________________________________________________________________________

self = <test_allure.TestLogin object at 0x7fef3d5cba90>

    @allure.story('登录成功')

    def test_login_sucess2(self):

>       assert '1' == 1

E       AssertionError: assert '1' == 1

test_allure.py:27: AssertionError

=========================================================================== short test summary info ===========================================================================

FAILED test_allure.py::TestLogin::test_login_sucess2 - AssertionError: assert '1' == 1

========================================================================= 1 failed, 7 passed in 0.07s =========================================================================

chenshifengdeMacBook-Pro:testcode chenshifeng$ allure serve ./result

Generating report to temp directory...

Report successfully generated to /var/folders/p0/3_7fwrvx6n3ftpfd4wjb01300000gn/T/7024790777193223986/allure-report

Starting web server...

2020-10-13 21:39:56.174:INFO::main: Logging initialized @6818ms to org.eclipse.jetty.util.log.StdErrLog

Server started at <http://192.168.12.100:58977/>. Press <Ctrl+C> to exit

生成的报告:

allure特性-testcase

关联测试用例(可以直接给测试用例的地址链接)

例子:

1

2

3

4

TEST_CASE_LINK = 'https://mirrors.huaweicloud.com/'

@allure.testcase(TEST_CASE_LINK,'测试用例连接')

def test_search(self):

    print('搜索用例')

按重要性级别进行一定范围测试

通常测试有P0、冒烟测试、验证上线测试。按重要性级别来执行的,比如上线要把主流程和重要模块都跑一遍,可通过以下方法解决

通过附加@pytest.mark标记

通过allure.feature,allure.story

也可以通过allure.severity来附加标记

  • 级别:
  • trivial:不重要,轻微缺陷(必输项无提示,或者提示不规范)
  • minor 不太重要,次要缺陷(界面错误与UI需求不符)
  • normal:正常问题,普通缺陷(数值计算错误)
  • critical:严重,临界缺陷(功能点缺失)
  • blocker:阻塞,中断缺陷(客户端程序无响应,无法执行下一步操作)

使用方法:

   在方法、函数和类上面加 @allure.severity(allure.severity_level.TRIVIAL)

执行:

   pytest -s -v 文件名 --allure-severities normal,critical

举例说明:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

#!/usr/bin/python

# -*- coding: UTF-8 -*-

"""

@author:chenshifeng

@file:test_severity.py

@time:2020/10/11

"""

import allure

import pytest

# 不加任何标记,默认normal

def test_with_no_severity():

    pass

# trivial:不重要,轻微缺陷(必输项无提示,或者提示不规范)

@allure.severity(allure.severity_level.TRIVIAL)

def test_with_trivial_severity():

    pass

# minor 级别 不太重要,次要缺陷(界面错误与UI需求不符)

@allure.severity(allure.severity_level.MINOR)

def test_with_minor_severity():

    pass

# normal:正常问题,普通缺陷(数值计算错误)

@allure.severity(allure.severity_level.NORMAL)

def test_with_normal_severity():

    pass

# critical:严重,临界缺陷(功能点缺失)

@allure.severity(allure.severity_level.CRITICAL)

def test_with_ritical_severity():

    pass

# blocker:阻塞,中断缺陷(客户端程序无响应,无法执行下一步操作)

@allure.severity(allure.severity_level.BLOCKER)

def test_with_blocker_severity():

    pass

@allure.severity(allure.severity_level.NORMAL)

class TestClassWithNormalSeverity(object):

    # 不加任何标记,默认为同class级别

    def test_inside_with_normal_severity(self):

        pass

    # 重新设置了critical级别

    @allure.severity(allure.severity_level.CRITICAL)

    def test_inside_with_critical_severity(self):

        pass

执行:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

chenshifengdeMacBook-Pro:testcode chenshifeng$ pytest test_severity.py --alluredir=./result --clean-alluredir -vs

============================================================================= test session starts =============================================================================

platform darwin -- Python 3.9.0, pytest-6.1.1, py-1.9.0, pluggy-0.13.1 -- /usr/local/bin/python3.9

cachedir: .pytest_cache

rootdir: /Users/chenshifeng/MyCode/PythonCode/SFDSZL/test_pytest, configfile: pytest.ini

plugins: allure-pytest-2.8.18

collected 8 items                                                                                                                                                            

test_severity.py::test_with_no_severity PASSED

test_severity.py::test_with_trivial_severity PASSED

test_severity.py::test_with_minor_severity PASSED

test_severity.py::test_with_normal_severity PASSED

test_severity.py::test_with_ritical_severity PASSED

test_severity.py::test_with_blocker_severity PASSED

test_severity.py::TestClassWithNormalSeverity::test_inside_with_normal_severity PASSED

test_severity.py::TestClassWithNormalSeverity::test_inside_with_critical_severity PASSED

============================================================================== 8 passed in 0.03s ==============================================================================

chenshifengdeMacBook-Pro:testcode chenshifeng$ allure serve ./result

Generating report to temp directory...

Report successfully generated to /var/folders/p0/3_7fwrvx6n3ftpfd4wjb01300000gn/T/17788207943997663035/allure-report

Starting web server...

2020-10-13 22:27:49.842:INFO::main: Logging initialized @6620ms to org.eclipse.jetty.util.log.StdErrLog

Server started at <http://192.168.12.100:59696/>. Press <Ctrl+C> to exit

终极用例:

百度搜索:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

#!/usr/bin/python

# -*- coding: UTF-8 -*-

"""

@author:chenshifeng

@file:test_baidudemo.py

@time:2020/10/13

"""

import pytest

import allure

from selenium import webdriver

import time

@allure.testcase('https://www.github.com')

@allure.feature("百度搜索")

@pytest.mark.parametrize('test_data1',['allure','pytest','unittest'])

def test_steps_demo(test_data1):

    with allure.step('打开百度网页'):

        driver=webdriver.Chrome()

        driver.get('http://www.baidu.com')

        driver.maximize_window()

    with allure.step(f'输入搜索词:{test_data1}'):

        driver.find_element_by_id('kw').send_keys(test_data1)

        time.sleep(2)

        driver.find_element_by_id('su').click()

        time.sleep(2)

    with allure.step('保存图片'):

        driver.save_screenshot('./screenshot/baidu.png')

        allure.attach.file('./screenshot/baidu.png',attachment_type=allure.attachment_type.PNG)

    with allure.step('关闭浏览器'):

        driver.quit()

执行:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

chenshifengdeMacBook-Pro:testcode chenshifeng$ pytest test_baidudemo.py --alluredir=./result --clean-alluredir -vs

============================================================================= test session starts =============================================================================

platform darwin -- Python 3.9.0, pytest-6.1.1, py-1.9.0, pluggy-0.13.1 -- /usr/local/bin/python3.9

cachedir: .pytest_cache

rootdir: /Users/chenshifeng/MyCode/PythonCode/SFDSZL/test_pytest, configfile: pytest.ini

plugins: allure-pytest-2.8.18

collected 3 items                                                                                                                                                            

test_baidudemo.py::test_steps_demo[allure] PASSED

test_baidudemo.py::test_steps_demo[pytest] PASSED

test_baidudemo.py::test_steps_demo[unittest] PASSED

============================================================================= 3 passed in 24.65s ==============================================================================

chenshifengdeMacBook-Pro:testcode chenshifeng$ allure serve ./result

Generating report to temp directory...

Report successfully generated to /var/folders/p0/3_7fwrvx6n3ftpfd4wjb01300000gn/T/18005664130273264423/allure-report

Starting web server...

2020-10-13 23:03:39.221:INFO::main: Logging initialized @7360ms to org.eclipse.jetty.util.log.StdErrLog

Server started at <http://192.168.12.100:60775/>. Press <Ctrl+C> to exit

报告:

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/719224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

成功的交易没有对错,只有逻辑

大部分人将交易失败归咎于心态&#xff0c;但其实我们是否认真思考过自己的基本功是否扎实呢&#xff1f;这篇文章将引导你换个角度看待交易&#xff0c;让你明白自己应该努力的方向。 曾经&#xff0c;你或许认为资金体量小、信息不对称、技术不过关、心态不过硬是阻碍交易发展…

TikTok外贸系统的核心功能及其源代码分享!

随着全球化的不断推进&#xff0c;外贸业务成为越来越多企业的增长动力&#xff0c;TikTok作为一个全球性的社交媒体平台&#xff0c;其用户基数庞大、活跃度高&#xff0c;为外贸业务提供了无限的商机。 为了帮助企业在TikTok上更好地开展外贸业务&#xff0c;TikTok外贸系统…

【DDD】学习笔记-聚合和聚合根:怎样设计聚合?

今天我们来学习聚合&#xff08;Aggregate&#xff09;和聚合根&#xff08;AggregateRoot&#xff09;。 我们先回顾下上一讲&#xff0c;在事件风暴中&#xff0c;我们会根据一些业务操作和行为找出实体&#xff08;Entity&#xff09;或值对象&#xff08;ValueObject&…

xss.haozi.me:0x0B

<svg><script>(1)</script>

洛谷 B3620 x 进制转 10 进制

题目描述 给一个小整数 x 和一个 x 进制的数 S。将 S 转为 10 进制数。对于超过十进制的数码&#xff0c;用 A&#xff0c;B&#xff0c;…… 表示。 输入格式 第一行一个整数 x; 第二行一个字符串 S。 输出格式 输出仅包含一个整数&#xff0c;表示答案。 输入输出样例…

【JavaScript】面试手撕浅拷贝

【JavaScript】面试手撕浅拷贝 引入 浅拷贝和深拷贝应该是面试时非常常见的问题了&#xff0c;为了能将这两者说清楚&#xff0c;于是打算用两篇文章分别解释下深浅拷贝。 PS: 我第一次听到拷贝这个词&#xff0c;有种莫名的熟悉感&#xff0c;感觉跟某个英文很相似&#xff…

局域网如何搭建服务器?

随着网络的普及和应用场景的不断拓展&#xff0c;局域网搭建服务器逐渐成为大家关注的话题。在日常生活和工作中&#xff0c;我们经常需要通过局域网和互联网进行文件共享、资源访问等操作&#xff0c;而搭建服务器则是实现这些功能的重要手段之一。本文将针对局域网搭建服务器…

SwiftUI 如何在运行时从底层动态获取任何 NSObject 对象实例

概览 众所周知,SwiftUI 的推出极大地方便了我们这些秃头码农们搭建 App 界面。不过,有时我们仍然需要和底层的 UIKit 对象打交道。比如:用 SwiftUI 未暴露出对象的接口改变视图的行为或外观。 从上图可以看到,我们 SwiftUI 代码并没有设置视图的背景色,那么它是怎么变成绿…

vscode 本地/远程添加python解释器

文章目录 1. 背景2. 增加python解释器 1. 背景 我们在使用 vscode 去远程调试代码时&#xff0c;如果环境存在多个 Python 版本&#xff08;如用 conda 管理&#xff09;&#xff0c;没有选择正确的 Python 解释器会导致少包、库不适配等各种问题 2. 增加python解释器 windo…

鸿蒙系统适配的流程

鸿蒙系统适配的流程通常涉及以下关键步骤&#xff0c;以下是鸿蒙系统适配的一般流程&#xff0c;具体流程可能会根据项目的具体需求和开发团队的情况进行调整和优化。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 准备工作&#…

盘点:国家智能算力中心

文章目录 1. Main2. My thoughtsReference 1. Main 按照《中国算力白皮书&#xff08;2022年&#xff09;》的定义&#xff0c;算力主要分为四部分&#xff1a;通用算力、智能算力、超算算力、边缘算力。通用算力以CPU芯片输出的计算能力为主&#xff1b;智能算力以GPU、FPGA、…

【一起学习Arcade】(6):属性规则实例_约束规则和验证规则

一、约束规则 约束规则用于指定要素上允许的属性配置和一般关系。 与计算规则不同&#xff0c;约束规则不用于填充属性&#xff0c;而是用于确保要素满足特定条件。 简单理解&#xff0c;约束规则就是约束你的编辑操作在什么情况下可执行。 如果出现不符合规则的操作&#…

解释一下前端框架中的虚拟DOM(virtual DOM)和实际DOM(real DOM)之间的关系。

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

leetcode日记(36)全排列

想思路想了很久……思路对了应该会很好做。 我的思路是这样的&#xff1a;只变化前n个数字&#xff0c;不断增加n&#xff0c;由2到nums.size()&#xff0c;使用递归直到得到所有结果 代码如下&#xff1a; class Solution { public:vector<vector<int>> permut…

正信法律:借款纠纷的民事起诉状怎么写

在借款纠纷中&#xff0c;当协商无果时&#xff0c;诉诸法律成为债权人追回债务的有效途径。而民事起诉状作为启动诉讼程序的法律文书&#xff0c;其撰写质量直接关系到案件的受理与判决。本文旨在简明扼要地阐述如何撰写一份规范的借款纠纷民事起诉状。 起诉状需包含以下几个关…

阿克曼转向车型导航末段位姿调整控制

1目标 分析RPP算法时控制器算法学习1-RPP受控纯追踪算法发现,在终点时如果角度还有较大偏差,该算法无法进行很好的调整,故开始尝试在末端接近目标点时,用自己的控制算法去调整位姿,姑且命名为TEA算法(Target-End-Adjust Algorithm for Ackermann) 2控制思路 step1. 将…

C# Onnx segment-anything 分割万物 一键抠图

目录 介绍 效果 模型信息 sam_vit_b_decoder.onnx sam_vit_b_encoder.onnx 项目 代码 下载 C# Onnx segment-anything 分割万物 一键抠图 介绍 github地址&#xff1a;https://github.com/facebookresearch/segment-anything The repository provides code for runn…

设计模式(十二)享元模式

请直接看原文: 原文链接:设计模式&#xff08;十二&#xff09;享元模式-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 享元模式定义 享元模式是结构型设计模式的一种&am…

Kubernetes-1

学习Kubernetes第一天 k8s-11、什么是Kubernetes2、配置Kubernetes2.1、准备三台全新的虚拟机2.2、关闭防火墙和SElinux2.3、修改主机名2.4、升级操作系统(三台一起操作)2.5、配置主机hosts文件&#xff0c;相互之间通过主机名互相访问2.6、配置master和node之间的免密通道2.7、…

KMP算法和Manacher算法

KMP算法 KMP算法解决的问题 KMP算法用来解决字符串匹配问题: 找到长串中短串出现的位置. KMP算法思路 暴力比较与KMP的区别 暴力匹配: 对长串的每个位,都从头开始匹配短串的所有位. KMP算法: 将短字符串前后相同的部分存储在 n e x t next next数组里,让之前匹配过的信息指…