1.1 概念
接口自动化测试: 以程序代替人工驱动的接口测试
1.2 实现方式
-
工具: Jmeter、POSTman....
-
编码: Python、Java....
1.3 比较
-
工具
-
优点: 上手快,效率高
-
缺点: 定制化实现较为复杂(以加密为例:1.开发编写加密算法导出jar包 2.测试需要集成jar包,还需要编码调用jar包实现)
-
-
编码
-
优点: 定制化需求实现流程比工具简单,灵活性更强
-
缺点: 不易上手(需要有一定的编程基础),需要自实现常用功能(效率偏低)
-
-
注意
-
面试时,自动化测试可能专指编码实现的自动化方案
-
面试时,自动化测试语言不同,怎么答? 思想和流程都是相通的
-
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)
""" 以 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)
""" 访问学生管理系统: 根据指定的 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)
""" 响应由行头体三部分组成,在响应结果中如何提取行头体数据 """ 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"))
需求:使用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"},
""" 需求: 使用 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())
""" 场景: 获取 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()