1、Requests库
pip intstall requests
pycharm查验
设置http请求方法
resp = requests.请求方法(url = 'URL地址',params={k:v},headers={k:v},data={k:v},json={k,v},cookies='cookie数据'(如令牌)
请求方法:POST、GET、PUT、DELETE
url:要访问的地址 --string类型
params:查询参数 ---字典
headers:请求头 ---字典
data:表单格式请求体数据 ---字典
json:json格式请求体数据 ---字典
cookies:用来传递cookies
ex:使用Requests访问百度
# 导包
import requests
#发送http请求,访问百度,得到响应结果
resp = requests.get(url="http://www.baidu.com")
#打印响应结果
print(resp.text)
ex:使用Requests访问tpshop,并搜索iphone
#导包
import requests
#发送get请求,访问tpshop搜索接口,得到响应结果
#resp = requests.get(url="https://demo6.tp-shop.cn/Home/Goods/search.html?q=iphone")
resp = requests.get(url="https://demo6.tp-shop.cn/Home/Goods/search.html",
params={"q":"iphone"})#打印响应结果
print(resp.text)
ex:用Requests完成tpshop登录接口,返回验证码错误即可
#导包
import requests
#post请求,登录,得到响应结果
resp = requests.post(url="https://hmshop-test.itheima.net/index.php?m=Admin&c=Admin&a=login&t=0.6870043796261687",
headers={"Content-Type": "application/x-www-form-urlencoded"},
data={"username": "admin","password": "HM_2023_test","vertify": "8888"})
#打印文本响应结果
print(resp.text)
#打印转化为json格式的响应结果
print(resp.json())
ex:用Requests完成人力资源管理系统登录接口
#导包
import requests
#发送post请求,登录ihrm,得到响应结果
resp = requests.post(url="https://ihrm2-test.itheima.net/api/sys/login",
headers={"Content-Type":"application/json"},
json={"mobile":"13800000002","password":"888itcast.CN764%..."})
#打印响应结果,转为json格式
print(resp.json())
ex:用Requests完成人力资源管理系统修改员工、删除员工请求
#导包
import requests
#发送put请求,修改员工,得到响应结果
resp = requests.put(url="https://ihrm2-test.itheima.net/api/sys/user/1075383135459430400",
headers={"Content-Type":"application/json","Authorization":"43179ba8-9105-49c4-9c2f-2ea0ccef64fc"},
json={"username":"充电宝"})
#打印响应结果,转为json格式
print(resp.json())
-------------------------------------------------------------------------------------------#导包
import requests
#发送delete请求,修改员工,得到响应结果
resp = requests.delete(url="https://ihrm2-test.itheima.net/api/sys/user/1075383135459430400",
headers={"Authorization":"43179ba8-9105-49c4-9c2f-2ea0ccef64fc"})
#打印响应结果,转为json格式
print(resp.json())
Cookie
- cookie是针对HTTP无状态这一特征而设计的
- cookie将数据保存在浏览器端,默认存储空间大小为4k
- cookie的数据类型受浏览器影响
- cookie中的数据用户可以随意获取,没有安全性可言,所以大多存放不敏感信息,如用户名、登陆状态
Cookie+Session认证方式
校验用户身份的方法
- 令牌校验
- cookie+session
Session
也叫会话,从客户端登录服务器开始,知道客户端退出登录,所产生的所有通信数据,保存到session中
- session将数据存储在服务器
- session使用服务器的存储空间,没有大小限制
- session所支持的数据类型受服务器主机影响,几乎支持所有数据类型
- session中的数据,大都采用加密、转码存储,因此安全性较高
session自动管理cookie
原因:因为cookie中的数据,都是由session提供的
ex:借助session实现tpshop登录,查看“我的订单”
步骤:
1、创建session实例 my_session = requests.Session()
2、使用session实例,调用get方法,发送获取验证码的请求(不需要提取Cookie) my_session.get()
3、使用同一个session实例,调用post方法,发送登录请求(不需要携带Cookie)my_session.post()
4、使用同一个session实例,调用get方法,查看“我的订单”------my_session.get()
面试题cookie和session区别
1、数据存储位置...........
2、安全性..........
3、数据类型.........
4、大小
从响应结果resp中获取指定响应数据
- 获取URL: resp.url
- 获取响应状态码:resp.status_code
- 获取cookie:resp.cookies
- 获取响应头:resp.headers
- 获取响应体:
- 文本格式:resp.text
- json格式:resp.json()【如果出现JSONDecodeError错误,说明响应结果无法转换为json格式】
2、pyTest框架
pyTest是开发人员用来实现“单元测试”的框架,测试人员可以在自动化“测试执行”时使用
使用pyTest的好处:
1、方便管理,维护测试用例
2、简单的断言方法
3、生成测试报告
安装pyTest:pip install pytest
定义测试类、测试方法
# 测试类名,建议以Test开头
class TestXxx(object):
#测试方法名,必须以test开头
def test_xxx(self):
pass
执行测试方法
单文件执行
方法1:终端命令:pytest -s xxx.py
方法2:方法定义后,右键->运行此方法;类定义后,右键->运行 所有方法
方法3:导包 import pytest
if__name__=='__main__';
pytest.main{['-s','xxx.py']}
多文件执行
1、直接在项目目录下,创建文件 pytest.ini
2、编写pytest.ini文件
[pytest] 固定内容
addopts = -s 添加命令行参数 add options
testpaths = ./xxx .py测试用例文件,相当于pytest.ini位置
python_files = xxx*.py .py文件名,可用通配符
python_classes= Test* 测试类名, 可用通配符
python_functions = test* 测试方法名,可用通配符
3、终端执行命令 pytest
Fixture
#1、方法级别方法
def setup(self): 在每个普通测试方法执行之前被自动调用一次
def teardown(self): 在每个普通测试方法执行之后被自动调用一次
setup和teardown在pytest8.0版本以后被废弃了。我的pytest版本是:pytest8.3.2
解决方法:setup和teardown在类中可以使用setup_method和teardown_method来代替。
#2、类级别方法
def setup_class(self): 在 类中所有 测试方法 执行之前被自动调用一次
def teardown_class(self): 在 类中所有 测试方法 执行之后被自动调用一次
断言
#方法1、
assert 预期结果 == 实际结果 ---断言相等
assert 预期结果 in 实际结果 ----断言包含
测试报告
1、安装插件 pip install pytest-html
2、修改pytest.ini文件的addopts的值
addopts = -s --html=report/测试报告名.html --self-contained-html【report表示把测试报告放入到名为report的目录中】
3、使用命令 pytest 生成测试报告
[pytest] addopts = -s --html=./report/一篇测试报告.html --self-contained-html testpaths = ./ python_files = pytest*.py python_classes = Test* python_functions = test* pytest.ini------------------------------------------------------------------------------------------------
#定义测试类 class TestAdd(object): def setup_method(self): print("---setup--被调用!") def teardown_method(self): print("---teardown--被调用!") def setup_class(self): print("---setup_class--被调用!") def teardown_class(self): print("---teardown_class--被调用!") #测试方法 def test01_add(self): print("第一个测试方法:") assert 10 == 2 + 8 def test02_add(self): print("第二个测试方法:") assert "hello" in "helloworld"
3、pymysql操作数据库
数据库应用场景
校验测试数据:
http请求发送后,明确会修改表中的数据,但响应结果中没有体现数据值
如删除员工(is_delete字段)
构造测试数据
测试数据,使用一次就失效,不能重复使用
如添加员工
测试数据,再展开测试前,无法确定是否存在
查询、修改、删除(使用的员工id)
pycharm连接数据库
conn = pymysql.connect(host="",port=3306,user="",password="",database="",charset="")
#导包
import pymysql
from select import select
#创建连接
conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="123456",database="lab_manage",charset="utf8")
#创建游标
my_cursor = conn.cursor()
#执行sql语句
my_cursor.execute("select version();")
#提取结果
res = my_cursor.fetchone()
print("查询结果为:",res)
#关闭游标
my_cursor.close()
#关闭连接
conn.close()
cursor游标
- 游标,负责提取结果集的数据
- 新创建的游标,指向结果集第0条记录
- 游标提取数据的方式,提取游标当前指向位置的下一条数据。如cursor(0)提取第一条记录
- 每提取一条记录,游标会自动向下移动
常用提取方法
fetchone():从结果集中,提取一条记录
fetchany(size):从结果集中,提取size条记录
fetchall:提取所有数据
属性rownumber:可以设置游标的位置,常用于归零,cursor.rownumber = 0
#导包
import pymysql
from select import select
#创建连接
conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="173581",database="lab_manage",charset="utf8")
#创建游标
my_cursor = conn.cursor()
#执行sql语句
my_cursor.execute("select * from user;")
#提取一条结果
res = my_cursor.fetchone()
print("查询结果为:",res)
#提取全部
my_cursor.rownumber = 0;
res = my_cursor.fetchall()
print("查询结果为:",res)
#提取第3、4条
my_cursor.rownumber = 2;
res = my_cursor.fetchmany(2)
print("查询结果为:",res)
my_cursor.close()
#关闭连接
conn.close()
异常捕获
# 语法
try:
尝试执行的代码
except Exception as err:
出现了异常后执行的代码
finally:
无论有没有异常,都会执行的代码
------------------------------------------------------------------------------------
#导包
import pymysql
from select import select
conn = None
my_cursor = None
try:
#创建连接
conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="173581",database="lab_manage",charset="utf8")
#创建游标
my_cursor = conn.cursor()
#执行sql语句
my_cursor.execute("select * from user;")
#提取一条结果
res = my_cursor.fetchone()
print("查询结果为:",res)
#提取全部
my_cursor.rownumber = 0;
res = my_cursor.fetchall()
print("查询结果为:",res)
#提取第3、4条
my_cursor.rownumber = 2;
res = my_cursor.fetchmany(2)
print("查询结果为:",res)
except Exception as err:
print("查询失败:",str(err))
finally:
my_cursor.close()
#关闭连接
conn.close()
增删改
#导包
import pymysql
from select import select
conn = None
my_cursor = None
try:
#创建连接
conn = pymysql.connect(host="127.0.0.1",port=3306,user="root",password="173581",database="lab_manage",charset="utf8")
#创建游标
my_cursor = conn.cursor()
#执行sql语句
my_cursor.execute("insert into user(username,password,name) values('keke','123456','可可');")
my_cursor.execute("update user set password = '111111' where id = 43;")
my_cursor.execute("delete from user where id = 43;")
print("Affect rows:",conn.affected_rows())
conn.commit()
except Exception as err:
print("插入数据失败:",str(err))
conn.rollback()
finally:
my_cursor.close()
#关闭连接
conn.close()
数据库工具类封装
封装目的:
将数据库常用的操作,封装成类中的方法,将来在使用时,只需提供要执行的sql语句给这个方法即可。(不需要关心建立连接、建立游标、关闭游标、关闭连接.....)
#导包
import pymysql
#定义数据库的工具类
class DBTools(object):
#创建连接---类方法,可以直接使用类名调用
@classmethod
def __create_conn(cls):
conn = pymysql.connect(host="127.0.0.1", port=3306, user="root", password="173581", database="lab_manage",
charset="utf8")
return conn
@classmethod
#查一条记录
def query_one(cls,sql):
my_cursor = None
conn = None
res = None
try:
# 创建连接,借助类名调用类方法
conn = DBTools.__create_conn()
# 创建游标
my_cursor = conn.cursor()
# 执行sql
my_cursor.execute(sql)
# 提取一条记录
res = my_cursor.fetchone()
except Exception as err:
print("查询失败:", str(err))
finally:
# 关闭游标
my_cursor.close()
# 关闭连接
conn.close()
return res
# 增删改
@classmethod
def db_uid(cls,sql):
my_cursor = None
conn = None
res = None
try:
# 创建连接,借助类名调用类方法
conn = DBTools.__create_conn()
# 创建游标
my_cursor = conn.cursor()
# 执行sql
my_cursor.execute(sql)
# 提取一条记录
print("Affect rows:",conn.affected_rows())
conn.commit()
except Exception as err:
print("操作失败:", str(err))
conn.rollback()
finally:
# 关闭游标
my_cursor.close()
# 关闭连接
conn.close()
return res
if __name__ == '__main__':
result = DBTools.query_one("select * from user;")
print("查询结果:",result)
DBTools.db_uid("insert into user(username,password,name) values('keke','123456','可可');")
DBTools.db_uid("update user set password = '111111' where id = 43;")
DBTools.db_uid("delete from user where id = 43;")
删除员工接口数据库操作
思路分析
构造测试数据:
删除员工所需的员工id,在测试删除员工之前通过insert语句,插入一个员工id到数据库
直接使用该id进行删除员工操作
校验测试数据:
发送删除员工接口成功后,通过select查询is_delete字段的值,如果为1,说明删除成功
4、持续集成
团队成员将自己的工作成果集成到一个公共平台上,成员可以每天集成一次,也可以多次
相关工具:git、gitee、Jenkins
Jenkins的准备:
Jenkins 的安装(详细教程)_jenkins安装-优快云博客
Jenkins---jenkins配置邮箱 - 测试-安静 - 博客园 (cnblogs.com)
postman准备
使用Jenkins管理-Postman-手动构建
使用Jenkins管理-Postman-自动构建
可以看到13:56时构建成功
使用Jenkins管理-代码-手动构建
先将代码上传到gitee:在pycharm中使用Git上传代码到Gitee/GitHub(适合新手小白的超级详细步骤讲解)_pycharm上传gitee-优快云博客
new item->jenkins02->configuration
使用Jenkins管理-代码-自动构建
同postman自动构建相同