做完自动化测试,但别让不会汇报毁了你...

pytest 是一个成熟的全功能Python测试工具,可以帮助您编写更好的程序。它与 python 自带的 unittest 测试框架类似,但 pytest 使用起来更简洁和高效,并且兼容 unittest 框架。pytest 能够支持简单的单元测试和复杂的功能测试,pytest 本身支持单元测试,可以结合 requests 实现接口测试,结合selenium、appium 实现自动化功能测试,使用 pytest 结合 allure 集成到 Jenkins 中可以实现持续集成。工作中一般会使用持续集成来完成代码集成到主干分支之后的回归测试,通过自动化测试的手段来实现产品的快速迭代,同时还能保证产品的高质量。

Pytest 结合 YAML

yaml是一个可读性高,用来表达数据序列化的格式。pyyaml 模块在 python 中用于处理 yaml 格式数据,主要使用yaml.safe_dump()和yaml.safe_load()函数将 python 值和 yaml 格式数据相互转换。工作中常常使用 YAML 格式的文件存储测试数据。

安装

pip install PyYAML

完成数据驱动

创建用例文件以及数据文件来完成数据驱动的测试案例,创建一个文件夹 testdata,在这个文件夹下创建data.yml和test_yaml.py文件。

创建data.yml文件:

-
  - 1
  - 2
-
  - 20
  - 30

创建“test_yaml.py”,代码如下:

import pytest
import yaml

@pytest.mark.parametrize("a,b", yaml.safe_load(open("datas.yml",\
encoding='utf-8')))
def test_foo(a,b):
    print(f"a + b = {a + b}")

代码分析: yaml 文件里定义了列表数据,通过 open( ) 方法获取 data.yml 文件对象,使用yaml.safe_load()加载这个文件对象,将 yaml 格式文件转换为 python 值,分别传到到用例中生成多条用例分别执行。

运行结果:

省略...
test_params.py::test_foo[1-2] 
test_params.py::test_foo[20-30] 
省略...

运行结果中[1-2]和[20-30]代码传入的两组参数,分别传入 test_foo( ) 用例方法中执行,并且分别生成两条测试结果。pytest 组合 yaml 实现数据驱动,yaml 文件作为用例数据源,控制测试用例的执行,使测试用例数据维护更加方便快捷。

结合 Allure 生成测试报告

测试报告在项目中是一个至关重要的角色,报告可以体现测试人员的工作量,开发人员可以从测试报告中了解缺陷的情况,测试经理可以从测试报告中看到测试人员的执行情况及测试用例的覆盖率,项目负责人可以通过测试报告查看整个项目还余留多少问题,此次版本是否测试通过。

一个美观、一目了然的测试报告能够非常清晰的反映一些问题,提供给相关人员了解项目的整体状态。

Allure 框架是一种灵活的、轻量级、支持多语言的测试报告工具,它不仅能够以简洁的 web 报告形式显示已测试的内容,而且允许参与开发过程的每个人从测试的日常执行中提取最大限度的有用信息。同时支持多种语言包括 Java、Python、JavaScript、Ruby、Groovy、PHP、.Net、 Scala。

安装

Mac 可以使用 brew 安装 allure,安装命令如下:

brew install allure

其他操作系统请参考https://docs.qameta.io/allure/#_installing_a_commandline。与 pytest 结合需要安装 allure-pytest 插件

pip install allure-pytest。

查看allure版本:

allure --version

运行:

第一步:在 pytest 执行测试的时候,指定参数 –alluredir 选项及结果数据保存的目录,代码如下:

pytest --alluredir=tmp/my_allure_results

tmp/my_allure_results中保存了本次测试的结果数据。

第二步:打开报告,需要启动allure服务,在terminal中输入allure serve [path/to/allure_results],代码如下:

allure serve path/to/allure_results

也可以使用allure generate生成 html 格式的测试结果报告,并使用allure open来打开报告。

allure generate ./result/ -o ./report/ --clean

上面的命令将 ./result/ 目录下的测试数据生成HTML测试报告到 ./report 路径下,–clean 选项目的是先清空测试报告目录,再生成新的测试报告,然后使用下面的命令打开报告。

allure open -h 127.0.0.1 -p 8883 ./report/

上面这个命令则会启动一个Web服务将已经生成的测试报告打开。打开生成的测试报告,在默认的浏览器打开测试报告,报告如下图:


上面的测试报告首页中展示了此次测试的测试用例数量以及成功用例、失败用例、跳过用例的比例。测试环境、SUITES、FEATURES BY STORIES 等基本信息,当与 Jenkins 做了持续集成后,TREND 区域还将显示,历次测试的通过情况。首页的左边栏,还从不同的维度展示测试报告的其他信息。

