霍格沃兹测试开发学社
专题课 | 阶段 | 形式 | 章节 |
---|---|---|---|
接口自动化测试 | L1 | 知识点 | 全部录播 |
接口自动化测试 | L2 | 知识点 | 多层嵌套响应断言 |
接口自动化测试 | L2 | 知识点 | 【实战】宠物商店接口自动化测试实战 |
接口自动化测试 | L3 | 知识点 | 整体结构响应断言 |
接口自动化测试 | L3 | 知识点 | 数据库操作与断言 |
接口自动化测试 | L4 | 知识点 | 多套被测环境 |
├── apis
│ ├── __init__.py
│ ├── base_api.py
│ ├── department.py
│ └── wework.py
├── config
│ ├── __init__.py
│ ├── config.yaml
│ └── secrets.yaml
├── tests
│ ├── __init__.py
│ ├── schema.json
│ ├── test_departments.py
│ └── test_department_flow.py
└── utils
├── __init__.py
├── log_utils.py
└── utils.py
形式 | 章节 |
---|---|
知识点 | 接口自动化测试框架介绍 |
知识点 | 接口请求方法 |
知识点 | 接口请求参数 |
知识点 | 接口请求头 |
知识点 | 接口请求体-json |
知识点 | 接口响应断言 |
知识点 | json 响应体断言 |
知识点 | 【实战】宠物商店接口自动化测试实战 |
知识点 | 多层嵌套响应断言 |
知识点 | 【实战】宠物商店接口自动化测试实战 |
知识点 | 整体结构响应断言 |
知识点 | 数据库操作与断言 |
知识点 | 多套被测环境 |
请求方式:GET/POST(HTTPS)
请求地址:https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET
请求包体:
...
参数说明:
...
权限说明:
...
返回结果:
...
参数说明:
...
class TestDepartments:
def setup_class(self):
# 定义凭证
corpid = "xxx"
corpsecret = "xxx"
url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
# 定义param
params = {
"corpid": corpid,
"corpsecret": corpsecret
}
# 发get请求
r = requests.request(method="GET", url=url, params=params)
# 获取 access_token 定义为实例变量
self.token = r.json()["access_token"]
def test_create_department(self):
url = "https://qyapi.weixin.qq.com/cgi-bin/department/create"
data = {
"name": "广州研发中心2",
"name_en": "RDGZ2",
"parentid": 1,
"order": 1,
"id": 3}
params = {
"access_token":self.token
}
r = requests.request(method="POST", url=url, params = params,json=data)
assert r.json()["errcode"] == 0
@pytest.mark.parametrize(
"name, name_en, parentid, order, depart_id, expect",
[
("技术部", "JISHU1", 1, 1, 2, 0),
("技术部1t6yujk9osjhynnj890lkmbg54321", "JISHU2", 1, 2, 3, 0),
("技术部23", "JISHU23", 1, 23, 1, 60123)
]
)
def test_create_department(self, name, name_en, parentid, order, depart_id, expect):
url = "https://qyapi.weixin.qq.com/cgi-bin/department/create"
data = {
"name": name,
"name_en": name_en,
"parentid": parentid,
"order": order,
"id": depart_id
}
params = {
"access_token": self.token
}
r = requests.request(method="POST", url=url, params=params, json=data)
print(r.json())
assert r.json()["errcode"] == expect
def test_create_department_exist(self):
# 1. 准备已存在部门
# 2. 查询部门创建成果
# 3. 有存在部门的情况下,创建相同信息的部门
# 4. 删除部门
# 5. 查询部门删除成功
# 6. 再次创建部门
# 7. 查询部门创建成功
将代码进行优化,要求:
import requests
from jsonpath import jsonpath
def test_json_path():
r = requests.get("https://ceshiren.com/categories.json")
name_list = jsonpath(r.json(), '$.category_list.categories[0].name')
assert name_list[0] == '提问区'
name_list = jsonpath(r.json(), "$..name")
assert '提问区' in name_list
# 整体结构响应断言
class SchemaUtils:
@classmethod
def generate_schema(cls, obj, file_path):
'''
生成 json schema 文件
:param obj: 要生成 schema 的 python 对象
'''
builder = SchemaBuilder()
# 把预期响应添加到 builder 中
builder.add_object(obj)
# 生成 jsonschema
schema_content = builder.to_schema()
print(schema_content)
# 写入 json 文件
with open(file_path, "w", encoding="utf-8") as f:
json.dump(schema_content, f)
@classmethod
def schema_validate(cls, obj, schema):
'''
对比 python 对象与生成的 json schema 结构是否一致
:param obj: json 格式对象
:param schema: 生成的 json schema 结构
:return: 传入的 json 格式对象符合 schema 格式则返回 True,反之返回 False
'''
try:
validate(instance=obj, schema=schema)
return True
except Exception as e:
print(f"schema 校验异常======>{e}")
return False
# 数据库
def query_db(cls, sql, database_info):
# 连接数据库
conn = pymysql.Connect(**database_info)
# 创建游标
cursor = conn.cursor()
# 执行 SQL 语句
cursor.execute(sql)
# 获取查询结果
datas = cursor.fetchall()
print("查询到的数据为:", datas) # 获取多条数据
# 关闭连接
cursor.close()
conn.close()
return datas