接口测试复习Requests PyMysql Dubbo

一。基本概念

接口概念:系统与系统之间 数据交互的通道。
接⼝测试概念:校验 预期结果 与 实际结果 是否⼀致。
特征:
        测试⻚⾯测试发现不了的问题。(因为:接⼝测试 绕过前端界⾯。
        符合质量控制前移理念。
        低成本,⾼收益。
实现⽅式
        ⼯具实现: Postman :使⽤简单。功能较少。
                           Jmeter:功能完善,上⼿难度⼤。
        代码实现: python + requests + pytest     
                           java + HttpClient

二。HTTP协议

协议 :就是规则。要求使⽤的 双⽅,必须严格遵守。
HTTP 协议简介
        HTTP概念: 超⽂本传输协议。基于客户端和服务器的应⽤层协议。
        特性: 1.客户端、服务器模式    2.简单快速   3.灵活   4.⽆状态   5.⽆连接
URL
定义:URL(uniform Resource Locator) 统一资源定位符,网络资源地址
HTTP使用URL来来建立连接和传送数据
URL组成:协议://hostname[:port]/path/[?查询参数1&查询参数2]
格式:协议 :// 域名 : 端⼝号 / 资源路径?查询参数 1& 查询参数 2...
协议:指定数据传输的规则 :http 和 https
域名:在⽹络环境中,定位⼀台主机。 本质:IP 地址
端⼝号:在⽹络主机上,定位⼀个进程(应⽤程序)。 可以省略,端⼝号跟随协议。
        http: 80
        https: 443
资源路径:指定要访问的 数据资源。 可以没有。如果没有,默认 值为 “/”
查询参数:给数据资源传递的参数 。可以有多个,
⽤ & 隔分 每⼀组查询参数,采⽤ k=v 键值对格式
下面URL的各个组成部分
http://www.weather.com.cn/data/sk/101010100.html
协议:http
域名:www.weather.com.cn
端口:80
资源路径:/data/sk/101010100.html
查询参数:无

三。HTTP请求

产⽣端: ⼀定产⽣于 客户端。
数据格式:请求行,请求头,请求体
整体格式
        请求⾏(http 请求第⼀⾏)
        请求头(第⼆⾏开始,到空⾏之前)
        空⾏(代表请求头结束)
        请求体(空⾏之后,直到结束)
示例:
POST http://demo.zentao.net/user-login.html HTTP/1.1
Host: demo.zentao.net
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101
Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://demo.zentao.net/user-login.html
Content-Type: application/x-www-form-urlencoded
Content-Length: 54
Connection: keep-alive
Upgrade-Insecure-Requests: 1
account=demo&password=efc4a3b32e48054865e5a8321cfda3e4
请求⾏ 组成:请求⽅法(空格)URL (空格)协议版本
请求⽅法:
        get:查询 —— 没有请求体
        post:添加(登录、注册)
        put:修改
        delete:删除 —— 没有请求体
URL :语法格式⻅上。
协议版本:默认常⽤ HTTP/1.1
请求头
内部所有数据,均采⽤ k:v 语法格式 .
Content-Type:请求体数据类型
 text/html: HTML格式
 text/plain:纯文本格式
 image/jpeg:jpg图片格式
 application/json: JSON数据格式
 application/x-www-form-urlencoded: 表单默认的提交数据格式
 multipart/form-data: 在表单中进行文件上传时使用
请求体
        get、 delete 请求,没有请求体
        post、 put 请求,有请求体
        请求体中的数据类型,受 请求头中 Content-Type 的 值影响。
        位置:空白行之后的内容
        作用:传输数据实体
        请求体常在POST、PUT方法中使用
        常配合的请求头:Content-Type和Content-Length

四。HTTP响应

产⽣端:
⼀定是在服务器接受到 http 请求后,回发响应数据。
整体格式
响应⾏(第⼀⾏)
响应头(第⼆⾏开始,到空⾏结束)
空⾏(表示响应头结束)
响应体(空⾏,直到结束)

响应行也叫状态行

        位置:响应数据中第一行
        作用:描述服务器处理结果
        内容:状态行由协议版本号、 状态码 、状态消息组成
状态码三位数字组成,第一个数字定义响应类别:
1xx:指示信息
2xx:成功
3xx:重定向
4xx:客户端错误
5xx:服务器端错误
响应头
位置:第二行开始到空白行之间
作用:描述客户端要使用的一些附加信息
特点:响应头由键值对组成,每行一对
响应体
位置:响应数据空白行之后
作用:服务器返回的数据实体
特点:有图片、json、xml、html等多种类型

四。接口规范

传统接口特性:
        请求⽅法,统⼀使⽤ get post
        针对⼀个资源的操作,URL 不唯⼀
        响应状态码统⼀使⽤ 200 表示
RESTful ⻛格接⼝
        特性:请求⽅法,与 http 协议对应。
                get —— 查询
                post —— 添加
                put —— 修改
                delete —— 删除
针对⼀个资源的操作, URL 唯⼀。 只看 URL ⽆法确定具体操作。
状态码使⽤较灵活

五。接口测试流程

1. 需求分析(产品经理产出的需求⽂档)
2. 接⼝⽂档解析(由开发产出接⼝⽂档)
3. 编写接⼝测试⽤例(将⽤例⽤ Excel形式表现)
4. 编写接⼝测试脚本
⼯具(postman)⽣成脚本
代码(python)编写,⽣成脚本
5. 执⾏脚本,跟踪缺陷
6. ⽣成接⼝测试报告
7. (可选)接⼝⾃动化持续集成

六。接口文档解析

接口文档 :又称为API文档,是由后端开发编写,用来描述接口信息的文档。
为什么要写接口文档 ? 协同:团队人员工作协同配合 。约束:项目更新修改同步维护
接口解析要关注的核心要素?
1.请求报文:请求方法/请求路径/请求数据
2.响应报文:响应状态码/响应数据
接口文档的内容:
基本信息 : 接口名称、接口描述
请求参数 :1. 请求方法 2. 请求路径3.请求头 4.请求数据:字段、说明、类型、备注、是否必填  
返回参数 :1. 响应状态码 2.响应数据:字段、说明、类型、备注、是否必填 3.data结构类型

七。Requests库

resp = requests.请求方法(url='URL地址', params={k:v}, headers={k:v},  
                        data={k:v}, json={k:v}, cookies='cookie数据'(如:令牌))
请求方法:
    get请求 - get方法
    post请求 - post方法
    put请求 - put方法
    delete请求 - delete方法
    
url:要访问的地址       - string类型
params:查询参数         - 字典
headers:请求头          - 字典
data:表单格式请求体数据  - 字典  - 
json:json格式请求体数据  - 字典  - 

cookies:用来传递cookies

resp:代表响应结果。

==获取指定响应数据==

常用:

  • 获取 URL: resp.url

  • ==获取 响应状态码:resp.status_code==

  • 获取 Cookie:resp.cookies

  • 获取 响应头:resp.headers

  • 获取 响应体:

    • 文本格式:resp.text

    • ==json格式:resp.json()==。 如果看到 JSONDecodeError 错误提示,说明 不能转换为 json

八。cookies和session

设置cookies

获取cookies:cookies=response.cookies

requests.get(url,cookies={"c1":"v1"} 

Cookie简介

  • cookie 是工程师,针对 http协议 是无状态这一特征,设计的一种技术。

  • cookie 将数据保存在浏览器端。默认存储空间大小为 4k(可以修改)。

  • cookie 中的数据,用户和随意获取,没有安全性可言。

  • cookie 中存放的数据类型,受浏览器限制。

  • cookie 中大多存放于网络通信相关的不敏感数据信息。提高访问速度。如:用户名、登录状态等。

Session简介

概念:也叫 会话!从客户端登录服务器开始,直到客户端退出登录,所产生的所有通信数据,保存在 session中。

  • session 将数据存在服务器端

  • session 使用服务器存储空间,没有大小限制。

  • session 支持的数据类型,受服务器主机影响。几乎支持所有数据类型。

  • session 中的数据,大都采用 加密、转码存储。安全性较高。

Session自动管理Cookie

因为,cookie中的数据,都是由 session 提供的。

实现步骤:

  1. 创建 session 对象(实例)。 my_session = requests.Session()【注意:() 不能丢!!!】

  2. 使用 session实例,调用get方法,发送 获取验证码请求(不需要提取cookie)。 my_session.get()

  3. 使用同一个 session实例,调用post方法,发送登录请求(不需要携带cookie)。my_session.post()

  4. 使用同一个 session实例,调用get方法,发送查看我的订单页面请求(不需要携带cookie)。my_session.get()

# 导包
import requests

# 1. 创建session实例
my_session = requests.Session()

# 2. 使用session实例,调用 get方法,发送 获取验证码请求
resp1 = my_session.get(url="http://tpshop-test.itheima.net/index.php?m=Home&c=User&a=verify")
# print(resp1.text)

# 3. 使用同一个session实例,调用 post方法,发送 登录请求。(正确 用户名、密码)
resp2 = my_session.post(url="http://tpshop-test.itheima.net/index.php?m=Home&c=User&a=do_login",
                        data={"username": "13812345678", "password": "123456", "verify_code": "8888"})
print("登录结果:", resp2.json())

# 4. 使用同一个session实例,调用 get方法,查询我的定义页面。
resp3 = my_session.get(url="http://tpshop-test.itheima.net/Home/Order/order_list.html")

# 5. 打印响应结果
print("我的订单页面:", resp3.text)

面试题 Cookie 和 Session 区别
  1. 数据存储位置:

    • Cookie 存储在 浏览器端

    • Session 存储在 服务器端

  2. 安全性:

    • Cookie 直接存储在浏览器,可以任意获取,没有安全性可言。

    • Session 存储在 服务器端,采用 加密、转码形式存储数据,安全性较高。

  3. 数据类型

    • Cookie 直接存储在浏览器,支持测试数据类型受浏览器限制

    • Session 存储在 服务器端,服务器就是一台主机。因此几乎支持所有的数据类型。

  4. 大小:

    • Cookie 默认大小 4k(可调)

    • Session 直接使用服务器存储。没有大小限制。

九。PyMySQL操作数据库

==操作步骤==

  1. 导包 import pymysql

  2. 创建 连接 conn = pymyql.connect()

  3. 创建 游标 cursor = conn.cursor()

  4. 执行 SQL 语句 cursor.execute( “sql 语句” )

    • 查询语句 select —— 不修改数据库,会返回结果集

      • 从结果集中,提取 想要的数据 cursor.fetch*()

    • 增删改语句 insert、update、delete —— 没有 结果返回,会修改数据库

      • 执行成功:提交事务。conn.commit()

      • 执行失败:回滚事务。conn.rollback()

  5. 关闭游标 cursor.close()

  6. 关闭连接 conn.close()

十。日志收集

日志
日志就是用于记录系统运行时的信息,对一个事件的记录;也称为 Log
有哪些信息需要记录?
脚本运行过程中某个重要变量的值
方法的输入参数和返回结果
异常信息
日志作用:
1.调试程序
2.了解系统程序运行的情况,是否正常
3.系统程序运行故障分析与问题定位
4.用来做用户行为分析和数据统计
日志级别
日志级别:是指日志信息的优先级、重要性或者严重程度
当为程序指定一个日志级别后,程序会记录所有日志级别 大于或等于 指定日志级别的日志信息,而不是仅仅记录指定级别的日志信息;
一般建议只使用DEBUG、INFO、WARNING、ERROR这四个级别
日志收集的位置:
控制台 :方便自动化测试脚本的调试
日志文件:可以把日志长久的保存起来
需要达成的效果:
1. 可以把日志输出到不同位置
        控制台
        日志文件(防止日志文件过大,每日生成一个日志文件)
2. 记录更加详细的日志信息
        打印日志的时间
        日志的级别
        打印日志的位置
        日志内容
3. 可以打印不同级别的日志如  INFO ERROR

十一。代码分层

  • 分层思想:

    • 按代码功能,划分为 接口对象层、测试脚本层

  • 接口对象层:

    • 负责 发送 http请求,访问待测接口。返回响应数据。

  • 测试用例层(测试脚本层):

    • 调用 接口,按响应数据,断言完成测试。

封装思想:

  • 将 普通方式实现代码中,固定不变的,直接写到方法的实现内部。

  • 将动态变化的,从参数传入。

  • 将响应结果,通过返回值 return

十二。Unittest框架

unittest是Python标准库中的一个单元测试框架,用于编写和执行单元测试。它提供了一组用于编写测试用例、运行测试以及生成测试报告的类和方法。

下面是unittest框架的一些重要概念和使用方法:

  1. 测试用例(Test Case):测试用例是单元测试的最小单位,它是一个独立的测试单元,用于验证代码的某个具体功能或行为。通常继承自unittest.TestCase类,并包含一个或多个测试方法。

  2. 测试方法(Test Method):测试方法是测试用例中的一个函数,以test_开头,用于执行具体的测试逻辑。可以在测试方法中使用断言(assert)来验证预期结果和实际结果是否一致。

  3. 测试套件(Test Suite):测试套件是由多个测试用例组成的集合,用于按照一定顺序运行多个测试。

  4. 测试运行器(Test Runner):测试运行器是用于执行测试的工具,可以运行单个测试用例、单个测试模块或整个测试套件,并生成测试报告。

  5. 断言方法(Assertion Methods):断言方法是用于验证测试结果的方法,可以判断实际结果与预期结果是否相等、是否为真等。例如,assertEqual()用于判断两个值是否相等。

 十三。参数化

参数化步骤

  1. 将 测试数据,按 [{},{},{}] 格式 组织到 json文件中。

  2. 读取 json文件,将数据转换为 [(),(),()]

  3. 在通用测试方法上一行,添加 @pytest.mark.parameterize()

  4. 给 parameterize() 传参。参1:字符串类型,内容为 json文件中一组数据的 key。参2:[(),(),()]格式数据。

  5. 给 通用测试方法添加形参,与 parameterize() 参1 字符串的内容一致。

  6. 修改 通用测试方法 内部实现,使用形参。

# 将测试数据 组织到 json文件中
[{"x": 10, "y": 20, "expect": 30},{"x": 100, "y": 200, "expect": 300},{"x": 1000, "y": 2000, "expect": 3000}
]
--------------------------------------------------------------
import pytest
import json# 待测 函数
def add(x, y):return x + y# 封装函数,读取json文件,将 [{},{},{}] 数据 转换为 [(),(),()] 格式的数据
def read_json_data(filename):with open(filename, "r", encoding="utf8") as f:json_data = json.load(f)data_list = []for data in json_data:val = data.values()tmp = tuple(val)data_list.append(tmp)# 必须返回,不能在 for 内return data_list  # 返回 [(10, 20, 30), (100, 200, 300), (1000, 2000, 3000)]# 结合 pytest 定义测试类
class TestAddFunc(object):@pytest.mark.parametrize("x, y, expect", read_json_data("add_data.json"))  # 参2 要求必须是 [(),(),()] 格式的数据def test_add(self, x, y, expect):  # 通用测试方法res = add(x, y)  # 调用 待测函数,得实际结果assert expect == res  # 断言

十四。接口自动化测试框架

目录结构

  • api/:接口对象层(代码:python package)

  • scripts/:测试脚本层(代码:python package)

  • common/:通用工具方法、函数(代码:python package)

  • data/:测试数据文件(文件:dir)

  • report/:测试报告(文件:dir)

  • config.py: 项目中的 配置信息。(全局变量)

  • pytest.ini: pytest 配置

1.在data/下组织数据文件

2.

  1. 在 common/ 下创建 文件 read_json_file.py

  2. 在 文件内,创建 函数,读取json文件中的数据,转换成 [(),(),()] 格式数据

  3. 测试此函数功能通过

  4. 建议读取 json文件时,使用 绝对路径法传入文件名

  5. 在 config.py 中,添加 全局变量,获取 项目目录 BASE_DIR = os.path.dirname(__file__)

  6. 拼接 json文件的绝对路径 filename = BASE_DIR+"/data/login_data.json"

  7. 使用 绝对路径,传入 json文件读取函数。 read_json_data(filename)

import json# 定义工具函数,读取json文件中的数据,转换成 [(),(),()] 格式数据
def read_json_data(filename):with open(filename, "r", encoding="utf8") as f:json_data = json.load(f)login_list = []for data in json_data:tmp = tuple(data.values())login_list.append(tmp)return login_listif __name__ == '__main__':res = read_json_data("../data/login_data.json")print(res)

3.在common下写断言工具和数据库操作类

4.在api下写登录工具和员工管理工具

5.解决重复手机号问题,

  • 在 测试 添加员工接口前(setup),保证 数据库中,无此手机号!执行 delete SQL语句,将欲使用的手机号删除。

  • 使用 这个手机号,展开 添加员工接口的 测试。

  • 在 测试 添加员工接口结束后(teardown),删除 添加员工接口测试时,使用的手机号。

    def setup(self):del_sql = f"delete from bs_user where mobile='{TEL}';"DBTools.db_uid(del_sql)def teardown(self):del_sql = f"delete from bs_user where mobile='{TEL}';"DBTools.db_uid(del_sql)

6.获取请求头

  1. 在 common/ 下创建文件 get_header.py

  2. 文件中添加 代码,获取请求头,并测试无误

from api.ihrm_login_api import IhrmLoginApidef get_header():req_data = {"mobile": "13800000002", "password": "123456"}resp = IhrmLoginApi.login(req_data)header = {"Authorization": resp.json().get("data")}return headerif __name__ == '__main__':ret = get_header()print(ret)

7.生成测试报告,储存在report目录下

十五。全量字段校验

十六。Dubbo

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

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

相关文章

Jupyter notebook怎么设置自动跳转问题

1.点击开始,就可以看到Jupyter,然后点击 2.结果就这样: 3你可以复制地址到浏览器,结果: 但是这么做很麻烦,所以有没有更好的办法呢?当然有下面就开始介绍 1.打开cmd(winr,输入cmd),输入以下命令…

YAMLException : java.nio.charset.MalformedInputException : Input length = 1

场景还原 有小伙伴反应SpringBoot项目启动异常,但是同组其他伙伴的无问题! ERROR org.springframework.boot.SpringApplication - Application run failedorg.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException : Inpu…

AMEYA360分析:纳芯微推出超低功耗TMR开关/锁存器 NSM105x系列

纳芯微推出基于隧道磁阻 (TMR) 的超低功耗磁开关/锁存器NSM105x系列,为数字位置检测提供高精度的解决方案,可被广泛应用于工业与消费领域的位置检测。 NSM105x产品系列包含了3个产品型号,即NSM1051(单极开关)、NSM1052(全极开关)、NSM1053(锁…

Linux-ubuntu系统查看显卡型号、显卡信息详解

lspci | grep -i vga #----output------ 01:00.0 VGA compatible controller: NVIDIA Corporation Device 2504 (rev a1) PCI devices

基于生物地理学优化的BP神经网络(分类应用) - 附代码

基于生物地理学优化的BP神经网络(分类应用) - 附代码 文章目录 基于生物地理学优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.生物地理学优化BP神经网络3.1 BP神经网络参数设置3.2 生物地理学算法应用 4…

在Linux怎么用vim实现把一个文件里面的文本复制到另一个文件里面

2023年10月9日,周一下午 我昨天遇到了这个问题,但在网上没找到图文并茂的博客,于是我自己摸索出解决办法后,决定写一篇图文并茂的博客。 情景 假设现在我要用vim把file_transfer.cpp的内容复制到file_transfer.hpp里面 第一步 …

javaee SpringMVC文件上传 项目结构

引入依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…

手机切换ip地址的几种方法详解

在某些情况下&#xff0c;我们可能需要切换手机的IP地址来实现一些特定的需求&#xff0c;如解决某些应用程序的限制、绕过IP封禁等。本文将为大家分享几种切换手机IP地址的方法&#xff0c;让您能够轻松应对各种需求。 一、使用动态服务器 使用动态服务器是一种常见的切换手机…

GitHub基础

1、仓库是什么意思&#xff1f;仓库拥有者是谁&#xff1f; 在软件开发或版本控制系统中&#xff0c;"仓库"&#xff08;Repository&#xff09;是指存储项目代码、配置文件、文档等相关文件的地方。它可以看作是一个中央存储库&#xff0c;用于管理和跟踪项目的各个…

微服务技术栈-Nacos配置管理和Feign远程调用

文章目录 前言一、统一配置管理1.添加配置文件2.微服务拉取配置3.配置共享 三、Feign远程调用总结 前言 在上篇文章中介绍了微服务技术栈中Nacos这个组件的概念&#xff0c;Nacos除了可以做注册中心&#xff0c;同样可以做配置管理来使用。同时我们将学习一种新的远程调用方式…

迅为龙芯开发板开发板系统烧写-启动系统

上面所有的步骤我们都做完以后&#xff0c;输入命令 sync 确保我们之前的步骤都可以保存到 ssd&#xff0c;接着拔下 U盘&#xff0c;最后输入命令 reboot 重启开发板&#xff0c;如下图所示&#xff1a; 如果启动成功&#xff0c;我们会看到 pmon 从硬盘加载 linux 内核和文件…

烟雾文字动画效果

效果展示 CSS 知识点 transform 属性运用transform-origin 属性运用烟雾文字实现 整体页面结构布局实现 <section><p class"text">Lorem ipsum dolor sit amet consectetur adipisicing elit. Vero dolorevoluptas incidunt exercitationem. Consecte…

路径总和 III

题目链接 路径总和 III 题目描述 注意点 二叉树的节点个数的范围是 [0,1000]求该二叉树里节点值之和等于 targetSum 的 路径 的数目 解答思路 可根据前缀和的思路解决本题&#xff0c;前缀和表示从根节点开始&#xff0c;往左或往右组成的路径和&#xff0c;统计从根节点开…

大数据学习(1)-Hadoop

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博>主哦&#x…

Nginx支持SNI证书,已经ssl_server_name的使用

整理了一些网上的资料&#xff0c;这里记录一下&#xff0c;供大家参考 什么是SNI&#xff1f; 传统的应用场景中&#xff0c;一台服务器对应一个IP地址&#xff0c;一个域名&#xff0c;使用一张包含了域名信息的证书。随着云计算技术的普及&#xff0c;在云中的虚拟机有了一…

怎么压缩图片?图片压缩技巧快学来

在数字时代&#xff0c;我们常常需要处理各种类型的文件&#xff0c;包括图片&#xff0c;然而&#xff0c;图片文件往往占用大量空间&#xff0c;尤其是在传输和存储时&#xff0c;为了解决这个问题&#xff0c;我们可以使用图片压缩工具来减小图片的体积&#xff0c;提高传输…

面试算法22:链表中环的入口节点(1)

题目 如果一个链表中包含环&#xff0c;那么应该如何找出环的入口节点&#xff1f;从链表的头节点开始顺着next指针方向进入环的第1个节点为环的入口节点。 例如&#xff0c;在如图4.3所示的链表中&#xff0c;环的入口节点是节点3。 分析 第1步&#xff1a;确认是否包含环…

ES系列十二、ES的scroll Api及分页实例

1.官方api 1.Scroll概念 Version&#xff1a;6.1 英文原文地址&#xff1a;Scroll 当一个搜索请求返回单页结果时&#xff0c;可以使用 scroll API 检索体积大量&#xff08;甚至全部&#xff09;结果&#xff0c;这和在传统数据库中使用游标的方式非常相似。 不要把 scroll 用…