接口测试_Requests库_UnitTest框架_数据库操作_日志收集
Requests库
学习目标
- 能够使用 Requests 库发送 get/post/put/delete 请求,获取响应状态码、数据
- 能够使用 UnitTest 管理测试用例
requests请求对象构建
介绍
- Requests库:是 Python编写的,基于urllib 的 HTTP 库,使用方便。
- 理解:Requests 库是接口自动化测试的工具箱
安装
- 安装:
pip install requests -i https://pypi.douban.com/simple/
, 从豆瓣 pip 镜像下载安装 requests 库 - 验证:
pip show requests
, 出现版本号等信息即为成功- 或者使用
pip list
查看安装的所有库
- 或者使用
入门示例
- 需求:使用 Requests 库访问百度 http://www.baidu.com,并查看响应结果
1 | # 1. 导入requests库 |
发送接口请求
resp = requests.请求方法(url='URL地址', params={k:v}, headers={k:v},data={k:v}, json={k:v}, cookies='cookie数据'(如:令牌))
- 说明:
- 常见的请求方法:
get/post/put/delete
- resp:响应结果
- url: 请求的url地址
- params:请求查询参数
- data:表单参数
- json:json参数
- headers:请求头参数
- cookies:cookie数据 - string类型
- 常见的请求方法:
1 | # 1. 导入requests库 |
get请求的查询参数
get请求的查询参数案例
发送带查询参数的get请求
需求:
- 访问TPshop搜索商品的接口,传递搜索关键字iPhone,查看响应数据
分析:
- 请求方式:GET
- 请求路径:http://tpshop-test.itheima.net/Home/Goods/search.html
- 传参方式:查询字符串(q=iPhone)
post请求参数-data
post请求参数案例
- 接口URL
- 请求方式
POST
- Content-Type
application/x-www-form-urlencoded
- 请求Body参数
参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 |
---|---|---|---|---|
username | admin | Text | 是 | 用户名 |
password | admin | Text | 是 | 密码 |
1 | # 1. 导入requests库 |
post请求参数-json
post请求参数案例
- 需求:
- 请求IHRM项目的登录接口,请求数据为json格式
- 分析:
- 请求方式:POST
- 请求路径:http://ihrm-test.itheima.net/api/sys/login
- 请求数据:请求体-JSON数据({“mobile”:”13800000002”, “password”:”123456”})
发送其他 HTTP 请求
- 如何使用requests库发送其他 HTTP 请求类型?
- requests.put(url, **kwargs)
- requests.delete(url, **kwargs)
思考
- 如何使用requests发送GET/POST/PUT/DELETE请求?
- 如何使用requests提交表单数据?
- 如何使用requests提交JSON数据?
请求头和cookie设置
Cookie简介
- 简介:工程师 针对 http协议是无连接、无状态特性,设计的 一种技术。 可以在浏览器端 存储用户的信息。
- 特性:
- cookie 用于存储 用户临时的不敏感信息。
- cookie 位于浏览器(客户端)端。默认大小 4k(可以调整)
- cookie 中的数据,可以随意被访问,没有安全性可言。
- cookie 中存储的数据类型,受浏览器限制。
Cookie+Session认证
- 在计算机中,认证用户身份的方式有多种!课程中接触 2种:
- ihrm项目:token认证。
- tpshop项目:cookie+Session认证。
1 | import requests |
设置请求头
案例一
- 需求:
- 请求IHRM项目的查询接口—查询存在的员工信息
- 请求头Authorization: token值
- 分析:
- 如何设置请求头数据?
- 相关接口:http://ihrm-test.itheima.net/api/sys/user/1419624408460304384
案例二
- 需求:
- 使用requests库调用TPshop登录功能的相关接口,完成登录操作
- 登录成功后获取‘我的订单’页面的数据
- 相关接口:
设置 cookie
- 设置cookie
- 获取cookies:cookies = response.cookies
- requests.get(url, cookies={“c1”: “v1”})
1 | import requests |
Session简介
简介:也叫 会话。通常出现在网络通信中,从客户端借助访问终端登录上服务器,直到 退出登录 所产生的通信数据,保存在 会话中。
特性:
Session 用于存储 用户的信息。
Session 位于服务端。大小直接使用服务器存储空间
Session 中的数据,不能随意被访问,安全性较高。
Session 中存储的数据类型,受服务器影响,几乎能支持所有的数据类型。
Session自动管理Cookie
- 因为 Cookie 中的 数据,都是 Session 传递的。因此,Session 可以直接 自动管理 cookie
案例
- 借助session重新实现 上述 TPshop商城登录,并获取 “我的订单” 页面数据。
- 实现步骤:
- 创建一个 Session 实例。
- 使用 Session 实例,调 get方法,发送 获取验证码请求。(不需要获取cookie)
- 使用 同一个 Session 实例,调用 post方法,发送 登录请求。(不需要携带 cookie)
- 使用 同一个 Session 实例,调用 get方法,发送 查看我的订单请求。(不需要携带 cookie)
1 | import requests |
Session对象发送请求
- 创建session对象:session = requests.Session()
- 说明:
- Session对象代表一次用户会话:从客户端浏览器连接服务器开始,到客户端浏览器与服务器断开
- 会话能让我们在跨请求时候保持某些参数,比如在同一个 session 实例发出的所有请求之间保持 cookie
案例三
1 | import requests |
思考
- 设置请求头的参数是哪个?
- 设置cookie的参数是哪个?
- session对象作用?
- Cookie 和 Session 区别
- 数据存储位置:
- cookie存储在浏览器;session存储在服务器。
- 安全性:
- cookie中的数据可以随意获取,没有安全性可言。Session的数据多为加密存储,安全较高!
- 数据类型:
- cookie支持的数据类型受浏览器限制,较少;Session直接使用服务器存储,支持所有数据类型
- 大小:
- cookie大小默认 4k; Session 大小约为服务器存储空间大小
- 数据存储位置:
response响应对象
获取响应内容方法
- 获取 URL:resp.url
- 获取 响应状态码:resp.status_code
- 获取 Cookie:resp.cookies
- 获取 响应头:resp.headers
- 获取 响应体:
- 文本格式:resp.text
- json格式:resp.json()
案例一
- 需求:
- 访问百度接口
http://www.baidu.com
,获取以下响应数据- 获取响应状态码
- 获取请求URL
- 获取响应字符编码
- 获取响应头数据
- 获取文本形式的响应内容
- 访问百度接口
1 | import requests |
获取响应内容-JSON
json_data = response.json()
- 提示:如果 JSON 解码失败,response.json() 会抛出异常
案例
- 案例需求 :
- 返回json数据:
- 1). 访问查询天气信息的接口,并获取JSON响应数据
- 2). 接口地址:http://www.weather.com.cn/data/sk/101010100.html
- 返回json数据:
思考
- Response对象常见方法有哪些?
- response.json()获取的是什么格式的数据?
UnitTest框架
学习目标
- 理解使用UnitTest的目的
- 能够使用UnitTest管理测试用例
Unittest框架
- UnitTest 是开发人员用来实现 “单元测试” 的框架。测试工程师,可以在自动化 “测试执行” 时使用。
- 使用 UnitTest 的好处:
- 方便管理、维护测试用例。
- 提供丰富的断言方法。
- 生成测试报告。(需要插件 HTMLTestReport)
TestCase
1 | # 1 导包:import unittest |
Fixture
1 | 1、方法级别的 setUp(self) tearDown(self) 每个普通方法执行 之前/之后 自动运行。 |
TestSuite
1 | 1、实例化测试集对象 suite = unittest.TestSuite() |
TestRunner
1 | runner = HTMLTestReport("./report1.html", description="描述信息", title="报告标题") |
示例_测试类
1 | """ |
示例:生成测试报告
1 | import unittest |
案例一
- 练习 : UnitTest框架管理ihrm登录接口脚本
- 实现要求:
- 按照功能模块组织测试类,一条测试用例对应一个测试方法
- 添加断言:响应状态码/success/code/message
- 封装测试套件批量执行用例
- 生成测试报告
1 | class TestLogin(unittest.TestCase): |
案例二
- 练习 : UnitTest框架管理tpshop登录接口脚本
- 需求说明:
- 获取验证码: http://tpshop-test.itheima.net/index.php?m=Home&c=User&a=verify
- 登录: http://tpshop-test.itheima.net/index.php?m=Home&c=User&a=do_login
- 断言:status_code, status, msg
思考
- 使用UnitTest框架的目的?
- TestFixture、TestCase、TestSuite、TestRunner使用
数据库操作
学习目标
- 知道数据库操作的应用场景
- 掌握使用PyMySQL对数据库的增、删、改、查
- 数据库工具类封装
数据库操作应用场景
- 接口自动化测试数据库主要应用场景?
- 测试数据校验
- 接口发送请求后明确会对数据库中的某个字段进行修改,但,响应结果中无该字段数据时。
- 如:ihrm 删除员工接口。 is_delete 字段,没有 在响应结果中出现! 需要 借助数据库 校验!
- 接口发送请求后明确会对数据库中的某个字段进行修改,但,响应结果中无该字段数据时。
- 测试数据构造
- 测试数据使用一次就失效。
- 如:ihrm 添加员工接口,使用的手机号!
- 测试前,无法保证测试数据是否存在。
- 如:ihrm 查询员工接口,使用的 员工id
- 测试数据使用一次就失效。
- 测试数据校验
- 接口自动化测试与数据库交互场景有哪些?
- 数据库操作的应用场景有哪些?
数据库操作实现
学习目标
- 掌握操作数据库的基本流程
- 掌握使用PyMySQL对数据库的增、删、改、查
安装 PyMySQL
- PyMySQL:Python3.x 版本中连接 MySQL 服务器的一个库
- 安装PyMySQL:
pip install PyMySQL
操作数据库的基本流程
- 代码实现步骤:
- 导包 import pymysql
- 创建连接。 conn = pymysql.connect(host,port, user, password, database, charset)
- 获取游标。 cursor = conn.cursor()
- 执行 SQL。 cursor.execute( ”sql语句“)
- 查询语句(select)
- 处理结果集(提取数据 fetch*)
- 增删改语句(insert、update、delete)
- 成功:提交事务 conn.commit()
- 失败:回滚事务 conn.rollback()
- 关闭游标。cursor.close()
- 关闭连接。conn.close()
- 测试数据 :
- host: 211.103.136.244
- port: 7061
- user: student
- password: iHRM_student_2021
- database: test_db
连接数据库
建立连接方法 :
conn = pymysql.connect(host=None, user=None, password="",database=None, port=0, charset="")
参数说明:
- host:数据库所在主机 IP地址 - string
- port:数据库使用的 端口号 - int
- user:连接数据库使用的 用户名 - string
- password:连接数据库使用的 密码 - string
- database:要连接的那个数据库的名字 - string
- charset:字符集。常用 utf8 - string
- conn:连接数据库的对象。
获取游标对象
cursor = conn.cursor()
说明:
- 调用数据库连接对象的cursor()方法获取游标对象
执行SQL语句
cursor.execute(sql)
说明:
- 调用游标对象的execute()方法来执行SQL语句
- sql: 要执行的sql语句
释放资源
1 | # 关闭游标对象 |
- 说明:
- 调用数据库连接对象、游标对象的close()方法来释放资源
案例一
- 需求 : 查询数据库,获取MySQL服务器 版本信息
1 | # 1. 导包 |
案例一
- 需求:
- 连接到数据库(host:211.103.136.244 port:7061 user:student password:iHRM_student_2021database:test_db)
- 获取数据库服务器版本信息
- 分析:
- 如何获取数据库的连接?
- 获取数据库服务器版本信息的SQL语句是什么?
- sql语句:select version()
- 如何执行SQL语句?
- cursor.execute(“select version()”)
- 获取查询结果:cursor.fetchone()
- 如何释放资源?
1 | # 导包 |
数据库查询
1 | # 1. 导包 |
异常捕获
1 | # 1. 导包 |
execute方法
- cursor 对象的 execute方法:执行sql并返回结果到客户端
fetch*()方法
案例二
- 案例 : 查询books表的指定信息
- 数据库地址:
- host: 211.103.136.244, port: 7061,
- user: student, password: iHRM_student_2021, database: test_db
- 要求:
- ①:查询t_book表第一条数据
- ②:获取t_book前两条数据
- ③:查询t_book表的全部数据
- 分析:
- cursor.fetchone()
- cursor.fetchmany(2)
- cursor.fetall()
fetch*()方法原理
- rownumber属性:标识游标的当前位置(默认初始位置从0开始)
- fetch*()方法是基于游标当前位置逐行向下获取数据
案例三
练习 : 查询books表的指定信息
要求:
- ①:查询t_book表的全部字段数据
- ②:获取查询结果集的第一条数据
- ③:获取查询结果集的第3条和第4条数据
- ④:获取全部的查询结果集及总记录数
分析:
select * from t_book
cursor.rownumber= 0 cursor.fetchone()
cursor.rownumber= 2 cursor.fetchmany(2)
cursor.rownumber= 0 cursor.fetchall()
数据库更新
案例四
- 练习 : 更新t_book表的指定信息
- 数据库地址:
- host: 211.103.136.244, port: 7061,
- user: student, password: iHRM_student_2021, database: test_db
- 要求单独实现:
- ①:新增一条图书数据(id:5 title:西游记 pub_date:1986-01-01 )
- ②:把图书名称为‘西游记’的阅读量加一
- ③:删除名称为‘西游记’的图书
1 | """ |
1 | # 修改数据 |
1 | # 删除数据 |
数据库工具类封装
学习目标
- 掌握数据库工具类封装
封装的目的
- 将 常用的数据库操作,封装到 一个方法。 后续再操作数据库时,通过调用该方法来实现。
- 提高代码的 复用性!
数据库工具类封装
总结
- 操作数据库的应用场景有哪些?
- 能否使用PyMySQL对数据库的增、删、改、查?
- 数据库工具类封装
日志收集
学习目标
- 掌握如何使用logging实现日志收集
认识日志收集
学习目标
- 理解在项目中为什么要收集日志
- 知道如何区分日志信息的重要级别
什么是日志
- 日志就是用于记录系统运行时的信息,对一个事件的记录;也称为Log
- 有哪些信息需要记录?
- 脚本运行过程中某个重要变量的值
- 方法的输入参数和返回结果
- 异常信息
什么要收集日志
日志级别
- 日志级别 : 是指日志信息的优先级、重要性或者严重程度
- 提示 :
- 当为程序指定一个日志级别后,程序会记录所有日志级别大于或等于指定日志级别的日志信息,而不是仅仅记录指定级别的日志信息;
- 一般建议只使用DEBUG、INFO、WARNING、ERROR这四个级别
日志收集
思考
- 收集日志有什么作用?
- 常见的日志级别有哪些?
Logging日志模块用法
学习目标
- 能够把日志输出到控制台和日志文件中
收集日志达成的效果
- 可以把日志输出到不同位置
- 控制台
- 日志文件(防止日志文件过大,每日生成一个日志文件)
- 记录更加详细的日志信息
- 打印日志的时间
- 日志的级别
- 打印日志的位置
- 日志内容
- 可以打印不同级别的日志
- INFO
- ERROR
日志收集的实现
日志器介绍
Handler处理器介绍
Formatter格式化器介绍
打印日志
- 调用 logging 中的不同方法可以打印不同级别的日志
- 注意 : 打印日志使用的是小写的字母
思考
- 如何把日志输出到控制台?
- 如何把日志输出到日志文件?
- 如何设置日志的格式?
- 如何打印不同级别的日志?
总结
- 为什么要收集日志?
- 如何使用Logging日志模块实现日志的收集?
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用CC BY-NC-SA 4.0协议,完整转载请注明来自蜗牛浪迹天涯