注册一个做网站的公司/近期热点新闻事件
软件测试有多种多样的方法和技术,可以从不同角度对它们进行分类。其中,根据软件生命周期,针对不同的测试对象与目标,可将测试过程分为 4 个阶段:单元测试、集成测试、系统测试和验收测试。本文着重介绍了如何借用 pytest 与 httprunner 进行接口自动化测试。
一、 什么是接口测试
In computing, an interface is a shared boundary across which two or more separate components of a computer system exchange information. The exchange can be between software, computer hardware, peripheral devices, humans, and combinations of these.
根据 wiki 中的定义,接口是一个共享的边界,计算机系统的多个独立组件通过它交换信息。这些信息的交换可以基于软件、硬件、外部设备、人和它们之间的组合。根据上述定义,可以面向软件、硬件、交互设备等展开接口测试。软件的接口测试是面向独立组件之间接口的一种测试,主要用于检测内外部系统及内部各子系统之间的交互点。测试的重点在于检查逻辑正确性、交互依赖性、数据正确性.
二、 引入自动化背景
基于以下几个情况,数栈引入自动化测试,以期提高测试效率,保障交付产品质量。
产品迭代迅速
目前数栈产品已经迭代至 Release4.3 版本。每过几个月进行一次产品 release 更新让回归测试的工作量持续上升。接口自动化测试可以很好的减少回归工作量。
应用系统日趋复杂
数栈目前自研 8 款产品和多个插件,产品之间的交互与产品 - 插件之间的交互日趋复杂。客观现实带来了更大的测试风险,测试消耗成本越来越高,花费的时间也越来越长。接口自动化测试可以提高测试效率。
部署环境多样
作为一款面向大数据的产品,除了开源的 Hadoop,还需要适配 TDH、CDH、HDP 等其他引擎。同时,各种客户的 POC 环境也需要大量人力支持。
三、 自动化技术选型
接口测试可以使用的工具有很多,Postman、Jmeter、REST-Assured、SoapUI、httpclient 等等。数栈产品使用的是 HttpRunner 这个框架。相比较于前几类工具,它具有以下特点:
简单易用。
虽然前几款工具中有图形化界面可以让人直观的进行操作,但 HttpRunner 以 “关键字” 的优势可以让 QA 快速的上手框架,对代码能力要求低。根据对应的关键字填入相应的值,即可生成一条测试用例。
可扩展性强
HttpRunner 的 V3 版本支持了 pytest,可以方便的借助 pytest 插件解决接口测试中遇到的问题,如数据驱动、参数化等。jUnit 虽然也具有扩展性强的特点,但是 Java 语言对于 QA 来说太重,且学习成本比 HttpRunner 更高。
易于集成 CI
HttpRunner 支持 CLI 命令,可以方便的接入 Jenkins、Gitlab CI 等工具。
录制回放
通过 Charles、Fiddler 等工具将请求到处为.har 文件,然后通过 HttpRunner 提供的命令,就可以将.har 文件转换成 json/yaml 文件。
数栈产品曾使用过 Jmeter 作为接口自动化工具。Jmeter 拥有可视化图形界面,通过拖动组件信息就可完成用例编排,方便 QA 使用。但是 Jmeter 的内置函数不能满足于复杂的数栈产品,虽然可以选择 beanshell 来写工具脚本,但其难以调试,第三方包管理困难等问题使编写效率低下。同时 Jmeter 容易出现编码混乱、日志不易于查看等问题。
HttpRunner 作为一款优秀的开源框架,在 GitHub 上拥有 2.6k star,集简单易用、扩展性强、易于集成、录制回放等特性于一体,相比较于 Jmeter 更适用于数栈自动化实践。
四、 自动化测试用例
数栈整体自动化测试架构如下图所示。从上到下可分为用户层、配置层、用例层、数据源。用户可以通过 Docker 镜像、Pipeline、定时任务来触发自动化任务。运行的结果记录到禅道,然后通过接入自研的 EasyV 进行展示。配置文件分为两类:一类是应用系统信息,如业务数据库信息、域名、账号密码等;另一类是数据源信息,用于用例的执行,现在支持的数据源有 MySQL、Oracle、Kafka、HBase 等等。从业务层面分,可以分为 8 个产品,每个产品编写各自的用例;从执行层面分,可分为接口测试和场景测试。若选择接口测试,则会运行所有产品的接口测试用例。下面拿接口测试用例进行举例说明。
一条接口测试用例可分为两部分:配置和测试步骤。先来看配置:
config = (Config("测试创建项目接口").variables(**{"cookie": Cookie().get_cookie(),"url": api.aiworks.aiworks_api.AiworksApi.create_project.value,"tenant_name": ENV_CONF.uic.tenant_name,"project_name": project_name}).base_url(ENV_CONF.base_url.rdos))
首先第一个遇到的问题就是获取 cookie。基本上接口都需要 cookie 或者 token 校验才能调用,因此将获取 cookie 的方法抽象提取成一个 get_cookie (),避免了每个用例写一遍登陆。这个方法就属于架构图中预置函数的模块。url、tenant_name、project_name 三个变量是后续测试步骤中所需要用到的变量值,这些都预先在 variables 中定义好。其中还可以看到有 AiworksApi、ENV_CONF 这几个文件。AiworksApi 是所有 Aiwork 产品的接口枚举类,对接口内容进行管理;ENV_CONF 包含了整个自动化项目的配置信息,是一个配置文件,属于配置层。
teststeps = [Step(RunRequest("开始请求创建项目接口").post("$url").with_headers(**{"cookie": "$cookie"}).with_json({"enableCycleSchedule": "$enableCycleSchedule","isSwitchJupyter": "$isSwitchJupyter","projectAlias": "$projectAlias","projectDesc": "$projectDesc","projectEngineList": "$projectEngineList","projectName": "$projectName","switchGpu": "$switchGpu"}).validate().assert_equal("status_code", 200).assert_equal("body.code", "$code").assert_contains("body.message", "$message").teardown_hook("${delete_project()}"))]
然后在测试步骤部分,整个 teststeps 由 Step 数组构成。可以看到创建项目这个接口只有一个 Step,整个 Step 分为 post、with_headers、with_json、validate、teardown_hooke5 个部分组成。其中,with_json 中 key-value 键值对的值全都是引用的方式来取得,而不是写死的固定值。这样就可以将用例与数据区分开来。而具体的值则通过 @pytest.mark.parameterize 这个装饰器传入,params 里定义了这个用例所需的所有字段值。整体用例编写思路为 “用例与数据分离”,避免修改测试用例需要改动大量的代码。
@pytest.mark.parametrize("params", params)def test_start(self, params):super().test_start(params)
所以整体来看,HttpRunner 框架提供了一个用例模版 -- 由多个关键字组成,使用者只需要将模版中的内容填充完整,就可以完成一条用例的编写。
五、自动化成果
自 2021 年 4 月自动化立项以来,已编写超过 900 条用例,8 个子产品接口覆盖率平均达到 60% 以上。每日通过 Jenkins 构建定时任务,在持续集成环境对最新的代码进行自动化测试。同时,自动化测试接入了测试环境、客户环境中使用。在提供环境信息完备的情况下,可以随时接入自动化,并运行得出报告给到 QA,大大减少了回归工作量,从原先 3-4 周的时间缩短到 1-2 周完成。
下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
软件测试面试小程序
被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!
涵盖以下这些面试题板块:
1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux
6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础
资料获取方式 :
相关文章:

