化繁为简!用pytest编写接口自动化测试脚本的简易思路

引言

当今互联网时代,软件质量成为越来越重要的一个问题,而接口自动化测试是保障软件质量的一种关键手段。

在这个过程中,pytest成为了许多开发者的首选工具,既易于使用,又具有强大的功能。但是,对于初学者来说,编写自己的pytest测试脚本可能会感到有些困难。

本文将为您提供一些思路和方法,帮助您更轻松地编写符合需求的接口自动化测试用例。

话不多说直接开始我们的实战。

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

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

一,明确测试对象

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

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

通过抓包我们抓取到了该接口的信息如下:

请求url:https://weathernew.pae.baidu.com/weathernew/pc

请求方式:GET

请求参数:

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

复制代码
  1. url = "https://weathernew.pae.baidu.com/weathernew/pc"

  2. params = {

  3. "query": "浙江杭州天气",

  4. "srcid": 4982

  5. }

  6. res = requests.get(url=url, params=params)

  7. print(res.status_code)

  8. print(res.text)

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

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

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

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

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

二,编写测试用例

编写测试用例时,我们需要将代码进行封装,可以封装成测试类/方法、测试函数。pytest中对用例封装的命名方式有要求。

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

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

构造请求数据

正向请求,数据如下:

  1. params = {

  2. "query": "浙江杭州天气",

  3. "srcid": 4982

  4. }

异常请求,数据如下:

复制代码
  1. params = {

  2. "query": "",

  3. "srcid": 4982

  4. }

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

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

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

封装测试代码

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

复制代码
  1. class TestWeather:

  2. '''

  3. 校验百度天气查询接口:https://weathernew.pae.baidu.com/weathernew/pc

  4. '''

  5. def test_get_weather_normal(self):

  6. '''正向校验-查询存在的城市的天气'''

  7. url = "https://weathernew.pae.baidu.com/weathernew/pc"

  8. params = {

  9. "query": "浙江杭州天气",

  10. "srcid": 4982

  11. }

  12. res = requests.get(url=url, params=params)

  13. def test_get_weather_error(self):

  14. '''异常校验-查询不存在的城市的天气'''

  15. url = "https://weathernew.pae.baidu.com/weathernew/pc"

  16. params = {

  17. "query": ,

  18. "srcid": 4982

  19. }

  20. res = requests.get(url=url, params=params)

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

断言设置

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

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

复制代码
  1. # 断言code是否等于200,存在则该断言通过

  2. assert res.status_code == 200

  3. # 断言结果中是否存在"window.tplData",存在则该断言通过

  4. assert "window.tplData" in res.text

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

  1. # 断言code是否等于200,存在则该断言通过

  2. assert res.status_code == 200

  3. # 断言结果中是否存在"window.tplData",注意这里是不存在则该断言通过

  4. assert "window.tplData" not in res.text

  5. # 断言结果中是否存在"暂未开通此城市查询",存在则该断言通过

  6. assert "暂未开通此城市查询" in res.text

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

使用pytest框架管理执行用例时,需要先安装pytest,并在模块中import,不清楚的同学可以留言评论区给我,这里就不做过多说明了。

完整示例代码如下:

  1. import requests

  2. import pytest

  3. class TestWeather:

  4. '''

  5. 校验百度天气查询接口:https://weathernew.pae.baidu.com/weathernew/pc

  6. '''

  7. def test_get_weather_normal(self):

  8. '''正向校验-查询存在的城市的天气'''

  9. url = "https://weathernew.pae.baidu.com/weathernew/pc"

  10. params = {

  11. "query": "浙江杭州天气",

  12. "srcid": 4982

  13. }

  14. res = requests.get(url=url, params=params)

  15. # print(res.status_code)

  16. # print(res.text)

  17. assert res.status_code == 200

  18. assert "window.tplData" in res.text

  19. def test_get_weather_error(self):

  20. '''异常校验-查询不存在的城市的天气'''

  21. url = "https://weathernew.pae.baidu.com/weathernew/pc"

  22. params = {

  23. "query": ,

  24. "srcid": 4982

  25. }

  26. res = requests.get(url=url, params=params)

  27. print(res.status_code)

  28. print(res.text)

  29. assert res.status_code == 200

  30. assert "window.tplData" not in res.text

  31. assert "暂未开通此城市查询" in res.text

  32. if __name__ == '__main__':

  33. # 使用pytest执行用例

  34. pytest.main()

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

执行结果如下:

四,总结

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

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

总结:

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

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

软件测试面试文档

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

视频文档获取方式:

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

相关推荐
七夜zippoe9 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
盟接之桥9 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
Fcy64810 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满10 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠11 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
主机哥哥11 小时前
阿里云OpenClaw部署全攻略,五种方案助你快速部署!
服务器·阿里云·负载均衡
Harvey90311 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技12 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀12 小时前
Linux环境变量
linux·运维·服务器
zzzsde12 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器