首页 > 其他分享 >二、接口自动化测试(1)

二、接口自动化测试(1)

时间:2024-05-23 23:08:32浏览次数:15  
标签:sql 接口 lv pymysql 测试 自动化 print requests response

一、什么是接口测试

先回顾一下原理:参考网站:https://blog.csdn.net/HUA1211/article/details/131959650

接口测试的原理就是模拟客户端向服务器发送请求,服务器接收请求报文后对相应的报文做处理并向客户端返回应答,客户端接收应答的过程。接口测试采用的方法其实与黑盒测试一致的,甚至可以把接口测试理解为没有界面的功能测试。只不过接口测试的关注点主要在请求和响应上。另外,还包括接口的安全,接口的性能等。常用的用例设计有等价类,边界值法等。一般测试用例的设计要从单接口参数的校验到整个业务功能点的验证,还可以验证一些安全性和异常情况。

二、为啥做接口自动化

**实现方式**
- 工具(jmeter, postman, ...)
- 编码(python, java, ...)

**比较**
- 工具:
  - 优点: 1.不需要编程基础 2.功能都是封装好的, 直接调用
  - 缺点: 不灵活
- 编码:
  - 优点: 灵活
  - 缺点: 1.需要编程基础 2.功能需要自实现, 效率偏低
JMeter接口测试的不足:
  1. 脚本的灵活性。虽然JMeter提供了一定的BeanShell编程能力和自定义协议的扩展能力,可以让脚本开发人员有一定的灵活性,受制于JMeter本身的限制,与开发人员直接使用语言进行接口测试相比,灵活性还是相对不足。

  2. 报告的能力。JMeter提供了HTML报告,但是JMeter本身的测试报告主要用于性能测试,反映的更多是性能测试层面的结果。而且配置过程比较复杂,在团队成员分享报告等方面比较麻烦。

  3. 持续集成。利用第三方的Jenkins插件、Ant和Maven等,能与JMeter进行一些基本的持续测试集成,但是对于完全自动化所需的测试环境的管理等功能支持不足,配置过程略嫌麻烦。

  4. 测试脚本和测试结果的管理:脚本和结果基本都是本地管理,无法做到在线管理。

  5. 不支持前端测试, 使用Jmeter无法验证JS程序,也无法验证页面,所以需要手工去验证。

  6. Jmeter的断言功能不是很强大

  7. 就算是jmeter脚本顺利执行,依旧无法确定程序是否正确执行,有时候需要进入程序查看,或者查看Jmeter的响应数据。

  8. Jmeter脚本的维护需要保存为本地文件,而每个脚本文件只能保存一个测试用例,不利于脚本的维护。

  9. 调试不方便,不容易从结果提示错误中快速定位到错误点具体位置,例如一次测试几百个接口,如果有几个接口出现了问题,还得一个一个去翻查找

  10. 在接口自动化测试中,较难给测试接口快速提供可测试环境,或者说较难提供自己想要的测试环境

  11. 使用过程中单位不规范(有时候单位秒、分)

Python接口自动化特点:

  1. Python 做接口自动化有自带的框架,如 Pytest、Unittest 等;
  2. 学会了 Python 接口自动化,再学 UI 自动化就很容易上手,原理相同;
  3. Python 接口自动化难点在于测试框架,需要自己封装,否则没有创新点;
  4. Python 的框架可以自由设计,函数可以自己封装,相对灵活,可扩展性较强;
  5. Python 写接口自动化脚本需要时间,不适合紧急迭代的项目。

三、接口自动化框架的实现

一、流程

  1. 需求分析

  2. 挑选需要做自动化测试的功能接口(相当于测试计划)

  3. 设计测试用例

  4. 搭建自动化测试环境[可选]

  5. 设计自动化测试项目的架构[可选]

  6. 编写代码

  7. 执行测试用例

  8. 生成测试报告并分析结果

二、pymysql+requests+pytest

https://blog.csdn.net/weixin_74783615/article/details/135184310

1、pymysql:
功能:pymysql 是 Python 语言操作 MySQL 数据库的一个库,提供了对 MySQL 数据库的连接、查询、数据操作等功能。
使用场景:当你需要在 Python 中连接 MySQL 数据库,并执行数据库操作时,可以使用 pymysql。

2、requests:
功能:requests 是一个简洁且功能强大的 HTTP 请求库,用于发送 HTTP 请求和处理响应。
使用场景:当你需要在 Python 中进行 HTTP 请求,例如与 Web 服务进行通信、调用 API 接口等时,可以使用 requests。