浅谈 Pytest+HttpRunner 如何展开接口测试!
软件测试有多种多样的方法和技术,可以从不同角度对它们进行分类。其中,根据软件生命周期,针对不同的测试对象与目标,可将测试过程分为 4 个阶段:单元测试、集成测试、系统测试和验收测试。本文着重介绍了如何借用 pyte…...

vue自定义事件 div 拖拽方法缩小
在main.js 引用 // 引入拖动js import dragMove from "./utils/dragMove.js" 创建 drawmove.js export default (app) > {app.directive(dragMove, (el, binding) > {const DragVindow el.querySelector(binding.value.DragVindow)// 按下鼠标处理事件con…...

使用实体解析和图形神经网络进行欺诈检测
图形神经网络的表示形式(作者使用必应图像创建器生成的图像) 一、说明 对于金融、电子商务和其他相关行业来说,在线欺诈是一个日益严重的问题。为了应对这种威胁,组织使用基于机器学习和行为分析的欺诈检测机制。这些技术能够实时…...

vue中axios请求篇
vue中如何发起请求? 利用axios来发起请求,但是前期需要配置 首先安装axios 可以使用npm、yarn等进行安装 npm安装方式 npm install axios -sava //在项目文件夹中打开cmd或者终端进行安装依赖 yarn安装方式 yarn add axios 引入axios。我一般是在src下创建一个u…...

