python+pytest接口自动化(12)-自动化用例编写思路 (使用pytest编写一个测试脚本)

经过之前的学习铺垫,我们尝试着利用pytest框架编写一条接口自动化测试用例,来厘清接口自动化用例编写的思路。

我们在百度搜索天气查询,会出现如下图所示结果:

接下来,我们以该天气查询接口为例,编写接口测试用例脚本。

一,明确测试对象

针对某个功能做接口测试,首先我们需要确定实现这个功能调用的是哪个接口,这个接口的具体信息(如功能、协议、URL、请求方法、请求参数说明、响应参数说明等等)可以通过查看开发提供的接口文档获取,也可以通过抓包(在没有接口文档的情况下)获取。找到对应的接口也就是测试对象之后,才能有目的的进行下一步。

1,这里显然是没有接口文档提供接口相关的信息的,我们甚至都不知道请求url,那么先Fiddler抓包获取接口信息。

 如果你想学习自动化测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的自动化测试教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386    

【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337.search-card.all.click通过抓包我们抓取到了该接口的信息如下:

请求url:https://weathernew.pae.baidu.com/weathernew/pc请求方式:GET请求参数:

2,抓取到以上这些接口信息后,我们先编写简单的脚本请求该接口,如下:

url = "https://weathernew.pae.baidu.com/weathernew/pc"
params = {"query": "浙江杭州天气","srcid": 4982
}
res = requests.get(url=url, params=params)
print(res.status_code)
print(res.text)

 运行代码,接口调试通过,能获取到结果,如下:

3,明确需求,确定用例。

我们在针对某个接口做自动化测试时,需要先明确用例需要验证的测试点。有些接口既要进行正向的校验,也要进行异常的校验,而有些接口可能在自动化时只需要进行正向校验就够了,无需做异常校验。

我们来分析一下示例的这个天气查询接口,主要有两个测试点:

  • 正向请求:输入存在的城市,能查找对应城市的天气

  • 异常请求:输入不存在的城市,提示错误

二,编写测试用例

编写测试用例时,我们需要将代码进行封装,可以封装成测试类/方法、测试函数。pytest中对用例封装的命名方式有要求,详细请参考我之前的文章pytest测试命名规则。

至于封装成类还是函数,其实没什么特定的要求,一般同一个场景同一个测试点相关的接口可以定义成一个类。

同时用例还需要设置断言,用于校验返回内容是否为期望的内容。测试用例一定要进行断言,否则毫无意义

构造请求数据

正向请求,数据如下:

params = {"query": "浙江杭州天气","srcid": 4982
}

 异常请求,数据如下:

params = {"query": "微信公众号:测试上分之路","srcid": 4982
}

正向请求的结果我们在上面调试请求该接口的时候已经拿到了,如上面的截图。

我们来看下异常请求的结果,为后续设置断言做准备,结果如下:

发送异常请求后,返回的code也是200,结果中会出现暂未开通此城市查询,且没有出现正向请求中的window.tplData内容。

封装测试代码

这里是针对同一个接口的两条不同的测试用例,我们直接封装一个测试类,专门用于测试该接口。示例代码如下:

class TestWeather:'''校验百度天气查询接口:https://weathernew.pae.baidu.com/weathernew/pc'''def test_get_weather_normal(self):'''正向校验-查询存在的城市的天气'''url = "https://weathernew.pae.baidu.com/weathernew/pc"params = {"query": "浙江杭州天气","srcid": 4982}res = requests.get(url=url, params=params)def test_get_weather_error(self):'''异常校验-查询不存在的城市的天气'''url = "https://weathernew.pae.baidu.com/weathernew/pc"params = {"query": "微信公众号:测试上分之路","srcid": 4982}res = requests.get(url=url, params=params)

 注意,代码里还没有进行断言,不能算是完整的用例。这里我只是为了说明流程而把断言放到下一步,分析后再写断言。

断言设置

断言,即校验结果是否是我们期望的内容。pytest怎么进行断言请参考文章pytest-断言。

设置断言时,我们需要先明确校验哪些字段。一般而言,接口响应的code都需要断言,status_code == 200则说明接口请求通了。然后再去断言其他必要字段,从而校验接口功能是否实现。

由上面的结果可知,正向请求可以进行如下断言:

# 断言code是否等于200,存在则该断言通过
assert res.status_code == 200# 断言结果中是否存在"window.tplData",存在则该断言通过
assert "window.tplData" in res.text

由上面的结果可知,异常请求可以进行如下断言:

# 断言code是否等于200,存在则该断言通过
assert res.status_code == 200# 断言结果中是否存在"window.tplData",注意这里是不存在则该断言通过
assert "window.tplData" not in res.text# 断言结果中是否存在"暂未开通此城市查询",存在则该断言通过
assert "暂未开通此城市查询" in res.text

三,执行脚本获取测试结果

使用pytest框架管理执行用例时,需要先安装pytest,并在模块中import,不清楚的同学可以查看我的pytest系列文章,这里不做过多说明。

完整示例代码如下:

