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

引言

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

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

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

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

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

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

一,明确测试对象

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

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

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

请求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中对用例封装的命名方式有要求。

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

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

构造请求数据

正向请求,数据如下:

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)

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

断言设置
断言,即校验结果是否是我们期望的内容。设置断言时,我们需要先明确校验哪些字段。一般而言,接口响应的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,不清楚的同学可以留言评论区给我,这里就不做过多说明了。

完整示例代码如下:

import requests
import pytest
 
 
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)
        # print(res.status_code)
        # print(res.text)
        assert res.status_code == 200
        assert "window.tplData" in res.text
 
 
    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)
        print(res.status_code)
        print(res.text)
        assert res.status_code == 200
        assert "window.tplData" not in res.text
        assert "暂未开通此城市查询" in res.text
 
        
if __name__ == '__main__':
    # 使用pytest执行用例
    pytest.main()

 

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

执行结果如下:

四,总结

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

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

写在最后

这篇贴子到这里就结束了,最后,希望看这篇帖子的朋友能够有所收获。

都到这了记得三连支持一下吧。

感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

 

 

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取 

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

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

相关文章

C/C++ BM8 链表中倒数最后k个结点

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 解决方案二2.1 思路阐述2.2 源码 总结 前言 这道题和BM1中的思路有些许类似,整体不难。 题目 描述 输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。 如果…

three.js 物体下落动画(重力加速度)

效果&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><el-button click"loopFun"> 物体下落…

效果图渲染为什么找「瑞云渲染」瑞云渲染邀请码WFQB

效果图的渲染可以通过个人的电脑&#xff0c;也可以通过第三方的云渲染平台&#xff0c;两者之间的区别很多人都知道是什么。如果用户需要使用个人电脑&#xff0c;通常需要搭配高性能的硬件&#xff0c;然而硬件中最贵的当数CPU、GPU&#xff0c;云渲染平台则是通过租用高配置…

day6:继承与多态

思维导图 2.编程题&#xff1a; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a;比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff…

Win32汇编数组学习2

之前学习过win32汇编数组&#xff1b;还不熟悉&#xff1b;继续熟悉&#xff1b; 先做几个基本的对话框&#xff0c;有一个静态文本框&#xff1b; 定义数组之后&#xff0c;用 wsprintf 函数格式化&#xff0c;然后调用 SetDlgItemText 赋值给静态文本框&#xff1b; arr1 …

[C++]二叉搜索树

一、定义 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根节点的值它的左右子树也分别…

深入浅出熟悉OpenAI最新大作Sora文生视频大模型

蠢蠢欲动&#xff0c;惴惴不安&#xff0c;朋友们我又来了&#xff0c;这个春节真的过的是像过山车&#xff0c;Gemini1.5 PRO还没过劲&#xff0c;OpenAI又放大招&#xff0c;人类真的要认输了吗&#xff0c;让我忍不住想要再探究竟&#xff0c;到底是什么让文生视频发生了质的…

C语言—指针

碎碎念:做指针题的时候我仿佛回到了原点&#xff0c;总觉得目的是为了把框架搭建起来&#xff0c;我胡说的哈31 1.利用指针变量将一个数组中的数据反向输出。 /*1.利用指针变量将一个数组中的数据反向输出。*/#include <stdio.h> #include <time.h> #include <…

常用类与基础API-String的理解和不可变性

1.String类的理解 1.1类的声明 public final class String >final &#xff1a;String是不可继承的。 >Serializable :可序列化的接口,凡是实现此接口的类的对象就可以通过网络或本地流进行数据的传输 >comparable:凡是实现此接口的类,其对象都可以比较大小. 1.…

【MySQL】多表关系的基本学习

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-3oES1ZdkKIklfKzq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

基于8086单片机的数码管计时系统[proteus仿真]

基于8086单片机的数码管计时系统[proteus仿真] 8086仿真设计这个题目算是课程设计中常见的题目了&#xff0c;本期是一个基于8086单片机的数码管计时系统[proteus仿真] 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】&#xff0c;赞赏任意文章 2&#xffe5;&a…

Fiddler抓包(网页、手机、MUMU模拟器)

前置条件&#xff1a;电脑上下载安装好了Fiddler&#xff0c;有浏览器 一、网页抓包 1、fiddler下载安装证书 Tools-Options 勾选下面两个框 点击下面的选项&#xff0c;信任证书 会弹出弹窗&#xff0c;点击yes&#xff08;这个时候注意&#xff0c;DO_NOT_TRUST_FiddlerRo…

防御保护第五次作业

1,办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) FW5&#xff1a; 2,分公司设备可以通过总公司的移动链路和电信链路访问到DMz区的http服务器 FW5&#xff1a; 注&#xff1a;记得通过安全策略放行 分公司FW3 注意&#xff1a…

Open CASCADE学习|曲线向曲面投影

在三维空间中&#xff0c;将曲线向曲面投影通常涉及复杂的几何计算。这个过程可以通过多种方法实现&#xff0c;但最常见的是使用数学和几何库&#xff0c;如OpenCASCADE&#xff0c;来处理这些计算。 在OpenCASCADE中&#xff0c;投影曲线到曲面通常涉及以下步骤&#xff1a;…

【plt.bar绘制条形图】:从入门到精通,只需一篇文章!【Matplotlib】

【&#x1f4ca;plt.bar绘制条形图】&#xff1a;从入门到精通&#xff0c;只需一篇文章&#xff01;【Matplotlib】 利用Matplotlib进行数据可视化示例 &#x1f335;文章目录&#x1f335; &#x1f50d; 一、初识plt.bar&#xff1a;条形图的基本概念&#x1f4a1; 二、plt.…

Spring Boot 笔记 025 主界面

1.1 路由搭建 1.1.1 安装vue router npm install vue-router4 1.1.2 在src/router/index.js中创建路由器&#xff0c;并导出 import { createRouter, createWebHistory } from vue-router//导入组件 import LoginVue from /views/Login.vue import LayoutVue from /views/La…

Eliminating Domain Bias for Federated Learning in Representation Space【文笔可参考】

文章及作者信息&#xff1a; NIPS2023 Jianqing Zhang 上海交通大学 之前中的NeurIPS23论文刚今天传到arxiv上&#xff0c;这次我把federated learning的每一轮看成是一次bi-directional knowledge transfer过程&#xff0c;提出了一种促进server和client之间bi-direction…

【机构vip教程】Requests(1):Requests模块简介与安装

Requests模块简介 在python的标准库中&#xff0c;虽然提供了urllib,utllib2,httplib&#xff0c;但是做接口测试&#xff0c;requests使用更加方便快捷&#xff0c;正如官方说的&#xff0c;“让HTTP服务人类”。 Requests是用python语言基于urllib编写的&#xff0c;采用的是…

【漏洞复现-通达OA】通达OA swfupload_new存在前台SQL注入漏洞

一、漏洞简介 通达OA(Office Anywhere网络智能办公系统)是由北京通达信科科技有限公司自主研发的协同办公自动化软件,是与中国企业管理实践相结合形成的综合管理办公平台。通达OA为各行业不同规模的众多用户提供信息化管理能力,包括流程审批、行政办公、日常事务、数据统计…

UVa1359/LA3491 Hills

题目链接 本题是2005年ICPC亚洲区域赛杭州欧赛区的H题 题意 平面上有 n&#xff08;n≤500&#xff09;条线段&#xff0c;其中每条线段的端点都不会在其他线段上。你的任务是数一数有多少个“没有被其他线段切到”的三角形&#xff08;即小山&#xff09;。如下图所示&#x…