重点页面介绍:

  • Behaviors 页面,按照 FEATURES 和 STORIES 展示测试用例的执行结果
  • Suites 页面,Allure 测试报告将每一个测试脚本,作为一个 Suite。在首页里点击 Suites 区域内的任何一条
    Suite,都会进入 Suites 页面。
  • Graphs 页面,展示了此次测试结果的统计信息,比如测试用例执行结果状态、测试用例重要等级分布、测试用例执行时间分布等
  • 测试用例详情页面,在 Suites 页面上点击任何一条测试用例,Suites
    页面的右侧将展示这条用例的详细执行情况。在这个页面可以看到测试用例的每个步骤,以及每个步骤的执行结果,包括步骤里面添加的链接、图片、网页片段或者视频作为重要信息的补充。在这里可以一目了然的看到用例失败的原因。

前端自动化测试-百度搜索功能实战

pytest 可以与 allure 结合生成测试报告。在实际项目中,一旦用例报错,我们希望能够将当时应用的状态记录下来,记录这些状态的方式可以是日志、截图、视频等手段,并将这些记录在测试报告中,方便相关人员定位问题。allure 就能很好的实现这个目标。

以 web 网页版本的百度为例,百度首页呈现的功能:新闻、网页、贴吧、知道、音乐、图片、视频、地图等,我们以百度网页的搜索功能为例,使用 Allure、pytest 结合 selenium 自动化测试框架,完成一个搜索功能的测试。为了模拟百度搜索功能场景,这里需要创建两个文件,数据文件与用例文件。首先创建数据管理文件data/data.yml,代码如下:

- allure- pytest- unittest

然后,创建用例文件名为test_baidudemo.py,代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import allure
import pytest
import yaml
from selenium import webdriver
import time

@allure.testcase("http://www.github.com")
@allure.feature("百度搜索")
@pytest.mark.parametrize('test_data1', yaml.safe_load(\
open("data/data.yml")))
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("./result/b.png")
        allure.attach.file("./result/b.png", \
        attachment_type=allure.attachment_type.PNG)
    with allure.step("关闭浏览器"):
        driver.quit()

代码解析:

allure.testcase用例标识,给定用例的链接,可以与用例的管理地址关联。allure.feature功能模块划分,方便管理和运行测试用例。

pytest.mark.parametrize用来参数化测试用例。allure.step用来添加测试步骤,在测试报告里面会展示出来这个步骤说明。

执行:

pytest test_baidudemo.py -s -q --alluredir=./result/ allure serve ./result/

测试结果图:



上面的测试报告展示运行时间,时长,用例数,通过率,以及测试套件SUITES,环境等信息,点击左侧栏最下方的Package可以看到所有的测试用例以及测试数据,点击一条用例右侧会展示出用例的优先级,数据,测试步骤以及每个步骤的名称及附加的图片等信息。这里添加了一个测试用例的链接,可以与测试用例的管理链接关联起来,方便后期统计覆盖率。pytest 与 Allure 也可以与 Jenkins 集成,实现自动化测试的持续集成。

最后能给予你助力的教程!

