Files

300 lines
14 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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验证通过")