目标:优化框架场景
-
生成对应的接口关联【重点】
-
优化URL基础路径封装【理解】
-
利用PySQL操作数据库应用【理解】--- 怎么用python连接数据库、mysql
-
通过数据库进行数据库断言【重点】
-
通过数据库进行关联操作【重点】
一、接口关联:(测试业务场景)
登录成功 --- 加入购物车成功(没有token)
- 登录成功之后需要提取数据 ---
格式:{"变量名":"jsonpath值"} {"VAR_TOKEN":"..data.token","MSG":".msg"}
提取数据方法--- 提取出来进行存储 -- all_var
-
方法 ---数据存储到公共的变量all_var当中。
all_var = {}
exdata = {"VAR_TOKEN":"..data.token","MSG":".msg"}
for key, value in exdata.items():
valueJson = value+"提取出来的值"
all_var.update(
{key: valueJson}
)print(all_var)
运行结果
- 加入购物车需要引用这个数据
{{变量名}}
代码层面需要修改,增加一句代码即可。
加的两行代码是:
#导入这个模板--固定的
from jinja2 import Template
# Template(数据A) 这个数据A必须是字符串的格式,所以是数据A = str(数据B)类型转化
# render() 可以把 render(数据D),通过花括号{}+变量名={{变量名}}替换到 Template(数据A的模板里)
# eval()里面是字典的格式
CaseData = eval(Template(str(CaseData)).render(self.all_var))
一共就上面两句
实际应用:
@pytest.mark.parametrize("CaseData", AllCaseData)
def testData(self, CaseData):
print("当前执行的测试用例接口:", CaseData)
self.dynamic_title(CaseData)
CaseData = eval(Template(str(CaseData)).render(self.all_var))
简单应用的例子:
from jinja2 import Template
all_var = {"VAR_TOKEN": "4534131231231321321", "BOOK_ID": 178}
CaseData = {"url": "http://novel.hctestedu.com/book/queryBookDetail/{{BOOK_ID}}", "params": '{"token":"{{VAR_TOKEN}}"}'}
CaseData2 = eval(Template(str(CaseData)).render(all_var)) # 变量渲染--其实就是数据替换
print(CaseData2)
二、接口风格:
1、传统api
发送请求: get 、post (居多)
http://localhost:8080/admin/getUser (查询用户) --- get请求
http://localhost:8080/admin/addUser (新增用户) --- post请求
http://localhost:8080/admin/updateUser (更新用户)--- post请求
http://localhost:8080/admin/deleteUser (删除用户)--- pos请求
2、restFul风格
一. 什么是Restful风格
1.1 概念
RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用 XML 格式定义或 JSON 格式定义。最常用的数据格式是JSON。由于JSON能直接被JavaScript读取,所以,使用JSON格式的REST风格的API具有简单、易读、易用的特点。
1.是一种风格,不是协议规定,这种风格更简介美观
2.基于HTTP,可以使用 XML 格式定义或 JSON 格式定义,前后端分离时代都用json传递数据了
------------------------------------------------
原文链接:https://blog.csdn.net/weixin_43189971/article/details/126024564
灵活的应用请求方法
GET http://localhost:8080/admin/user/10(查询用户)
POST http://localhost:8080/admin/user (新增用户)
PUT http://localhost:8080/admin/user (更新用户)
DELETE http://localhost:8080/admin/user (删除用户)
http://novel.hctestedu.com/book/queryBookDetail/178
178 --- {书籍的ID}
修改数据成功之后(获取书籍ID ),调用查看详情的接口(引用ID)
http://novel.hctestedu.com/book/queryBookDetail/{{BOOK_ID}}
三、数据库操作
数据库的提取:
- 连接数据库
- 什么情况下进行数据的提取--比如注册完毕,进行提取;新增数据完毕、进行提取,
- sqlExData 字段 :思路和响应提取完全一样,只是一个是写jsonpath 一个是写sql而已。
1、数据库模块
1)数据库连接和操作
# 连接数据库
# 1. 知道数据库用的什么第三方模块 - pymysql
# 2. 数据库的连接信息是什么?
# 主机(host,注意没有www):shop-xo.hctestedu.com
# 端口:3306
# 用户名:api_test
# 密码:Aa9999!
# 数据库名:shopxo_hctested
import pymysql
# 1. 配置数据库连接信息并连接
connection = pymysql.connect(
host='shop-xo.hctestedu.com', # 数据库地址
port=3306,
user='api_test', # 数据库用户名
password='Aa9999!', # 数据库密码
db='shopxo_hctested', # 数据库名称
# charset = 'utf8 -- UTF-8 Unicode' #设置编码格式
)
这个需要写到配置文件里,作为数据库连接的常量
可以在关键字驱动里引用数据库连接的常量
2)创建游标--操作数据库
# 创建游标对象,使用它进行操作 ---相当于操作员
cursor = connection.cursor()
3)SQL链表查询
# SQL语句 (链表查询一定要会)
sql = "SELECT id,username,nickname FROM sxo_user where username='hami'"
4) 使用游标对象操作SQL
# 使用游标对象去执行操作SQL
cursor.execute(sql)
# 得到结果集的下一行
result = cursor.fetchone()
print(result) # 返回的元组格式。
5)关闭数据库连接
# 关闭数据库连接
cursor.close()
tips:
Ctrl + Shift + u 可以来回切换大小写
HHTTP - http
2、数据提取
- 什么情况下进行数据的提取--比如注册完毕,进行提取;新增数据完毕、进行提取,
- sqlExData 字段 :思路和响应提取完全一样,只是一个是写jsonpath 一个是写sql而已。
从json提取,变成sql提取
{"name":"SELECT username FROM sxo_user WHERE username='hami'",
"id":"SELECT id FROM sxo_user WHERE username='hami'"}
3、数据库断言:
常用场景:新建用户数据-- 用户表:用户, 新建书籍--- 书籍表:书籍
excel :多2个字段
期望结果:{"id":75,"name":"hami"}
实际结果:{"name":"SELECT username FROM sxo_user WHERE username='hami'",
"id":"SELECT id FROM sxo_user WHERE username='hami'"}
{"id":75,"name":"hami"}
assert 期望结果== 实际结果
期望结果-75 ,可以断言成功
把这个改为89--就会执行断言失败