化繁为简!用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是共用的,我们最好是将它提取出来,而不是每个测试方法都去定义一次这个变量,如下图所示:

执行结果如下:

四,总结

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

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

总结:

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

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

软件测试面试文档

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

视频文档获取方式:

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

相关推荐
饮啦冰美式5 分钟前
22.04Ubuntu---ROS2使用rclcpp编写节点
linux·运维·ubuntu
wowocpp5 分钟前
ubuntu 22.04 server 安装 和 初始化 LTS
linux·运维·ubuntu
wowocpp7 分钟前
ubuntu 22.04 server 格式化 磁盘 为 ext4 并 自动挂载 LTS
服务器·数据库·ubuntu
wclass-zhengge9 分钟前
Netty篇(入门编程)
java·linux·服务器
Lign1731411 分钟前
ubuntu unrar解压 中文文件名异常问题解决
linux·运维·ubuntu
方方怪15 分钟前
与IP网络规划相关的知识点
服务器·网络·tcp/ip
大霞上仙1 小时前
Ubuntu系统电脑没有WiFi适配器
linux·运维·电脑
weixin_442643421 小时前
推荐FileLink数据跨网摆渡系统 — 安全、高效的数据传输解决方案
服务器·网络·安全·filelink数据摆渡系统
Karoku0661 小时前
【企业级分布式系统】Zabbix监控系统与部署安装
运维·服务器·数据库·redis·mysql·zabbix
为什么这亚子2 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算