Requests接口自动化实战

目录

1.Requests中Session应用--Requests接口自动化关联

2.Requests接口自动化JsonPath应用

3.Requests接口自动化流程实战

1.Requests中Session应用

1.开发一个登录接口

python 复制代码
from flask import Flask, request, jsonify, session
import os

app = Flask(__name__)
app.secret_key = os.urandom(24)  # 设置一个密钥,用于加密 session 数据

# 模拟用户信息,实际项目中需要替换为真实的用户信息
users = {
    'eurika': 'admin',
    'admin': 'admin'
}

# 条件: 必须登录,才能获取信息

# 登录接口
@app.route('/login', methods=['POST'])
def login():
    data = request.get_json()
    username = data.get('username')
    password = data.get('password')

    if username in users and users[username] == password:
        session['logged_in'] = True
        return 'Login successful', 200
    else:
        return 'Login failed', 401

2.开发一个查询信息接口

python 复制代码
# 查询信息接口,需要登录才能访问
@app.route('/get_info')
def get_info():
    if 'logged_in' in session and session['logged_in']:
        # 用户已登录,返回用户信息
        return 'User Info: OK'  # 返回用户信息
    else:
        # 用户未登录,返回未授权的状态码
        return 'Unauthorized', 401

3.添加主入口

ini 复制代码
if __name__ == '__main__':
    app.run(debug=True)

4.发送请求

ini 复制代码
import requests
url_login ='http://127.0.0.1:5000/login'
data = {
    'username': 'eurika',
    'password': 'admin'
}
res = requests.post(url_login, json=data)
print("返回内容是:", res.text)
url_get_info = 'http://127.0.0.1:5000/get_info'
res = requests.get(url_get_info)
print("返回内容是:", res.text)

返回的结果是:

问题: 明明已经登录成功,为什么查询信息显示的是unauthorized的呢?

回答:

requests发送的每一个请求都是完全独立的

每次发送请求都会新打开一个浏览器

发送新的请求时不会记住发送之前请求时候的状态

解决方案:

鉴权

用同一个session(requests中的一个库)来保持会话状态

用session关联的对象,发送多个请求时,会自动关联cookie,并传递cookie

注:必须用同一个session发送请求(如果超过一个就会有问题)

如果是token鉴权,需要手带token手动传递

ini 复制代码
url_login ='http://127.0.0.1:5000/login'
data = {
    'username': 'eurika',
    'password': 'admin'
}
session = requests.session()
res = session.post(url_login, json=data)
print("返回内容是:", res.text)
url_get_info = 'http://127.0.0.1:5000/get_info'
res = session.get(url_get_info)
print("返回内容是:", res.text)

2.Requests接口自动化JsonPath应用

  1. jsonpath的使用-为了提取想要的数据

  2. 安装jsonpath

pip install jsonpath -i pypi.tuna.tsinghua.edu.cn/simple/

  1. jsonpath的语法规则:
  • $ 根节点,也是所有JsonPath表达式的开始

  • . 表示获取子节点

  • .. 表示获取所有符合条件的内容

    • 代表所有的元素节点
  • index\] 表示迭代器的标示(可以用于处理下标等情况)

css 复制代码
data={
    "name": "Alice",
    "age": 25,
    "email": "alice@example.com",
    "address": {
        "street": "456 Elm Street",
        "city": "Los Angeles",
        "country": "USA"
    },
    "hobbies": ["reading", "traveling", "cooking"],
    "education": [
        {
            "degree": "Bachelor's",
            "major": "Computer Science",
            "university": "ABC University",
            "year": 2018
        },
        {
            "degree": "Master's",
            "major": "Business Administration",
            "university": "XYZ University",
            "year": 2020
        }
    ],    # $.education[0].year
    "projects": [
        {
            "name": "Project A",
            "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
            "contributors": ["John", "Sarah", "Mike"],
            "completed": "true",
            "year": 2021
        },
        {
            "name": "Project B",
            "description": "Nulla vel sagittis elit. Vivamus auctor massa in lacinia pellentesque.",
            "contributors": ["Alice", "David"],
            "completed": "false"
        }
    ],   # Sarah 怎么写?表达式  $.projects[0].contributors[1]
    "is_active": "true"
}

找到email的值:

先取出列表:a=data.jsonpath.jsonpath(data,'$.email'}

再取出值:a[0]

找到projects中name为project A的值:

先取出列表:a=data.jsonpath.jsonpath(data,'$.projects[0].name')

再取出值:a[0]

3.Requests接口自动化实战

登录和购物车接口流程测试:

python 复制代码
import requests
import jsonpath

# 登录接口
url_login= 'http://shop-xo.hctestedu.com/index.php?s=/api/user/login&application=app&application_client_type=weixin'
data1 ={
    "accounts": "youyi",
    "pwd": "123456",
    "type": "username"
}
res1 = requests.post(url_login,data=data1)
#获取token
token = jsonpath.jsonpath(res1.json(),'$.data.token')[0]
print(res1.json())
print('token',token)

#购物车接口
# 字符串格式串
url_cart = f'http://shop-xo.hctestedu.com/index.php?s=/api/cart/save&application=app&application_client_type=weixin&token={token}'
data2 = {
    "goods_id":"2",
    "stock":"3"
    }
res2 = requests.post(url_cart,data=data2)
print('购物车返回结果',res2.json())

这里也可以用session,如果是cookie,发送请求时浏览器会自动带cookie过去

如果是token,不会自动传值,需要手动带到url中传给浏览器

字符串格式串比较考察python基础:

1. 百分号格式化(%操作符)

ini 复制代码
name = "小明"
age = 25
print("姓名:%s,年龄:%d" % (name, 
age))
# 输出:姓名:小明,年龄:25
  • %s :字符串占位符
  • %d :整数占位符
  • %f :浮点数占位符

2. str.format() 方法

ini 复制代码
name = "小红"
score = 95.5
print("姓名:{},成绩:{:.1f}".format
(name, score))
# 输出:姓名:小红,成绩:95.5
  • 使用 {} 作为占位符
  • 支持位置参数和关键字参数

3. f-string(Python 3.6+推荐使用)

ini 复制代码
name = "小刚"
height = 1.75
print(f"姓名:{name},身高:{height:.
2f}米")
# 输出:姓名:小刚,身高:1.75米
  • 在字符串前加 f 前缀
  • 直接在 {} 中写入变量或表达式
相关推荐
中草药z1 天前
【测试基础】Python 核心语法,一篇搞定测试脚本开发基础
开发语言·笔记·python·学习·测试·语法
老神在在0013 天前
保姆级教程:Pytest + Allure 接口自动化测试从 0 到 1 完整指南(含环境搭建、用例编写、报告生成、报错排坑全流程)
pycharm·pytest·测试
甜甜圈圈子4 天前
在 Linux 中使用 CAN 通信:从配置到测试与代码实现
测试
测试员周周4 天前
【AI测试功能4】别再用传统等价类设计 AI测试用例了——语义覆盖的四种变体方法
人工智能·python·测试
努力进修5 天前
抽奖系统---测试报告
测试
老神在在0016 天前
测试方法与使用场景
单元测试·测试
Maỿbe7 天前
测试的基本认知
测试
humors2218 天前
十款顶级跑分与排名软件全解析
电脑·内存·测试·cpu·gpu·笔记本·硬盘
狼爷9 天前
JMeter 全指南:从性能测试入门到架构级实战
jmeter·测试