3、pytest:
功能:pytest 是 Python 中的一个单元测试框架,用于编写和执行测试用例,并生成测试报告。
使用场景:当你需要对 Python 代码进行单元测试,验证代码的正确性和健壮性时,可以使用 pytest。
pytest 是 python 的一种第三方的单元测试框架, 同自带的 unittest 测试框架类似, 相比于 unittest 框架使用起来更简洁, 更高效

(一)、pymysql

  1. 创建了一个连接 connection

  2. 获取游标 cursor

  3. 执行sql语句

  4. 关闭游标 cursor

  5. 关闭连接 connection

查:

 

"""
    使用 pymysql 连接数据库, 无论增删改查哪种操作, 操作流程基本一致
    1.导包
    2.创建连接(桥)
    3.创建游标(驴)
    4.核心操作: 发送 sql 语句
    5.释放资源(先驴后桥)
"""
# 1.导包
import pymysql
# 2.创建连接(桥)
myConn = pymysql.Connect(host="127.0.0.1", port=3306, database="test", user="root", password="123456", charset="utf8")
# 3.创建游标(驴)
lv = myConn.cursor()
# 4.核心操作: 发送sql语句(查询)
# 4.1 编写sql语句
sql = "SELECT * FROM t_area"
# 4.2 执行sql
lv.execute(sql)
# 4.3 获取响应结果
# 4.3.1 获取相应结果行数
print("响应结果行数:", lv.rowcount)
# 4.3.2 逐行获取数据
# row1 = lv.fetchone()
# row2 = lv.fetchone()
# row3 = lv.fetchone()
# row4 = lv.fetchone()
# row5 = lv.fetchone()
# print("第1行数据:", row1)
# print("第2行数据:", row2)
# print("第3行数据:", row3)
# print("第4行数据:", row4)
# print("第5行数据:", row5)
# 4.3.3 获取所有数据
rows = lv.fetchall()
print("所有数据:", rows)
for row in rows:
print("每一条:", row)
print("id", row[0])
print("区域名称", row[1])
print("优先级", row[2])
print("创建时间", row[3])
print("更新时间", row[4])

# 5.释放资源(先驴后桥)
lv.close()
myConn.close()

增:

# 1.导包
import pymysql
# 2.创建连接(桥)
myConn = pymysql.Connect(host="127.0.0.1", port=3306, database="test", user="root", password="123456", charset="utf8")
# 3.创建游标(驴)
lv = myConn.cursor()

# 4.核心操作: 发送sql语句(增------------------------------)
# 4.1 编写sql语句
sql = "insert into t_area(area_name, priority) values('咚咚咚', '123')"
# 4.2 执行sql
lv.execute(sql)
myConn.commit()
# 4.3 获取响应结果
print("响应结果行数:", lv.rowcount)

# 5.释放资源(先驴后桥)
lv.close()
myConn.close()

改:

# 1.导包
import pymysql
# 2.创建连接(桥)
myConn = pymysql.Connect(host="127.0.0.1", port=3306, database="test", user="root", password="123456", charset="utf8")
# 3.创建游标(驴)
lv = myConn.cursor()

# 4.核心操作: 发送sql语句(改------------------------------)
# 4.1 编写sql语句
sql = "update t_area set area_name='嘻嘻嘻' where area_id=28"
# 4.2 执行sql
lv.execute(sql)
myConn.commit()
# 4.3 获取响应结果
print("响应结果行数:", lv.rowcount)

# 5.释放资源(先驴后桥)
lv.close()
myConn.close()

删:

# 1.导包
import pymysql
# 2.创建连接(桥)
myConn = pymysql.Connect(host="127.0.0.1", port=3306, database="test", user="root", password="123456", charset="utf8")
# 3.创建游标(驴)
lv = myConn.cursor()

# 4.核心操作: 发送sql语句(删------------------------------)
# 4.1 编写sql语句
sql = "delete from t_area where area_id=28"
# 4.2 执行sql
lv.execute(sql)
myConn.commit()
# 4.3 获取响应结果
print("响应结果行数:", lv.rowcount)

# 5.释放资源(先驴后桥)
lv.close()
myConn.close()

事务操作:

# 1.导包
import pymysql
# 2.创建连接(桥)
myConn = pymysql.Connect(host="127.0.0.1", port=3306, database="test", user="root", password="123456", charset="utf8")
# 3.创建游标(驴)
lv = myConn.cursor()

