feat: 新增JoyHub协议管理和app版本号管理接口测试用例
This commit is contained in:
299
dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Agreement.py
Normal file
299
dulizhan/test_case/TestCase/接口/JoyHub/Joyhub_Agreement.py
Normal file
@@ -0,0 +1,299 @@
|
||||
import pytest
|
||||
import allure
|
||||
import logging
|
||||
import requests
|
||||
import json
|
||||
import time
|
||||
from dulizhan.library.BusinessKw.JoyHub.AgreementManage import AgreementManage
|
||||
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
|
||||
|
||||
@allure.feature("管理后台 - 协议管理模块")
|
||||
class TestAgreementManage:
|
||||
agreement_id = None
|
||||
token_set = False
|
||||
|
||||
@classmethod
|
||||
def setup_class(cls):
|
||||
"""在整个测试类开始时登录一次,所有测试用例共享token"""
|
||||
logging.info("=============================================")
|
||||
logging.info("=========== 开始登录,获取Token ============")
|
||||
logging.info("=============================================")
|
||||
|
||||
cls.test_case = AgreementManage()
|
||||
username = "joytest"
|
||||
password = "Zhou1599"
|
||||
|
||||
cls.test_case._clear_user_fingerprint(username)
|
||||
|
||||
url = "https://joyhub-website-manager-api-test.best-envision.com/admin-api/system/auth/login-dev"
|
||||
payload = {"username": username, "password": password}
|
||||
headers = {'Content-Type': 'application/json', 'tenant-id': '126'}
|
||||
|
||||
try:
|
||||
response = requests.post(url, json=payload, headers=headers, verify=False, timeout=10)
|
||||
login_response = response.json()
|
||||
|
||||
if login_response and login_response.get('code') == 0:
|
||||
token = login_response.get('data', {}).get('accessToken', '')
|
||||
if token:
|
||||
cls.test_case.set_joyhub_token(token)
|
||||
cls.token_set = True
|
||||
logging.info("登录成功,获取到Token: {}...".format(token[:20]))
|
||||
else:
|
||||
logging.warning("登录成功但未获取到Token")
|
||||
else:
|
||||
logging.error("登录失败: {}".format(login_response))
|
||||
except Exception as e:
|
||||
logging.error("登录异常: {}".format(str(e)))
|
||||
|
||||
@allure.story("验证登录")
|
||||
@allure.title("测试登录接口")
|
||||
def test_joyhub_login_post(self):
|
||||
"""测试登录接口"""
|
||||
assert self.token_set is True, "登录失败,Token未设置"
|
||||
logging.info("登录验证通过,Token已设置")
|
||||
|
||||
@allure.story("验证获得协议分页")
|
||||
@allure.title("测试获得协议分页接口")
|
||||
def test_joyhub_agreement_page_get(self):
|
||||
"""测试获得协议分页接口"""
|
||||
with allure.step("1. 准备请求参数"):
|
||||
params = {
|
||||
"page_no": 1,
|
||||
"page_size": 10,
|
||||
"type": "",
|
||||
"title": "",
|
||||
"content": "",
|
||||
"status": ""
|
||||
}
|
||||
allure.attach(json.dumps(params, ensure_ascii=False), name="请求参数", attachment_type=allure.attachment_type.TEXT)
|
||||
|
||||
with allure.step("2. 调用接口"):
|
||||
resp = self.test_case.kw_joyhub_agreement_page_get(**params)
|
||||
allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON)
|
||||
|
||||
with allure.step("3. 验证响应"):
|
||||
assert resp is not None, "响应为空"
|
||||
assert "code" in resp, "响应中缺少code字段"
|
||||
assert resp["code"] == 0, f"请求失败,code={resp.get('code')}"
|
||||
assert "data" in resp, "响应中缺少data字段"
|
||||
assert "list" in resp["data"], "响应中缺少list字段"
|
||||
assert "total" in resp["data"], "响应中缺少total字段"
|
||||
assert isinstance(resp["data"]["list"], list), "list字段不是列表类型"
|
||||
assert isinstance(resp["data"]["total"], int), "total字段不是整数类型"
|
||||
logging.info("获得协议分页列表验证通过")
|
||||
|
||||
@allure.story("验证创建协议")
|
||||
@allure.title("测试创建协议接口")
|
||||
def test_joyhub_agreement_create_post(self):
|
||||
"""测试创建协议接口"""
|
||||
with allure.step("1. 准备请求参数"):
|
||||
timestamp = int(time.time())
|
||||
params = {
|
||||
"type": 1,
|
||||
"title": f"测试协议_{timestamp}",
|
||||
"content": f"这是测试协议内容_{timestamp}",
|
||||
"terminal": "web",
|
||||
"lang": "de",
|
||||
"rank_num": timestamp % 1000,
|
||||
"status": 2
|
||||
}
|
||||
allure.attach(json.dumps(params, ensure_ascii=False), name="请求参数", attachment_type=allure.attachment_type.TEXT)
|
||||
|
||||
with allure.step("2. 调用接口"):
|
||||
resp = self.test_case.kw_joyhub_agreement_create_post(**params)
|
||||
allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON)
|
||||
|
||||
with allure.step("3. 验证响应"):
|
||||
assert resp is not None, "响应为空"
|
||||
assert "code" in resp, "响应中缺少code字段"
|
||||
assert resp["code"] == 0, f"请求失败,code={resp.get('code')}"
|
||||
assert "data" in resp, "响应中缺少data字段"
|
||||
assert isinstance(resp["data"], int), "data字段不是整数类型"
|
||||
TestAgreementManage.agreement_id = resp["data"]
|
||||
logging.info(f"创建协议成功,协议ID: {TestAgreementManage.agreement_id}")
|
||||
|
||||
@allure.story("验证获得协议详情")
|
||||
@allure.title("测试获得协议详情接口")
|
||||
def test_joyhub_agreement_get_get(self):
|
||||
"""测试获得协议详情接口"""
|
||||
with allure.step("1. 先创建一个协议"):
|
||||
timestamp = int(time.time())
|
||||
create_resp = self.test_case.kw_joyhub_agreement_create_post(
|
||||
type=2,
|
||||
title=f"详情测试协议_{timestamp}",
|
||||
content=f"详情测试协议内容_{timestamp}",
|
||||
terminal="app",
|
||||
lang="ja",
|
||||
rank_num=(timestamp % 1000) + 1000,
|
||||
status=1
|
||||
)
|
||||
agreement_id = create_resp.get("data") if create_resp and create_resp.get("code") == 0 else None
|
||||
|
||||
if not agreement_id:
|
||||
pytest.skip("创建测试协议失败,跳过详情测试")
|
||||
|
||||
allure.attach(json.dumps({"id": agreement_id}, ensure_ascii=False), name="协议ID", attachment_type=allure.attachment_type.TEXT)
|
||||
|
||||
with allure.step("2. 调用获得详情接口"):
|
||||
resp = self.test_case.kw_joyhub_agreement_get_get(agreement_id=agreement_id)
|
||||
allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON)
|
||||
|
||||
with allure.step("3. 验证响应"):
|
||||
assert resp is not None, "响应为空"
|
||||
assert "code" in resp, "响应中缺少code字段"
|
||||
assert resp["code"] == 0, f"请求失败,code={resp.get('code')}"
|
||||
assert "data" in resp, "响应中缺少data字段"
|
||||
assert isinstance(resp["data"], dict), "data字段不是字典类型"
|
||||
assert "id" in resp["data"], "响应中缺少id字段"
|
||||
assert resp["data"]["id"] == agreement_id, "返回的ID与请求的不一致"
|
||||
logging.info("获得协议详情验证通过")
|
||||
|
||||
@allure.story("验证更新协议")
|
||||
@allure.title("测试更新协议接口")
|
||||
def test_joyhub_agreement_update_put(self):
|
||||
"""测试更新协议接口"""
|
||||
with allure.step("1. 先创建一个协议"):
|
||||
timestamp = int(time.time())
|
||||
create_resp = self.test_case.kw_joyhub_agreement_create_post(
|
||||
type=1,
|
||||
title=f"待更新协议_{timestamp}",
|
||||
content=f"待更新协议内容_{timestamp}",
|
||||
terminal="app",
|
||||
lang="de",
|
||||
rank_num=(timestamp % 1000) + 2000,
|
||||
status=1
|
||||
)
|
||||
agreement_id = create_resp.get("data") if create_resp and create_resp.get("code") == 0 else None
|
||||
|
||||
if not agreement_id:
|
||||
pytest.skip("创建测试协议失败,跳过更新测试")
|
||||
|
||||
allure.attach(json.dumps({"id": agreement_id}, ensure_ascii=False), name="协议ID", attachment_type=allure.attachment_type.TEXT)
|
||||
|
||||
with allure.step("2. 调用更新接口"):
|
||||
timestamp = int(time.time())
|
||||
update_params = {
|
||||
"agreement_id": agreement_id,
|
||||
"type": 2,
|
||||
"title": f"已更新协议_{timestamp}",
|
||||
"content": f"已更新协议内容_{timestamp}",
|
||||
"terminal": "web",
|
||||
"lang": "ja",
|
||||
"rank_num": (timestamp % 1000) + 3000,
|
||||
"status": 2
|
||||
}
|
||||
resp = self.test_case.kw_joyhub_agreement_update_put(**update_params)
|
||||
allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON)
|
||||
|
||||
with allure.step("3. 验证响应"):
|
||||
assert resp is not None, "响应为空"
|
||||
assert "code" in resp, "响应中缺少code字段"
|
||||
assert resp["code"] == 0, f"请求失败,code={resp.get('code')}"
|
||||
assert "data" in resp, "响应中缺少data字段"
|
||||
assert resp["data"] is True, "更新协议失败"
|
||||
logging.info("更新协议验证通过")
|
||||
|
||||
@allure.story("验证删除协议")
|
||||
@allure.title("测试删除协议接口")
|
||||
def test_joyhub_agreement_delete_delete(self):
|
||||
"""测试删除协议接口"""
|
||||
with allure.step("1. 先创建一个测试协议"):
|
||||
timestamp = int(time.time())
|
||||
create_resp = self.test_case.kw_joyhub_agreement_create_post(
|
||||
type=1,
|
||||
title=f"待删除协议_{timestamp}",
|
||||
content=f"待删除协议内容_{timestamp}",
|
||||
terminal="web",
|
||||
lang="ja",
|
||||
rank_num=(timestamp % 1000) + 4000,
|
||||
status=2
|
||||
)
|
||||
agreement_id = create_resp.get("data") if create_resp and create_resp.get("code") == 0 else None
|
||||
|
||||
if not agreement_id:
|
||||
pytest.skip("创建测试协议失败,跳过删除测试")
|
||||
|
||||
allure.attach(json.dumps({"id": agreement_id}, ensure_ascii=False), name="待删除协议ID", attachment_type=allure.attachment_type.TEXT)
|
||||
|
||||
with allure.step("2. 调用删除接口"):
|
||||
resp = self.test_case.kw_joyhub_agreement_delete_delete(agreement_id=agreement_id)
|
||||
allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON)
|
||||
|
||||
with allure.step("3. 验证响应"):
|
||||
assert resp is not None, "响应为空"
|
||||
assert "code" in resp, "响应中缺少code字段"
|
||||
assert resp["code"] == 0, f"请求失败,code={resp.get('code')}"
|
||||
assert "data" in resp, "响应中缺少data字段"
|
||||
assert resp["data"] is True, "删除协议失败"
|
||||
logging.info("删除协议验证通过")
|
||||
|
||||
@allure.story("验证批量删除协议")
|
||||
@allure.title("测试批量删除协议接口")
|
||||
def test_joyhub_agreement_delete_list_delete(self):
|
||||
"""测试批量删除协议接口"""
|
||||
with allure.step("1. 先创建两个测试协议"):
|
||||
timestamp = int(time.time())
|
||||
resp1 = self.test_case.kw_joyhub_agreement_create_post(
|
||||
type=2,
|
||||
title=f"批量删除协议1_{timestamp}",
|
||||
content=f"批量删除协议内容1_{timestamp}",
|
||||
terminal="app",
|
||||
lang="de",
|
||||
rank_num=(timestamp % 1000) + 5000,
|
||||
status=2
|
||||
)
|
||||
resp2 = self.test_case.kw_joyhub_agreement_create_post(
|
||||
type=1,
|
||||
title=f"批量删除协议2_{timestamp}",
|
||||
content=f"批量删除协议内容2_{timestamp}",
|
||||
terminal="app",
|
||||
lang="ja",
|
||||
rank_num=(timestamp % 1000) + 6000,
|
||||
status=2
|
||||
)
|
||||
|
||||
agreement_id1 = resp1.get("data") if resp1 and resp1.get("code") == 0 else None
|
||||
agreement_id2 = resp2.get("data") if resp2 and resp2.get("code") == 0 else None
|
||||
|
||||
if not agreement_id1 or not agreement_id2:
|
||||
pytest.skip("创建测试协议失败,跳过批量删除测试")
|
||||
|
||||
agreement_ids = [agreement_id1, agreement_id2]
|
||||
allure.attach(json.dumps({"ids": agreement_ids}, ensure_ascii=False), name="待删除协议IDs", attachment_type=allure.attachment_type.TEXT)
|
||||
|
||||
with allure.step("2. 调用批量删除接口"):
|
||||
resp = self.test_case.kw_joyhub_agreement_delete_list_delete(agreement_ids=agreement_ids)
|
||||
allure.attach(json.dumps(resp, ensure_ascii=False, indent=2), name="响应数据", attachment_type=allure.attachment_type.JSON)
|
||||
|
||||
with allure.step("3. 验证响应"):
|
||||
assert resp is not None, "响应为空"
|
||||
assert "code" in resp, "响应中缺少code字段"
|
||||
assert resp["code"] == 0, f"请求失败,code={resp.get('code')}"
|
||||
assert "data" in resp, "响应中缺少data字段"
|
||||
assert resp["data"] is True, "批量删除协议失败"
|
||||
logging.info("批量删除协议验证通过")
|
||||
|
||||
@allure.story("验证导出Excel")
|
||||
@allure.title("测试导出协议Excel接口")
|
||||
def test_joyhub_agreement_export_excel_get(self):
|
||||
"""测试导出协议Excel接口"""
|
||||
with allure.step("1. 准备请求参数"):
|
||||
params = {
|
||||
"type": "",
|
||||
"title": "",
|
||||
"content": "",
|
||||
"status": ""
|
||||
}
|
||||
allure.attach(json.dumps(params, ensure_ascii=False), name="请求参数", attachment_type=allure.attachment_type.TEXT)
|
||||
|
||||
with allure.step("2. 调用导出Excel接口"):
|
||||
resp = self.test_case.kw_joyhub_agreement_export_excel_get(**params)
|
||||
|
||||
with allure.step("3. 验证响应"):
|
||||
assert resp is not None, "响应为空"
|
||||
assert resp.status_code == 200, f"请求失败,status_code={resp.status_code}"
|
||||
assert len(resp.content) > 0, "响应内容为空"
|
||||
logging.info("导出协议Excel验证通过")
|
||||
Reference in New Issue
Block a user