【软件测试】--接口自动化测试

1. 接口自动化

1.1 概念

接口测试:是对系统或组件之间的接口进行测试,主要是校验数据的交换、传递和控制管理过程,以及相互逻辑依赖关系
自动化测试:是把以人为驱动的测试行为转化为机器执行的一种过程

接口自动化测试:是让程序或者工具代替人工自动完成对接口进行测试的一种过程

1.2 流程

  1. 需求分析
  • 请求(请求url、请求方法、请求参数)
  • 响应 (响应数据、状态码)
  1. 挑选需要做自动化测试的接口

  2. 设计自动化测试用例

  3. 搭建自动化测试环境(如:python+pycharm)

  4. 设计自动化测试项目的架构(参数化、用例执行框架)

  5. 编写代码

  6. 执行测试用例(unitest、pytest)

  7. 生成测试报告(htmltestrunner\allure)并分析结果

2. Requests库

2.1 什么是Requests库

2.1.1 介绍

Requests库是用Python编写的,基于urllib,采用Apache2 Licensed 开源协议的HTTP库,相比urllib库,Requests库更加方便,可以节约我们大量的工作,完全满足HTTP测试需求

2.1.2 安装

pip3 install requests //python3.8

输入pip3 show requests如下图即安装成功
如下图:

在这里插入图片描述

2.2 发送请求

常见的HTTP请求方式:GET、POST、PUT、DELETE、HEAD、OPTIONS

使用requests发送网络请求很简单,只需要调用HTTP请求类型所对应的方法即可

2.2.1 GET请求

import requests
response = requests.get("http://www.baidu.com")

请求方法的返回值response为Response对象,我们可以从这个对象中获取我们想要的响应信息
1、获取请求url:响应对象.url
2、获取响应状态码:响应对象.status_code
3、获取响应内容:响应对象.text

"""
目标:GET请求方法演练
案例:http://www.baidu.com
请求:1、请求方法:GET
响应:1、响应对象.url #获取请求url2、响应对象.status_code #获取响应状态码3、响应对象.text #以文本形式显示响应内容
"""# 1、导包
import requests# 2、调用get
url = "http://www.baidu.com"
r = requests.get(url)
# 3、获取请求url
print("请求url:",r.url)
# 4、获取响应状态码
print("状态码:",r.status_code)
# 5、获取响应信息
print("响应内容",r.text)

image-20240717095640289

请求带参(动态传参)

  • http://www.baidu.com?id=1001
    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • http://www.baidu.com?id=1001,1002
    image-20240717100146488

  • http://www.baidu.com?id=1001&kw=北京

image-20240717095858671

2.2.2 POST请求

步骤:

  1. 导包 import requests
  2. 调用post方法 requests.post(url,json,headers,data)

data与json区别

  • data:字段对象
  • json:json字符串
  • 在python中字典对象和json字符串长得一样,但是后台格式是有区别的
    • 如何将字段对象转为json字符串?
      • 1、导入json
      • 2、json.dumps(字典对象)#转换json字符串

响应数据.text和.json区别

  • json方式返回类型为字典,可以通过键名来获取响应的值
  • text:返回的类型为字符串,无法通过键名来获取响应的值
  • 共同点:长得都像字典
import requests
import time
# 2、调用post#请求url# 设置cookies变量
cookies = {"PHPSESSID":"mcu190hl4685pjrru96t4t7g17"}url = "http://106.54.9.13/index.php/admin/User/add_user"
#请求headers
headers = {"Content-Type":"application/json"}
#请求json
data = {"nickname": "hello","password": "123456","mobile": "12345678910","sex": 0
}time.sleep(4)
r=requests.post(url,json=data,headers=headers,cookies=cookies)# 3、获取响应对象
print(r.json)
# 4、获取响应状态码
print("状态码:", r.status_code)
# 5、获取响应数据
print("响应数据", r.text)'''
:params url:请求的url
:params data:(可选)要发送到请求体中的字典、元组、字节或文件对象
:params json:(可选)要发送到请求体中的JSON数据
:rtype:requests.Response
'''

image-20240717105049598

2.2.3 PUT请求

作用:更新资源
应用:

  1. 导包 import requests
  2. 调用put方法 r = requests.put(url,json,heders) 返回对象为response对象

2.2.4 DELETE请求

作用:删除资源
应用:

  1. 导包 import requests
  2. 调用put方法 requests.delete(url)

响应:

  • 响应状态码:204

2.3 响应内容

请求方法的返回值response为Response对象,我们可以从这个对象中获取所有我们想要的响应内容

response.satus_code  状态码: 查询 200 新增 201 删除 204 更新 201/200
response.url
response.encoding 查看默认请求编码格式,设置响应编码格式
response.headers
response.cookies
response.text 以文本形式解析响应内容
response.content 以字节码形式解析响应内容
response.json 以json字符串形式解析响应内容

