接口测试07-接口自动化测试-cookie,session


1 接口自动化测试

1.1 概念

接口自动化测试: 以程序代替人工驱动的接口测试

1.2 实现方式

  • 工具: Jmeter、POSTman....

  • 编码: Python、Java....

1.3 比较

  • 工具

    • 优点: 上手快,效率高

    • 缺点: 定制化实现较为复杂(以加密为例:1.开发编写加密算法导出jar包 2.测试需要集成jar包,还需要编码调用jar包实现)

  • 编码

    • 优点: 定制化需求实现流程比工具简单,灵活性更强

    • 缺点: 不易上手(需要有一定的编程基础),需要自实现常用功能(效率偏低)

  • 注意

    1. 面试时,自动化测试可能专指编码实现的自动化方案

    2. 面试时,自动化测试语言不同,怎么答? 思想和流程都是相通的

2 requests库(重点)

2.1 概念

requests 库是使用 Python 编写的,基于 urllib 实现,可以调用该库的部分 API 直接向服务器发送请求,并接收响应(角色定位: 类似于Jmeter、POSTman、浏览器)

2.2 安装

联网的前提下,打开命令行,键入命令行命令: pip install requests

2.3 基本实现请求-GET

"""
    以 GET 方式向服务器发送请求,访问学生管理系统的查询学院信息功能
"""
# 1. 导包
import requests
# 2. 设计接口测试的三要素
# 要素1: URL
url = "http://127.0.0.1:8000/api/departments/"
# 要素2: 提交的测试数据
myParams = {"$dep_id_list":"T2005N,T2008N"}
# 要素3: 发送请求,然后接收响应结果
response = requests.get(url,params=myParams)
# 处理结果
print("状态码:",response.status_code)
print("响应体:",response.text)
 

2.4 基本实现请求-POST

"""
    以 POST 方式访问服务器,向学生管理系统插入一条学院信息
    注意:
        GET DELETE POST PUT 提交数据是有差异的,一般情况下:
            GET 和 DELETE 提交的数据都是键值对格式,且设置在请求行中
            对应的发送请求时: requests.get|delete(url, params=提交的数据)

            POST 和 PUT 提交的数据既可以是键值对格式又可以是JSON格式,且设置在请求体中
            对应的发送请求时:
                如果提交的是 JSON 数据: requests.put|post(url,json=提交的数据)
                如果提交的是键值对数据: requests.put|post(url,data=提交的数据)
"""
# 1. 导包
import requests
# 2. 设计三要素
# 要素1: URL
url = "http://127.0.0.1:8000/api/departments/"
# 要素2: 提交的数据
myJson = {
                "data": [
                        {
                            "dep_id":"T02",
                            "dep_name":"Test学院",
                            "master_name":"Test-Master",
                            "slogan":"Here is Slogan"
                        }
                  ]
            }
# 要素3: 响应结果
response = requests.post(url,json=myJson)
print("状态码:",response.status_code)
print("响应体:",response.text)

2.5 基本实现请求-PUT

"""
    以 PUT 方式访问服务器,修改某条学院信息
"""
# 1. 导包
import requests
# 2. 三要素
# 要素1: URL
url = "http://127.0.0.1:8000/api/departments/T02/"
# 要素2: 提交的数据
myJson = {
                "data": [
                        {
                            "dep_id": "T02",
                            "dep_name": "C++/学院xxx",
                            "master_name": "C++-Master yyyy",
                            "slogan": "Here is Slogan ZZZZZ"
                        }
                  ]
            }
# 要素3: 响应结果
response = requests.put(url,json=myJson)

print("状态码:",response.status_code)
print("响应体:",response.text)

2.6 基本实现请求-DELETE

"""
    访问学生管理系统:
        根据指定的 id 列表删除学院信息
"""
# 1. 导包
import requests
# 2. 设置三要素
# 要素1:URL
url = "http://127.0.0.1:8000/api/departments/"
# 要素2:id列表,$dep_id_list=8,9,11
myParams = {"$dep_id_list":"T2005N,T2008N"}
# 要素3: 发送请求,然后接收响应结果
response = requests.delete(url,params=myParams)

print("状态码:",response.status_code)
print("响应体:",response.text)