# 4.核心操作: 发送sql语句(事务------------------------------)
try:
    sql1 = "insert into t_area(area_name, priority) values('咚咚咚', '111')"
    sql2 = "insert into t_area(area_name, priority) values('嘻嘻嘻', '222')"
    # 执行sql1(插入数据A)
    lv.execute(sql1)
    # 执行sql2(插入数据B)
    lv.execute(sql2)
    # 提交(写入数据库)
    myConn.commit()
except Exception as e:
    print("error:", e)
    # 回滚(拒绝写入数据库)
    myConn.rollback()

# 5.释放资源(先驴后桥)
lv.close()
myConn.close()

封装:

"""
实现封装:
    将 pymysql 的常见用法实现封装进一个专门工具类
    封装的功能: 1.获取连接 2.获取游标 3.释放资源
"""
import pymysql

class DBUtils:
    # 工具函数 1.获取连接
    @classmethod
    def get_conn(cls):
        return pymysql.Connect(host="127.0.0.1", port=3306, database="test", user="root", password="123456", charset="utf8")

    # 工具函数 2.获取游标
    @classmethod
    def get_cursor(cls, conn):
        return conn.cursor()

    # 工具函数 3.释放资源
    @classmethod
    def close_res(cls, cursor, conn):
        if cursor:
            cursor.close()
        if conn:
            conn.close()

调用:

"""
实现调用:
    以查询数据库为例, 调用工具类中封装的功能
"""

# 导包
from pymysql_19 import DBUtils

# 调用获取连接的工具函数
conn = DBUtils.get_conn()

# 调用获取游标的工具函数
lv = DBUtils.get_cursor(conn)

# 核心: 查询为例
sql = "select * from t_area"
lv.execute(sql)
print(lv.fetchall())

# 调用释放资源的工具函数
DBUtils.close_res(lv, conn)

(二)、requests

"""
    需求: 编写 python 代码, 访问案例的查询接口 (/sa/listarea)

    流程: 三要素
        1.根据 url 定位接口资源
        2.提交测试数据
        3.发送请求, 接收并处理响应结果
"""
# -----------------------get请求----------------------
# 导包
import requests
# 一行代码搞定
response = requests.get("http://localhost:8081/sa/listarea")
# 打印结果
print("状态码:", response.status_code)
print("响应体:", response.text)
# -----------------------post请求---------------------
# 导包
import requests
# 三要素
data = {"areaName": "中发白", "priority": "123"}
response = requests.post("http://localhost:8081/sa/addarea", data=data)
print("状态码:", response.status_code)
print("响应体:", response.text)
# -----------------------put请求---------------------
# 导包
import requests
# 三要素
myJson = {
    "areaId": "40",
    "areaName": "东南西北中发白",
    "priority": "888"
}
response = requests.put("http://localhost:8081/sa/modifyarea", json=myJson)
print("状态码:", response.status_code)
print("响应体:", response.text)
# -----------------------delete请求-------------------
# 导包
import requests
# 三要素
response = requests.delete("http://localhost:8081/sa/removearea", params={"areaId": "40"})
print("状态码:", response.status_code)
print("响应体:", response.text)
"""
    需求: 响应由行头体三部分组成, 需要用requests 相关实现解析响应中的行头体
"""

import requests

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

# 行解析
print("URL:", response.url)
print("状态码:", response.status_code)
print("-"*80)

# 头获取
print("获取所有响应头:", response.headers)
print("获取所有cookie:", response.cookies)
print("获取所有编码集:", response.encoding)
print("-"*80)

# 体获取
print("以文本的方式获取响应体:", response.text)    # 服务器传过来的是文本信息, 如 html 文档
# print("以二进制的方式获取响应体:", response.content)    # 服务器传过来的是图片/视频/音频等非文本数据
# print("以JSON的方式获取响应体:", response.json())    # 服务器传过来的是json格式数据, 调用该方法以json语法解析数据
'''
requests登录实现cookie
'''
import requests

# 1.获取验证码, 并获得 cookie  中的 PHPSESSID
response1 = requests.get("http://localhost/index.php?m=Home&c=User&a=verify")
print(response1.status_code)
print(response1.cookies)
id = response1.cookies.get("PHPSESSID")
print(id)
print("-"*80)

# 2.登录, 并提交cookie
data = {"username": "17150312012", "password": "123456", "verify_code": "8888"}
cookie = {"PHPSESSID": id}
response2 = requests.post("http://localhost/index.php?m=Home&c=User&a=do_login", data=data, cookies=cookie)
print(response2.status_code)
print(response2.text)
print("-"*80)

# 3.获取订单, 需要再次提交 cookie
response3 = requests.get("http://localhost/Home/Order/order_list.html", cookies=cookie)
print(response3.status_code)
print(response3.text)
'''
    requests登录实现session
'''
import requests