2.4 案例

需求

使用requests库调用TPshop登陆功能的相关接口,完成登陆操作,登陆成功后获取“我的订单”页面的数据

相关数据

1、获取验证码:http://106.54.9.13/index.php?m=Home&c=User&a=verify
2、登陆接口:http://106.54.9.13/index.php?m=Home&c=User&a=do_login
3、订单: http://106.54.9.13/index.php/Home/Order/order_list.html
4、登陆数据
data = {“username”:" 18184761327",
“password”: “123456”,
“verify_code”: 8888}

操作步骤

1、请求登陆url+登陆数据

image-20240711103015177

a295c5012a378e9f479820c0c29854d

cookie

来源:由服务器生成

作用:区分同一请求客户端

获取:响应对象.cookies

设置:cookies={key:value}z

image-20240711105939538

直接使用获取验证码成功返回的cookies也可以成功登陆

image-20240711110054050

# 1、导包
import requests# 请求验证码
url_verify_code = "http://106.54.9.13/index.php?m=Home&c=User&a=verify"
r = requests.get(url_verify_code)# 获取cookies
r_cookies = r.cookies
print("浏览器生成的cookies:", r_cookies)
# 设置cookies变量
cookies = {"PHPSESSID": r_cookies["PHPSESSID"]}
print("我们生成的cookies", cookies)
# 2、调用post + 添加cookies
url_login = "http://106.54.9.13/index.php?m=Home&c=User&a=do_login"
data = {"username": " 18184761327","password": "123456","verify_code": 8888}
r = requests.post(url=url_login, data=data, cookies=r_cookies)# 3.验证是否登陆成功
print(r.json())
# 4. 查询我的订单url_order = "http://106.54.9.13/index.php/Home/Order/order_list.html"
r = requests.get(url=url_order, cookies=r_cookies)
print(r.text)

2.5 Session

在requests中,session对象是一个非常常用的对象,这个对象代表一次用户会话:从客户端浏览服务器连接服务器开始,到客户端浏览器与服务器断开

会话能让我们在跨请求时候保持某些参数,比如在同一个session实例发出的所有请求之间保持cookies

创建session对象

session = requests.session()

得到session对象后,就可以调用该对象中的方法来发送请求

session案例

需求

使用requests库调用TPshop登陆功能的相关接口,完成登陆操作,登陆成功后获取“我的订单”页面的数据

相关数据

1、获取验证码:http://106.54.9.13/index.php?m=Home&c=User&a=verify
2、登陆接口:http://106.54.9.13/index.php?m=Home&c=User&a=do_login
3、订单: http://106.54.9.13/index.php/Home/Order/order_list.html
4、登陆数据
data = {“username”:" 18184761327",
“password”: “123456”,
“verify_code”: 8888}

# 1、导包
import requests
# 2、获取session对象
session = requests.session()
# 3、请求验证码,让session对象记录cookies信息
url_verify_code = "http://106.54.9.13/index.php?m=Home&c=User&a=verify"
session.get(url_verify_code)# 4、请求登陆
url_login = "http://106.54.9.13/index.php?m=Home&c=User&a=do_login"
data = {"username": " 18184761327","password": "123456","verify_code": 8888}
r = session.post(url=url_login,data=data)
# 5.验证是否登陆成功
print(r.json())
# 6. 查询我的订单url_order = "http://106.54.9.13/index.php/Home/Order/order_list.html"
r = session.get(url=url_order)
print(r.text)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3. 集成UnitTest

3.1 集成UnitTest

将接口测试脚本集成到UnitTest单元测试框架中,利用UnitTest的功能来运行接口测试用例

3.1.1 需求

使用TPShop项目完成对登陆功能的接口测试

3.3.2 用例设计

用例编号模块用例名称接口名称请求URL请求方法请求参数类型请求参数预期结果测试结果备注
tpshop_login_001登陆登陆成功获取验证码
登陆
http://106.54.9.13/index.php?m=Home&c=User&a=verify
http://106.54.9.13/index.php?m=Home&c=User&a=do_login
GET
POST

form
data = {
“username”: " 18184761327", “password”: “123456”, “verify_code”: 8888
}
获取到验证码图片
登陆成功
tpshop_login_002登陆账号不存在获取验证码
登陆
http://106.54.9.13/index.php?m=Home&c=User&a=verify
http://106.54.9.13/index.php?m=Home&c=User&a=do_login
GET
POST

