58 lines
2.3 KiB
Python
58 lines
2.3 KiB
Python
# -*- coding: utf-8 -*-
|
||
import logging
|
||
import re
|
||
from urllib.parse import urljoin
|
||
|
||
import allure
|
||
import pytest
|
||
|
||
from joyhub_backend.library.hubops_parser import load_hubops_cases
|
||
from joyhub_backend.library.joyhub_interface import JoyhubInterface
|
||
|
||
|
||
ALL_CASES = load_hubops_cases()
|
||
|
||
|
||
def case_id(case):
|
||
raw_id = "{}-{}".format(case.get("case_id"), case.get("name"))
|
||
safe_id = re.sub(r"[^0-9A-Za-z_\u4e00-\u9fa5-]+", "_", raw_id)
|
||
return safe_id[:120]
|
||
|
||
|
||
@allure.feature("JoyHub Backend 接口自动化")
|
||
class TestHubOps(object):
|
||
test_case = JoyhubInterface()
|
||
|
||
def teardown_method(self):
|
||
with allure.step("后置:记录用例结束日志"):
|
||
logging.info("-----------------------------End-------------------------------")
|
||
|
||
@pytest.mark.parametrize("case", ALL_CASES, ids=case_id)
|
||
def test_hub_ops_api(self, case):
|
||
allure.dynamic.title("{} {}".format(case.get("case_id"), case.get("name")))
|
||
allure.dynamic.story(case.get("name"))
|
||
|
||
with allure.step("前置:初始化接口客户端并准备鉴权 token"):
|
||
headers = case.get("headers") or {}
|
||
query = case.get("query") or {}
|
||
body = case.get("body") or {}
|
||
|
||
response_data = self.test_case.request(
|
||
case.get("name"),
|
||
case.get("method"),
|
||
case.get("url"),
|
||
body=body,
|
||
query=query,
|
||
headers=headers,
|
||
)
|
||
with allure.step("断言内容:校验响应基础字段"):
|
||
request_url = case.get("url") or ""
|
||
full_url = request_url if request_url.startswith("http") else urljoin(self.test_case.base_url, request_url.lstrip("/"))
|
||
if full_url.startswith(self.test_case.base_url):
|
||
assert isinstance(response_data, dict), "断言失败原因:响应不是JSON对象,响应{}".format(response_data)
|
||
assert "code" in response_data, "断言失败原因:响应缺少code字段,响应{}".format(response_data)
|
||
assert response_data.get("msg") is not None, "断言失败原因:msg字段不能为空,响应{}".format(response_data)
|
||
else:
|
||
assert response_data is not None, "断言失败原因:非业务接口响应为空"
|
||
logging.info("断言通过:%s", case.get("name"))
|