Springboot2.0 上传图片 jar包导出启动(第二章)
目录 一,目录文件结构讲解二,文件上传实战三,jar包方式运行web项目的文件上传和访问处理(核心知识)最后 一,目录文件结构讲解 简介:讲解SpringBoot目录文件结构和官方推荐的目录规范 1、目录讲解…...

添加YDNS免费的ipv6动态域名解析
背景 又到了一年一度的dns域名到期,寻找替代了,前几年用了阿里、华为的免费域名,支持了几个搭建在NAS上的微服务;一旦涉及到域名续费,价格就比首年上去了不少,所以,打算找个长期的免费域名。 搜…...

爬虫异常处理之如何处理连接丢失和数据存储异常
在爬虫开发过程中,我们可能会遇到各种异常情况,如连接丢失、数据存储异常等。本文将介绍如何处理这些异常,并提供具体的解决代码。我们将以Python语言为例,使用requests库进行网络请求和sqlite3库进行数据存储。 1. 处理连接丢失 …...

KVM虚拟化ubuntu
KVM(Kernel-based Virtual Machine)是一种基于Linux内核的虚拟化技术,它将Linux内核作为虚拟机的底层操作系统,利用硬件虚拟化支持创建和管理虚拟机。KVM虚拟化技术被广泛应用于云计算、虚拟化服务器、虚拟化桌面等场景。 KVM虚拟…...

模拟电子技术基础学习笔记三 PN结
采用不周的掺杂工艺,将P型半导体与N型半导体制作在同一块硅片上,在它们的交界面就形成PN结。 扩散运动 物质总是从浓度高的地方向浓度低的地方运动,这种由于浓度差而产生的运动称为扩散运动。 空间电荷区 - 耗尽层 漂移运动 在电场力的作…...

java基础-----第七篇
系列文章目录 文章目录 系列文章目录一、什么是字节码?采用字节码的好处是什么?1.java中的编译器和解释器:2.采用字节码的好处:二、Java中的异常体系一、什么是字节码?采用字节码的好处是什么? 1.java中的编译器和解释器: Java中引入了虚拟机的概念,即在机器和编译程…...