form
data = {
“username”: " 18184761327", “password”: “123456”, “verify_code”: 8888
}
获取到验证码图片
账号不存在
tpshop_login_003登陆密码错误获取验证码
登陆
http://106.54.9.13/index.php?m=Home&c=User&a=verify
http://106.54.9.13/index.php?m=Home&c=User&a=do_login
GET
POST

form
data = {
“username”: " 18184761327", “password”: “123456”, “verify_code”: 8888
}
获取到验证码图片
密码错误

结构:

  • setUp
    • 作用:test开始执行方法之前,首先被执行
    • 应用:
      • 获取session对象
      • 登陆URL
      • 验证码URL
  • tearDown
    • 作用:test开始执行方法之后,会被执行
    • 应用:
      • 关闭session对象
  • test_login_success
    • 作用:登陆成功用例
    • 应用
      • 请求验证码–>让session对象获取并记录cookies信息
      • 请求登陆
      • 断言验证测试结果
  • test_username_not_exist:
    • 作用:登陆失败,用户名不存在
    • 应用
      • 请求验证码–>让session对象获取并记录cookies信息
      • 请求登陆
      • 断言验证测试结果
  • test_password_error
    • 作用:登陆失败,密码错误
    • 应用
      • 请求验证码–>让session对象获取并记录cookies信息
      • 请求登陆
      • 断言验证测试结果
# 1、导包
import requests
import unittest# 2、新建测试类
class TPShopLogin(unittest.TestCase):# 3、setUpdef setUp(self):# 获取session对象self.session = requests.session()# 登陆URLself.url_login = "http://106.54.9.13/index.php?m=Home&c=User&a=do_login"# 验证码URLself.url_verify_code = "http://106.54.9.13/index.php?m=Home&c=User&a=verify"# url_order = "http://106.54.9.13/index.php/Home/Order/order_list.html"# 4、tearDowndef tearDown(self):# 关闭sessionself.session.close()# 5.登陆成功def test_login_success(self):# 请求验证码--获取cookiesself.session.get(self.url_verify_code)# 请求登陆data = {"username": " 18184761327","password": "123456","verify_code": 8888}r = self.session.post(self.url_login, data=data)# 断言try:self.assertEqual("登陆成功", r.json()['msg'])except AssertionError as e:print(e)# 6. 登陆失败,用户名不存在def test_username_not_exist(self):# 请求验证码--获取cookiesself.session.get(self.url_verify_code)# 请求登陆data = {"username": " 18111111111","password": "123456","verify_code": 8888}r = self.session.post(self.url_login, data=data)# 断言try:self.assertEqual("账号不存在!", r.json()['msg'])except AssertionError as e:print(e)# 7. 登陆失败,密码错误def test_password_error(self):# 请求验证码--获取cookiesself.session.get(self.url_verify_code)# 请求登陆data = {"username": " 18184761327","password": "111111","verify_code": 8888}r = self.session.post(self.url_login, data=data)# 断言try:self.assertEqual("密码错误", r.json()['msg'])except AssertionError as e:print(e)if __name__ == '__main__':unittest.main()

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

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

相关文章

【详细】Ubuntu下安装qt5

Ubuntu下安装qt5 一. QT安装环境准备1、判断gcc是否安装2、安装g3、安装clang编译器4、安装 clang 5、安装make6、安装make-guile7、安装cmake 二. QT5安装1、安装Qt5的组件2、安装Qt的开发工具3、安装qtcreator4、安装qt55、安装qt charts(可选) 三、安…

国服最强文字转音频?Fish Speech

