85 lines
4.0 KiB
Python
85 lines
4.0 KiB
Python
from ddms_compliance_suite.test_framework_core import BaseAPITestCase, TestSeverity, ValidationResult, APIRequestContext, APIResponseContext
|
|
import logging
|
|
|
|
class StatusCode200Check(BaseAPITestCase):
|
|
# 1. 元数据
|
|
id = "TC-STATUS-001"
|
|
name = "基本状态码 200 检查"
|
|
description = "验证 API 响应状态码是否为 200 OK。"
|
|
severity = TestSeverity.CRITICAL
|
|
tags = ["status_code", "smoke_test"]
|
|
use_llm_for_body = False
|
|
# 适用于所有方法和路径 (默认)
|
|
# applicable_methods = None
|
|
# applicable_paths_regex = None
|
|
|
|
def __init__(self, endpoint_spec: dict, global_api_spec: dict):
|
|
super().__init__(endpoint_spec, global_api_spec)
|
|
self.logger.info(f"测试用例 {self.id} ({self.name}) 已针对端点 '{self.endpoint_spec.get('method')} {self.endpoint_spec.get('path')}' 初始化。")
|
|
|
|
def validate_response(self, response_context: APIResponseContext, request_context: APIRequestContext) -> list[ValidationResult]:
|
|
results = []
|
|
expected_status_code = 200
|
|
actual_status_code = response_context.status_code
|
|
|
|
if actual_status_code == expected_status_code:
|
|
results.append(
|
|
ValidationResult(
|
|
passed=True,
|
|
message=f"响应状态码为 {actual_status_code},符合预期 {expected_status_code}。"
|
|
)
|
|
)
|
|
self.logger.info(f"状态码验证通过: {actual_status_code} == {expected_status_code} for {request_context.url}")
|
|
else:
|
|
results.append(
|
|
ValidationResult(
|
|
passed=False,
|
|
message=f"期望状态码 {expected_status_code},但收到 {actual_status_code}。",
|
|
details={
|
|
"expected_status": expected_status_code,
|
|
"actual_status": actual_status_code,
|
|
"request_url": request_context.url,
|
|
"response_body_sample": (response_context.text_content or "")[:200] # 包含部分响应体以帮助诊断
|
|
}
|
|
)
|
|
)
|
|
self.logger.warning(f"状态码验证失败: 期望 {expected_status_code}, 实际 {actual_status_code} for {request_context.url}")
|
|
return results
|
|
|
|
class HeaderExistenceCheck(BaseAPITestCase):
|
|
id = "TC-HEADER-001"
|
|
name = "检查响应中是否存在 'X-Request-ID' 头"
|
|
description = "验证 API 响应是否包含 'X-Request-ID' 头。"
|
|
severity = TestSeverity.MEDIUM
|
|
tags = ["header", "observability"]
|
|
use_llm_for_body = False
|
|
|
|
EXPECTED_HEADER = "X-Request-ID" # 示例,可以根据实际需要修改
|
|
|
|
def __init__(self, endpoint_spec: dict, global_api_spec: dict):
|
|
super().__init__(endpoint_spec, global_api_spec)
|
|
self.logger.info(f"测试用例 {self.id} ({self.name}) 已初始化 for endpoint {self.endpoint_spec.get('path')}")
|
|
|
|
def validate_response(self, response_context: APIResponseContext, request_context: APIRequestContext) -> list[ValidationResult]:
|
|
results = []
|
|
if self.EXPECTED_HEADER in response_context.headers:
|
|
results.append(
|
|
ValidationResult(
|
|
passed=True,
|
|
message=f"响应头中找到了期望的 '{self.EXPECTED_HEADER}'。"
|
|
)
|
|
)
|
|
self.logger.info(f"请求头 '{self.EXPECTED_HEADER}' 存在于 {request_context.url} 的响应中。")
|
|
else:
|
|
results.append(
|
|
ValidationResult(
|
|
passed=False,
|
|
message=f"响应头中未找到期望的 '{self.EXPECTED_HEADER}'。",
|
|
details={
|
|
"expected_header": self.EXPECTED_HEADER,
|
|
"actual_headers": list(response_context.headers.keys())
|
|
}
|
|
)
|
|
)
|
|
self.logger.warning(f"请求头 '{self.EXPECTED_HEADER}' 未在 {request_context.url} 的响应中找到。")
|
|
return results |