# 创建 session 对象
session = requests.Session()

# 1.获取验证码(隐式获取cookie)
response1 = session.get("http://localhost/index.php?m=Home&c=User&a=verify")
print(response1.status_code)
print("-"*80)

# 2.登录
data = {"username": "17150312012", "password": "123456", "verify_code": "8888"}
response2 = session.post("http://localhost/index.php?m=Home&c=User&a=do_login", data=data)
print(response2.status_code)
print(response2.text)
print("-"*80)

# 3.获取订单
response3 = session.get("http://localhost/Home/Order/order_list.html")
print(response3.status_code)
print(response3.text)

标签:sql,接口,lv,pymysql,测试,自动化,print,requests,response
From: https://www.cnblogs.com/meifirst/p/18209543

相关文章

  • 白盒测试(测试方法)
        白盒测试也称为结构测试,根据程序的内部结构和逻辑来设计测试用例,对程序的路径和过程进行测试,检查是否满足设计的需要。    白盒测试常用的技术是逻辑覆盖、循环覆盖和基本路径测试。(1)逻辑覆盖。逻辑覆盖考察用测试数据运行被测程序时对程序逻辑的覆盖程......
  • TS类,接口,泛型的简介
    //1.类的属性和方法classDog{name:string="旺财";age:number=2;shout(){console.log("汪汪汪")}}letdog=newDog()//2.类的构造函数(用于给类中的属性设定初始值,在创建类的实例时会被触发)classCat{name:string;ag......
  • 无线网卡有几种接口?怎么给电脑选择一款合适的无线网卡?
    前言这篇文章一共有两个问题:无线网卡有几种接口怎么给电脑选择一款合适的无线网卡目测这一期的文章很长很长,但不水。想要给笔记本或台式机升级无线网卡的小伙伴看过来了!最近有小伙伴问:华硕r555笔记本能不能升级无线网卡,毕竟原机自带的网卡是百兆的,速度太慢了。想当......
  • Java中继承与接口的区别(浅谈)
    在Java中,继承和接口是两种不同的方式来实现代码的复用和扩展。以下是它们之间的主要区别:1.继承:继承是面向对象编程中的一种方式,允许一个类继承另一个类的属性和方法。继承的主要目的是为了实现代码的复用,即子类可以继承父类的属性和方法,从而避免重复编写相同的代码。此外,继......
  • 测试环境建设原则和问题对策
    《Pattern:ServiceMesh》测试环境建设原则和管理实践测试环境不稳定&复杂的必然性及其对策......
  • 一、测试基础(3)
    接着(2)中的Web手工项目进行讨论:9、网络基础知识1、GET和POST的区别最直观的区别就是GET把参数包含在URL中,POST通过requestbody(请求体)传递参数GET比POST更不安全,因为参数直接暴露在URL中,所以不能用来传递敏感信息GET请求在URL中传递的参数的长度是有......
  • 用户体验测试体系调研报告
    一用户体验概述1.1用户体验的定义、要素和价值1.1.1定义用户体验的最新定义(ISO-9241-210:2019)为“用户体验是指用户对系统、产品或服务的使用和(或)预期使用所产生的感知和反应”。1.1.2要素 通过用户体验的定义和要素,可以看出用户体验测试应从产品使用前、使用中和使用......
  • 容器的接口访问错误:Recv failure: Connection reset by peer,Gin
    goversiongo1.22.1windows/amd64Windows11+amd64x86_64x86_64GNU/Linux--- 开发了一个golang程序:基于Ginweb框架的服务,部署到了ECS的容器(docker)上,端口40000也暴露成功了。ben发布于博客园#dockerrun-itd--namego1-m128MB-p40000:40000go1:v......
  • 测试理论基础(2)
    四、用例执行——接口联调和接口功能测试功能测试和接口测试的区别在于,功能测试侧重点在于前端ui界面,数据展示,图形界面,业务逻辑操作等,接口测试侧重点在于,后端返回的数据是否正确,接口是否正常。一、接口测试可以通过接口测试工具或者接口测试脚本来进行测试接口测试工具:apipost......
  • 测试理论基础(1)
    一、需求分析项目立项后,对于整体产品的需求进行认识和理解(与功能测试的需求分析是一致的)。注意:此时只有产品需求文档,架构师还没有开始建模,主要目的是保证各部门(产品、开发、测试...)对于需求理解一致。二、需求评审1、周一早上九点,产品经理群发最新迭代版本的prd文档,并约定评审......