官网文档与示例 Fish Speech V1.2 是一款领先的文本到语音 (TTS) 模型,使用 30 万小时的英语、中文和日语音频数据进行训练。我尝试用1066运行,但是质量不尽如人意,建议使用RTX系列的显卡进行推理。 使用结果展示 text """20…

企业产品网络安全建设日志0725

文章目录 背景:解决方案 背景: 三方依赖安全风险管理与提升是我司推行的安全策之一略。交由测试部管理负责推进。 前天遇到的挑战是某后端部门排期出现问题,本应该做漏洞提升的时间被其他工作插入。时间有压力自然会想到变通之法。 团队有人…

SpringCloud之使用 Nacos 实现高效购物车商品信息处理

在现代电商系统中,购物车是用户体验的重要组成部分。如何高效地获取购物车中的商品信息,是提高系统性能和用户满意度的关键。今天,我们将探讨如何利用 Nacos 和 RestTemplate 实现这一目标,并通过手写负载均衡来优化服务调用。 步…

SLAM:corners:Measuring Corner Properties-1999【方法解析-2】

paper:Measuring Corner Properties 目录 2.2 方向2.2.1 强度质心2.2.2 梯度质心2.2.3 对称性2.2 方向 2.2.1 强度质心 使用标准矩可以很容易地确定角点的方向(不需要使用矩方法的高阶矩)。定义矩为 m p q = ∑ x , y x p y q

WPF项目实战视频《三》(主要为客户端软件界面设计)

20.WPF项目实战(项目介绍) 1.WEB API:接口,如何获取数据(增删改查) 2.客户端 项目功能: 待办,备忘录,汇总,完成比例,设置系统主题等。 21.WPF项…

nodejs与npm版本对应表

Node.js — Node.js 版本 (nodejs.org)

MMCV1.6.0之Runner/Hook/EMAHook (模型 ema)

mmcv/mmcv/runner/hooks/ema.py EMAHook 类是一个用于在训练过程中对模型参数应用指数移动平均 (EMA) 的钩子。EMA是一种平滑技术,通过在每次迭代中更新模型参数的移动平均值,来减小参数更新的波动性。此钩子在 EvalHook 和 CheckpointSaverHook 之前执…

Postman中的灰度发布测试:API部署的稳健之路

Postman中的灰度发布测试:API部署的稳健之路 在软件开发中,灰度发布是一种渐进式的部署策略,它允许新版本的软件逐步向用户推出,从而降低新版本可能带来的风险。Postman作为一个强大的API开发和测试工具,提供了多种功…

Springboot集成微信公众号模板通知java

先看效果 1、微信模板消息官方文档 微信公众平台 2、申请微信公众平台接口测试账号 微信公众平台 3、创建3个实体 (1)、ConfigBean import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configurat…

python中,jsonpath提取数据的时候出现TypeError: ‘bool‘ object is not subscriptable怎么解决

json格式如下: { success: True, result: { codeInfo: { code: 0, msg: 成功 }, uploadToken: { resId: rzJRpo, endpoint: https://sit-api-ypsx-resource.ypsx-internal.com/r…

stm32入门-----DMA直接存储器存取(上——理论篇)

目录 前言 DMA 1.简介 2.存储器映像 3.DMA结构 4.数据宽度与对齐 5.DMA工作示例 前言 本期我们就开始学习DMA直接存储器存取,DMA是一个数据装运的小助手,执行数据的搬运处理,减少了CPU的负担,在stm32中担当重要的工作。在前…

pypi如何上传自己的代码记录

目录 一. 注册pypi账号并创建token 1. 注册pypi账号并创建token 2. Pypi账号注册 3. 邮箱验证 ​编辑 4. 重新生成恢复代码 5. 输入账号密码 ​编辑 6. 保存code并继续 ​编辑7. 输入一行即可,然后点击verify 8. 点击左方目录内的account setting&#xff…

基于微信小程序的高校排课系统 /基于微信小程序的排课管理系统/课程管理系统

摘 要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代&a…

7月29日,每日信息差

第一、淘宝天猫计划全面优化运费险策略,与合作伙伴进行多轮磋商,部分新政策有望在今年 9 月试运行。策略调整后,商家将获得更多运费险补贴,降低经营成本 第二、三星电子与全国三星电子工会将于 7 月 29 日下午展开为期三天的薪资…

爱快路由的dns强制客户端代理真是个强大的功能

大致情况是这样的:同事说在linux服务器/etc/resolv.conf上随便写个IP地址【不在线的】,dns地址也能解析,让我帮忙查查。 我看了下也感觉纳闷,试了下不光在服务器上,我本地的pc随便设置了个dns解析也是一样的。 通过wir…

密码错误springboot也正常启动了

1 项目背景 在日常开发中,开发有时候拿不到数据库,依赖组件的密码,例如由devops进行配置,甚至放到一些密码管理组件中。这样就会出现密码错误的情况。项目发布成功,那么依赖项例如Mysql, 访问别的系统的ak, sk真的准备…

解决Qt6 error: The kit needs to define a CMake tool to parse this project.

cmake对于Qt6来说很重要,所以学会cmake是必须的。 上述错误,就是我在Windows10下运行cmake项目总是报错的一个问题。 明明路径已经配好了,却总是报错。 具体原因可能和cmake的版本,以及是否设置为默认有关。另外也和QtCreator中…

飞凌全志T527开发板实现局域网内文件传输功能

之前玩开发板的时候,如果需要实现主机与开发板之间的文件传输,通常是通过挂载NFS的方式,而飞凌的OKT527板载WIFI,并且官方提供的镜像中已经将其成功驱动,那我们就可以通过WIFI连接家中的路由器的方式,实现局…

codeforce(2024年7月29日)B

我的代码 ai比然与bi和bi-1的的二进制含有1的相同&#xff08;有一同一&#xff09; #include <bits/stdc.h>using namespace std; typedef long long ll; typedef double db; typedef long double ldb; typedef pair<int, int> pii; typedef pair<ll, ll>…