这份资料,对于【软件测试】的朋友来说应该是最全面最完整的备战资料,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,这些资料也陪伴了我走过最艰难的路,希望也能帮助到你!!!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Verilog带参数的`define用法

宏除了可以进行简单的文本替换,还可以像函数和任务一样传递指定多个参数分别对文本进行对应的替换. 示例1: define Disp(pa,pb,pc) \initial \begin \#1200; \$display("%d \n",(papbpc)); \$display(" data_ pa data_ pb data_ pc %d",(…

C#中用程序代码修改了datagridview中的数据,保存时只对光标当前行有保存解决办法

C#中DataGridView绑定了DataTable后,通过代码修改DataGridView中的数据,总有一行(被修改过并被用户选中的行集合中索引为0的行)不能被UpDate回数据库的问题和解决办法 长江黄鹤 2017-06-26 | 300阅读 | 1转藏 转藏全屏朗读分…

真题详解(UML部署图)-软件设计(五十二)

真题详解(地址索引)-软件设计(五十一)https://blog.csdn.net/ke1ying/article/details/130211684 瀑布模式:适应 开发大型项目,且需求明确。 演化模式:适应 对软件需求缺乏准确认知。 螺旋模式&#xff…

【linux】yum “应用商店” 的基本用法

好多工具 yum软件包查看软件包安装软件卸载软件 yum 通俗的讲,这就似我们手机上的应用商店,只不过是在linux下的。 我们可以用yum来下载东西。 软件包 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序。 但是这样…

19 calloc 和 realloc 虚拟内存分配的调试

前言 前面提到了 malloc 虚拟内存分配相关的内容 malloc 虚拟内存分配的调试(1) malloc 虚拟内存分配的调试(2) 这里提 calloc 和 realloc, 这两个函数 虽然没有 malloc 使用频率那么高 但是 还是有很大的知名度的, 本文这里 我们来看一下 calloc 此函数传入两个参数, 第…

Obsidian中如何创作思维导图Mind-map

使用插件 obsidian-mind-map 1.直接在社区下载安装 设置快捷键或者在左侧竖形打开命令面板搜索关键字“mind”, 或者为了便于使用,设置快捷键,在设置-第三方插件中-选择快捷键 然后按下你想设置的快捷键就可以 我这里设置成了CtrlAltM ,M是…

虚拟数字人的3种驱动方式

虚拟数字人是由计算机程序所构建的具有人类特征的虚拟实体,目前的虚拟数字人经过了三代的更迭,划分每一代更迭的标准则是虚拟数字人的驱动方式。 一、虚拟数字人1.0:动画&CG驱动 虚拟数字人1.0就是目前我们所熟知的,比如&am…

LiveCharts2 初步认识

文章目录 1 LiveCharts2 是什么?2 LiveCharts2 可以做什么?3 简单使用LiveCharts2 ,实现动态曲线图 1 LiveCharts2 是什么? GitHub:https://github.com/beto-rodriguez/LiveCharts2 官网: https://lvchar…

C++ STL学习之【反向迭代器】

✨个人主页: 夜 默 🎉所属专栏: C修行之路 🎊每篇一句: 图片来源 A year from now you may wish you had started today. 明年今日,你会希望此时此刻的自己已经开始行动了。 文章目录 🌇前言&a…

分布式锁-Redisson

分布式锁 1、分布式锁1.1 本地锁的局限性1.1.1 测试代码1.1.2 使用ab工具测试(单节点)1.1.3 本地锁问题演示(集群情况) 1.2 分布式锁实现的解决方案1.3 使用Redis实现分布式锁(了解即可)1.3.1 编写代码1.3.2 压测 1.4 使用Redisson解决分布式锁1.4.1 实现代码1.4.1 压测1.4.2 可…

2 常见模块库(2)

2.5 复用器与分路器模块 Mux是一种用于将多个信号组合成一个信号的模块。Mux模块的名称来源于多路复用器(Multiplexer)。 使用Mux可以将多个输入信号组合成一个向量或矩阵,以便在模型中传递和处理。Mux模块可以接受任意数量的输入信号&#x…

什么是伪原创?SEO伪原创该怎么做

伪原创是指在原有的文章或内容基础上进行修改或调整,以产生看起来是全新内容的文章,但实际上并没有创造新的价值。多数情况下,伪原创的目的是为了在文章相对原创的情况下,提高搜索引擎的排名。 一、高质量伪原创 做好伪原创&#…

C语言从入门到精通第8天(分支结构if、else、switch的使用)

分支结构if、else、switch的使用 if语句if...else语句if...else嵌套if...else if...else语句switch语句 if语句 语法: if(表达式){ 语句; } 如果表达式为真,则执行{}里面的语句。如果为假,则不执行。示例代码: int m…

翻译国外文章-整篇文章的翻译

chatgpt翻译是专业的吗 ChatGPT是一种AI语言模型,它可以用来执行各种自然语言处理任务,包括翻译。然而,ChatGPT的翻译结果并不是专业的翻译,因为该模型并不是专为翻译任务训练的。 虽然ChatGPT的翻译质量相对较高,但…

全景视角下的世界探索——三维全景地图

引言:随着数字技术和虚拟现实技术的发展,三维全景地图已成为一种新型地图展示方式,深受人们的关注和喜爱。三维全景地图以其真实逼真、互动性强、展示效果好等特点,正在越来越多的领域得到应用。 三维全景地图的特点 1.真实逼真 …

考研计算机组成原理总结(7)

一.虚拟存储器 1.基本知识 主存和辅存共同构成了虚拟存储器,二者在硬件和系统软件的共同管理下工作。对于应用程序员而言,虚拟存储器是透明的。虚拟存储器具有主存的速度和辅存的容量。 2.基本概念 虚拟存储器将主存或辅存的地址空间统一编址&#x…

Excel中的表格批量生成word表格

场景:测试用例excel转word 我们在项目中,默认情况下是用我们的excel用例模版输出测试用例。但是有的项目中,会要求在word版本的测试计划或者测试报告中,写明测试用例。而我们的测试用例,有的项目有上千条,…

ChatGPT常见问题,Access denied的解决办法

今天,突然想登录一登录ChatGPT,提示 Access denied, You do not have access to chat.openai.com 怎么办? “Access denied You do not have access to chat.openai.com. The site owner may have set restrictions that prevent you from ac…

基于html+css的图片展示15

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

1026. 节点与其祖先之间的最大差值(4-19日

题目:给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V,其中 V |A.val - B.val|,且 A 是 B 的祖先。 (如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么…