useEffect 不可忽视的 cleanup 函数
在 react 开发中, useEffect 是我们经常会使用到的钩子,一个基础的例子如下: useEffect(() > {// some code here// cleanup 函数return () > {doSomething()} }, [dependencies])上述代码中, cleanup 函数的执行时机有如下…...

vue3:使用:批量删除功能
场景:vue中使用el-table,常需要记住上一页所勾选的数据,批量删除操作,或者弹窗分页勾选,进行第一页勾选,在调后端接口选择第二页勾选其他数据。 1、element-ui 的table表格可以轻松实现多选的功能,只要在表…...

Scala中的样例类和样例对象和JAVA存根类
Scala中的样例类和样例对象 在 Scala 中,样例类(case class)和样例对象(case object)都是用于定义不可变数据类型的特殊类和对象。它们被广泛用于模式匹配、代数数据类型(Algebraic Data Types)…...

【0218】当SIGQUIT kill掉stats collector后,stats collector如何保存最终统计数据
1. stats collector可被哪些信号给kill? stats collector进程的主体函数是 PgstatCollectorMain(),该函数内部完成了stats collector进程的信号注册、现有统计文件读取、消息处理等任务。 忽略通常与postmaster中的某些操作绑定的所有信号,SIGHUP和SIGQUIT除外。 注意,我们…...

httplib 与 json.hpp 结合示例
httplib 与 json.hpp 结合示例 1、使用POST 接口,发送 登陆 请求 客户端发送 {nlohmann::json jsonOfCollectionInfo;jsonOfCollectionInfo["user_id"] "zhang";jsonOfCollectionInfo["password"] "123456";httplib::…...

RK3288安卓7.1开机上电到显示logo需要在3s内完成
需求: 从上电到开始开机logo有一段黑屏时间,这个黑屏时间大概在6s左右,给客户体验很不好,现在需要将这段黑屏时间缩短到2-3s左右 思路: 因为只需要早点显示logo,其实整体从上电到开机动画到安卓系统启动整体…...

Maven之hibernate-validator 高版本问题
hibernate-validator 高版本问题 hibernate-validator 的高版本(邮箱注解)依赖于高版本的 el-api,tomcat 8 的 el-api 是 3.0,满足需要。但是 tomcat 7 的 el-api 只有 2.2,不满足其要求。 解决办法有 2 种ÿ…...

C++--动态规划其他问题
1.一和零 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度,该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素࿰…...

PostgreSQL 查询语句大全
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...

扫盲:常用NoSQL数据库
前言 关系型数据库产品很多,如 MySQL、Oracle、Microsoft SQL Sever 等,但它们的基本模型都是关系型数据模型。 非关系型数据库又称为:NoSQL ,没有统一的模型,而且是非关系型的。 常见的 NoSQL 数据库包括键值数据库、…...

MPI之数据打包和解包
MPI_Pack 和 MPI_Unpack 它们可以将源数据打包成二进制格式以便于传输,或者将二进制格式的数据解包成目标数据。这对函数通常用于在 MPI 应用程序中进行异构系统间的通信,即两个系统之间使用不同的二进制格式进行交互通信。 打包(序列化&…...

9.2作业
QT实现闹钟 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTimerEvent> #include<QDateTime> #include<QLineEdit> #include<QLabel> #include<QPushButton> #include <QTextToSpeech> QT_BEGIN_NAMES…...

数据库建设命名规范
1、数据库库表命名规范 1.1 数据库命名规范 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线_组成,命名简洁明确,多个单词用下划线_分隔,一个项目一个数据库,多个项目慎用同一个数据库全部小写命名,禁止出现大…...

单元测试及其工具Junit
1.单元测试是什么 单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确,通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。 单元测试是软件测试的一种…...

Multicast IP Interface
该模块通过多播IPv4和IPv6在UDP上实现CAN和CAN FD消息的传输。此虚拟接口允许在多个进程甚至主机之间进行通信。这与虚拟接口不同,虚拟接口只能在单个进程中传递消息,但不需要网络堆栈。 它在UDP上运行以具有尽可能低的延迟(与使用TCP相反),并且因为正常的IP多播本质上是…...

从零学算法2833
2833.给你一个长度为 n 的字符串 moves ,该字符串仅由字符 ‘L’、‘R’ 和 ‘’ 组成。字符串表示你在一条原点为 0 的数轴上的若干次移动。 你的初始位置就在原点(0),第 i 次移动过程中,你可以根据对应字符选择移动方…...

python安装cfg模块时报错,ERROR: No matching distribution found for cfg
使用pip3 install cfg2 才行 pip3 install cfg2...

优思学院|六西格玛中的概率分布有哪些?
为什么概率分布重要? 概率分布是统计学中一个重要的概念,它帮助我们理解随机变量的分布情况以及与之相关的概率。在面对具体问题时,了解概率分布可以帮助我们选择适当的检验或分析策略,以解决问题并做出合理的决策。 常见的概率…...

工控上位机程序为什么只能用C语言?
工控上位机程序并不只能用C#开发,实际上在工业自动化领域中,常见的上位机开发语言包括但不限于以下几种:C#: C#是一种常用的编程语言,在工控领域中被广泛使用。它具有良好的面向对象特性和丰富的类库支持,可以实现高性…...

Go操作各大消息队列教程(RabbitMQ、Kafka)
Go操作各大消息队列教程 1 RabbitMQ 1.1 概念 ①基本名词 当前市面上mq的产品很多,比如RabbitMQ、Kafka、ActiveMQ、ZeroMQ和阿里巴巴捐献给Apache的RocketMQ。甚至连redis这种NoSQL都支持MQ的功能。 Broker:表示消息队列服务实体Virtual Host&#x…...