# @time: 2022-03-20
# @author: 给你一页白纸import requests
import pytestclass TestWeather:'''校验百度天气查询接口:https://weathernew.pae.baidu.com/weathernew/pc'''def test_get_weather_normal(self):'''正向校验-查询存在的城市的天气'''url = "https://weathernew.pae.baidu.com/weathernew/pc"params = {"query": "浙江杭州天气","srcid": 4982}res = requests.get(url=url, params=params)# print(res.status_code)# print(res.text)assert res.status_code == 200assert "window.tplData" in res.textdef test_get_weather_error(self):'''异常校验-查询不存在的城市的天气'''url = "https://weathernew.pae.baidu.com/weathernew/pc"params = {"query": "微信公众号:测试上分之路","srcid": 4982}res = requests.get(url=url, params=params)print(res.status_code)print(res.text)assert res.status_code == 200assert "window.tplData" not in res.textassert "暂未开通此城市查询" in res.textif __name__ == '__main__':# 使用pytest执行用例pytest.main()

当然,这里因为url是共用的,我们最好是将它提取出来,而不是每个测试方法都去定义一次这个变量,如下图所示:

执行结果如下:

 

四,总结

单个接口自动化测试用例,我们可以按照上面的步骤来进行,即 明确测试对象-->编写测试用例-->编写测试脚本-->执行脚本、获取测试结果。通过这些步骤,我们便对自动化用例的编写有了基本的思路(这一点对于我们自动化测试思维的形成很重要),为我们后续的学习实践打下基础。

事实上使用编程语言对项目进行自动化测试时,几乎不可能只存在一条测试用例,那么在有多条测试用例的情况下,需要怎样管理用例、执行用例、获取测试结果?这就是单元测试框架需要解决的问题。

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

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

相关文章

Unity 实现单例模式

目录 基本概念 饿汉模式(推荐) 懒汉模式: 基本概念 单例模式:类只有一个实例,一般使用static来实现单例模式; 比如:有一个Test类,实现了单例,假设这个唯一的实例名为SingTonle,实例在类内被实现并被stat…

【pycharm】Pycharm中进行Git版本控制

本篇文章主要记录一下自己在pycharm上使用git的操作,一个新项目如何使用git进行版本控制。 文章使用的pycharm版本PyCharm Community Edition 2017.2.4,远程仓库为https://gitee.com/ 1.配置Git(File>Settings) 2.去Gitee创建…

微服务——服务保护Sentinel

雪崩问题 在单体项目里面,如果某一个模块出问题会导致整个项目都有问题。 在微服务项目里面,单独一个服务出问题理论上是不会影响别的服务的。 但是如果有别的业务需要调用这一个模块的话还是会有问题。 问题产生原因和解决思路 最初那只是一个小小…

持续集成交付CICD:通过API方式上传Nexus制品

目录 一、实验 1.通过API方式上传Nexus制品 二、问题 1.如何通过API方式上传PNG图片 2.如何通过API方式上传tar.gz 与 ZIP文件 3.如何通过API方式上传Jar file文件 4.如何通过API方式上传制品(maven类型的制品)文件 5.如何下载制品 一、实验 1.通…

MySQL在Centos7环境安装

说明: • 安装与卸载中,⽤⼾全部切换成为root,⼀旦 安装,普通⽤⼾能使⽤的 1. 卸载不要的环境 [roothcss-ecs-1036 ~]# ps ajx |grep mariadb # 先检查是否有mariadb存在 13134 14844 14843 13134 pts/0 14843 S 1005 0:00 gr…

【数据结构 — 排序 — 交换排序】

数据结构 — 排序 — 交换排序 一.交换排序1.基本思想2.冒泡排序2.1.算法讲解2.2.代码实现2.2.1.函数定义2.2.2.算法接口实现2.2.3.测试代码实现2.2.4.测试展示 3.快速排序3.1.算法讲解3.2.各大算法分别单独实现3.2.1快速排序hoare版本3.2.2.快速排序hoare改进版三数取中选key法…

低多边形3D建模动画风格纹理贴图

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格&#xf…

排序算法之七:归并排序(递归)

基本思想 基本思想: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列&#xff1…

【Proteus仿真】【51单片机】光照强度检测系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使共阴数码管,PCF8591 ADC模块、光敏传感器等。 主要功能: 系统运行后,数码管显示光传感器采集光照强度值&#xff…

C# 使用CancellationTokenSource 取消Task执行

写在前面 在Task创建并执行后,如果状态发生了变化,需要取消正在执行中的Task,除了使用主线程上的共享变量来判断之外,更优雅的方式就是就是用CancellationTokenSource来取消任务的执行。 代码实现 public static void CancelTas…

Linux和Windows环境下如何使用gitee?

1. Linux 1.1 创建远程仓库 1.2 安装git sudo yum install -y git 1.3 克隆远程仓库到本地 git clone 地址 1.4 将文件添加到git的暂存区(git三板斧之add) git add 文件名 # 将指定文件添加到git的暂存区 git add . # 添加新文件和修改过的…

Java毕业设计—vue+SpringBoot图书借阅管理系统

图书管理系统 1. 开发目的 实现图书的智能化、信息化和简单化;实现图书信息的增加、删除、修改、查找、借阅、还书、收藏的显示操作及实时数据库的提交和更改和对普通用户的增、删、改、查;提高图书管理员工作信息报送及反馈的工作效率,减轻…