2.7 基本实现响应-response

"""
    响应由行头体三部分组成,在响应结果中如何提取行头体数据
"""
import requests
response = requests.get("http://127.0.0.1:8000/api/departments/")
#response = requests.get("http://www.baidu.com")
# 响应解析
# 行解析
print("-"*80)
print("状态码:",response.status_code)
print("URL:",response.url)

# 头解析
print("-"*80)
print("所有响应头:",response.headers)
print("获取内容类型:",response.headers.get("Content-Type"))
print("获取cookie:",response.cookies)
print("获取编码集:",response.encoding)

# 体解析
print("-"*80)
print("文本显示响应体:",response.text)
print("以字节方式显示响应体:",response.content)
print("以 JSON 方式显示数据:",response.json().get("next"))

2.8 登录案例之 Cookie

需求:使用requests库调用TPshop登录功能的相关接口,完成登录操作,登录成功后获取‘我的订单’页面

相关接口:获取验证码:http://localhost/index.php?m=Home&c=User&a=verify GET登录:http://localhost/index.php?m=Home&c=User&a=do_login POST

我的订单:http://localhost/Home/Order/order_list.html GET

登录提交的参数: {"username":"xxxxx","password":"yyyy","verify_code":"zzzz"},非 JSON 提交

"""
    需求: 使用 requests 库实现 TPShop 的登录功能
    分析: 步骤
        1. 先获取验证码(访问验证码接口)
        2. 再设置账号密码验证码访问登录接口
    框架搭建完毕,但是登录失败,为什么?
        核心: cookie
        1. 第一次发送请求,获取验证码时,相当于第一次去银行开户
           服务器为客户端创建了 Session,并将Session的ID以Cookie 的方式响应回了客户端
        2. 第二次访问时,按道理讲,应该提交第一次请求响应的 Cookie,但是实际没有提交
    解决:
        1. 从第一次响应中提取出 Cookie(银行卡)
        2. 第二次请求时,提交步骤1提取的 Cookie
"""
# 1. 导包
import requests
# 2. 访问获取验证码的接口
url = "http://localhost/index.php?m=Home&c=User&a=verify"
response = requests.get(url)
print(response.status_code)
print(response.content)
print(response.headers.get("Content-Type"))
# 核心1:获取服务器响应的 Cookie
print("获取所有cookie:",response.cookies)
# 获取指定 Cookie
myCookieValue = response.cookies.get("PHPSESSID")
print("银行卡卡号:", myCookieValue)

# 3. 访问登录接口
# 要素1
url = "http://localhost/index.php?m=Home&c=User&a=do_login"
# 要素2
myData =  {"username":"13012345678","password":"123456","verify_code":"8888"}
# 要素3
# 核心2:提交 Cookie
response = requests.post(url,data=myData,cookies={"PHPSESSID":myCookieValue})

print("-"*80)
print("状态码:",response.status_code)
print("响应体:",response.json())

 

2.9 登录案例之 Session

"""
    场景: 获取 Cookie 数据后,后续的每一次请求都需要提交 Cookie,导致代码高度重复
    解决: requests 库提供了相关的封装实现,可以自动的提取 Cookie 并提交 Cookie,该封装体称之为 Session
    注意: requests 库中的 Session 和 服务器端的 Session 只是重名
          服务器端的 Session ---> 保存用户数据
          requests 的 Session -> 封装 Cookie 调用
    优点: 简化了代码实现,提高了编写效率

"""
# 1. 导包
import requests
# 2. 获取验证码
# 首先,通过 requests 库获取一个 Session 对象,然后通过 Session 对象发送请求
session = requests.Session()
response = session.get("http://localhost/index.php?m=Home&c=User&a=verify")
print(response.status_code)
print(response.content)
print(response.headers.get("Content-Type"))
# 3. 执行登录
myData = {"username":"13012345678","password":"123456","verify_code":"8888"}
response = session.post("http://localhost/index.php?m=Home&c=User&a=do_login",data=myData)
print("登录状态码:",response.status_code)
print("登录响应体:",response.json())

# 4.订单查看
response = session.get("http://localhost/Home/Order/order_list.html")
print("订单响应体:",response.text)

# 建议: session 调用完毕,即时销毁
session.close()

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM