自动化用例编写思路 (使用pytest编写一个测试脚本)

news2024/11/26 18:32:06

目录

一,明确测试对象

二,编写测试用例

构造请求数据

封装测试代码

断言设置

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

四,总结


经过之前的学习铺垫,我们尝试着利用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中对用例封装的命名方式有要求,详细请参考我之前的文章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 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是共用的,我们最好是将它提取出来,而不是每个测试方法都去定义一次这个变量,如下图所示:

执行结果如下:

四,总结

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

系统调用与函数调用有什么区别?

本文我们来聊聊系统调用与普通的函数调用之间的区别。 作为程序员你肯定写过无数的函数,假设有这样两个函数: void funcB() {} void funcA() { funcB();} 函数之间是可以相互调用的,这很简单很happy有没有。 要知道是代码、是函数就可以相…

ABAP 发送特定格式内容的邮件

项目中,经常会有需求,向客户,供应商发送邮件,但是会有一些格式上的要求。 我们一般使用长文本来处理此类需求 举例,客户需要发送一个如下邮件主体内容(带格式) Dear Customer, Attached is y…

相机图像质量研究(2)ISP专用平台调优介绍

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…

洛谷:P5016 龙虎斗 ← NOIP2018 普及组T2

【题目来源】https://www.luogu.com.cn/problem/P5016【题目描述】 轩轩和凯凯正在玩一款叫《龙虎斗》的游戏,游戏的棋盘是一条线段,线段上有 n 个兵营(自左至右编号 1∼n),相邻编号的兵营之间相隔 1 厘米,…

psutil库使用详解

一、背景 在Python的世界里,有一些库因其强大的功能和易用性而备受开发者们的喜爱。今天,我们要介绍的就是其中的一员——psutil库。psutil(python system and process utilities)是一个跨平台的第三方库,用于获取系统运行时的进程和系统利用…

MySQL 事务与存储引擎

目录 一、MySQL事务的概念 二、事务的ACID特点 2.1 原子性 2.2 一致性 2.3 隔离性 2.4 持久性 2.5 事务之间的相互影响 三、Mysql及事物隔离级别 3.1 查询全局事务隔离级别 3.2 查询会话事务隔离级别 3.3 设置全局事务隔离级别 3.4 设置会话事务隔离级别 …

Android自定义圆环进度条/刻度仪表盘(单环单点带动画)

效果图: 1.自定义HeartDashBoardView /*** 刻度仪表盘*/ public class HeartDashBoardView extends View {private static final float START_ANGLE 135f;private static final float MAX_ANGLE 270f;private float progress 0;private float centerX;private float center…

快快快快快快快快快快排

作者简介:დ旧言~,目前大一,现在学习Java,c,Python等 座右铭:松树千年终是朽,槿花一日自为荣。 望小伙伴们点赞👍收藏✨加关注哟💕💕 C语言实现快排☺️ ℹ️…

应届毕业生要如何准备秋招简历?

秋招对于应届毕业生是一个求职的重要渠道,但是很多应届毕业生却不知道要如何制作秋招简历。那么,秋招简历应该如何制作呢?接下来,小编给大家讲一讲简历制作(https://www.jiaobu365.com/)的哪些事&#xff0…

2023 世界人工智能大会(WAIC)人才培养论坛成功举办!

Datawhale论坛 来源:2023 世界人工智能大会(WAIC) 前 言 2023 年 7 月 8 日,“2023世界人工智能大会”(WAIC)落下帷幕。7 月 8 日上午,WAIC 的主要分论坛之一“AIGC时代下的青年开发者人才培养…

什么样的性能测试工具才算是好的工具呢?

一、性能测试工具的特征 调度能力 因为性能测试不可能由一台压力机完成或者说大部分情况下,我们不能不可能由一台压力机来完成,凡是对压力真正有所要求的场景,往往是多台压力机共同施加压力完成性能测试;因此,性能测…

【GitHub】强大的终端录制工具-Terminalizer

Terminalizer 是一个GitHub上优秀的开源项目,目前项目点赞数已达:14k,该项目可以轻松记录下你在命令行的操作,并将录制好的内容输出成 gif 图像或直接分享到网上。 项目开源协议:MIT 项目主开发语言:JavaSc…

Vue计算属性:简化数据处理和视图更新的利器

一、计算属性的基本使用 计算属性:一个特殊属性,值依赖于另外一些数据动态计算出来。🚩🚩🚩计算属性特点:函数内使用的变量改变,重新计算结果返回。💣💣💣注…

uniapp实现聊天消息触,vue3和vue2实现聊天消息触底 scrollTop ,scrollHeight Pc端H5端都适用

uniapp触底SDN链接如下(本人的另一篇博客) uniapp聊天时时触底链接 Pc端 模拟手机端H5 vue3写法 <template><div><!-- 聊天窗体 --><div class"test" id"gundong"><div class"text" v-for"p in chat"&…

Html基础知识学习——兼容问题与解决方法

文章目录 1.计算一定要精确&#xff0c;不要让内容的宽高超出我们设置的宽高&#xff0c;在IE6下内容会撑开设置好的宽高2.元素浮动&#xff0c;宽度需要内容撑开&#xff0c;就给里面的块元素都加浮动3.在ie6.ie7下元素要浮动并在同一行 就给这些元素都加浮动4.注意标签嵌套规…

C# WPF实现动画渐入暗黑明亮主题切换效果

C# WPF实现动画渐入暗黑明亮主题切换效果 效果图如下最近在Bilibili的桌面端看到一个黑白主题切换的效果感觉,挺有意思。于是我使用WPF尝试实现该效果。 主要的切换效果,基本实现不过还存在一些小瑕疵,比如字体等笔刷不能跟随动画进入进行切换。因为Bilibili的客户端是用el…

【算法 -- LeetCode】(018) 四数之和

1、题目 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1a; …

【Hadoop 01】简介

1 Hadoop 简介 Hadoop适合海量数据分布式存储和分布式计算 Hadoop 3.x的细节优化&#xff1a; Java改为支持8及以上HDFS支持纠删码HDFS支持多NameNodeMR任务级本地优化多重服务默认端口变更 Hadoop主要包含三大组件&#xff1a;HDFSMapReduceYARN HDFS负责海量数据的分布式存…