08ea5fbe98
添加用户管理视图、API和状态管理文件
481 lines
15 KiB
Python
481 lines
15 KiB
Python
import pytest
|
|
from apitest.models.test_models import TestCase, HTTPMethod, PerformanceMetrics
|
|
from apitest.core.validation_engine import ValidationEngine
|
|
from apitest.models.exceptions import ValidationException
|
|
|
|
|
|
class TestValidationEngine:
|
|
"""测试ValidationEngine验证引擎"""
|
|
|
|
@pytest.fixture
|
|
def validation_engine(self):
|
|
"""创建验证引擎实例"""
|
|
return ValidationEngine()
|
|
|
|
def test_validate_status_code_success(self, validation_engine):
|
|
"""测试状态码验证成功"""
|
|
test_case = TestCase(
|
|
id="TC001",
|
|
name="测试状态码",
|
|
description="测试状态码验证",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[{"type": "status_code", "value": 200}]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{"message": "success"},
|
|
{}
|
|
)
|
|
|
|
assert passed == True
|
|
assert error == ""
|
|
|
|
def test_validate_status_code_failure(self, validation_engine):
|
|
"""测试状态码验证失败"""
|
|
test_case = TestCase(
|
|
id="TC001",
|
|
name="测试状态码",
|
|
description="测试状态码验证",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[{"type": "status_code", "value": 200}]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
404,
|
|
{"message": "not found"},
|
|
{}
|
|
)
|
|
|
|
assert passed == False
|
|
assert "状态码验证失败" in error
|
|
|
|
def test_validate_contains_success(self, validation_engine):
|
|
"""测试包含验证成功"""
|
|
test_case = TestCase(
|
|
id="TC002",
|
|
name="测试包含",
|
|
description="测试包含验证",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[{"type": "contains", "value": "success"}]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{"message": "operation success"},
|
|
{}
|
|
)
|
|
|
|
assert passed == True
|
|
assert error == ""
|
|
|
|
def test_validate_contains_failure(self, validation_engine):
|
|
"""测试包含验证失败"""
|
|
test_case = TestCase(
|
|
id="TC002",
|
|
name="测试包含",
|
|
description="测试包含验证",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[{"type": "contains", "value": "error"}]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{"message": "operation success"},
|
|
{}
|
|
)
|
|
|
|
assert passed == False
|
|
assert "包含验证失败" in error
|
|
|
|
def test_validate_contains_with_field(self, validation_engine):
|
|
"""测试字段包含验证"""
|
|
test_case = TestCase(
|
|
id="TC003",
|
|
name="测试字段包含",
|
|
description="测试字段包含验证",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[{"type": "contains", "field": "message", "value": "success"}]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{"message": "operation success"},
|
|
{}
|
|
)
|
|
|
|
assert passed == True
|
|
|
|
def test_validate_equals_success(self, validation_engine):
|
|
"""测试相等验证成功"""
|
|
test_case = TestCase(
|
|
id="TC004",
|
|
name="测试相等",
|
|
description="测试相等验证",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[{"type": "equals", "field": "status", "value": "ok"}]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{"status": "ok"},
|
|
{}
|
|
)
|
|
|
|
assert passed == True
|
|
|
|
def test_validate_equals_failure(self, validation_engine):
|
|
"""测试相等验证失败"""
|
|
test_case = TestCase(
|
|
id="TC004",
|
|
name="测试相等",
|
|
description="测试相等验证",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[{"type": "equals", "field": "status", "value": "ok"}]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{"status": "error"},
|
|
{}
|
|
)
|
|
|
|
assert passed == False
|
|
assert "相等验证失败" in error
|
|
|
|
def test_validate_json_path_success(self, validation_engine):
|
|
"""测试JSON路径验证成功"""
|
|
test_case = TestCase(
|
|
id="TC005",
|
|
name="测试JSON路径",
|
|
description="测试JSON路径验证",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[{"type": "json_path", "path": "data.user.name", "value": "John"}]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{"data": {"user": {"name": "John"}}},
|
|
{}
|
|
)
|
|
|
|
assert passed == True
|
|
|
|
def test_validate_json_path_failure(self, validation_engine):
|
|
"""测试JSON路径验证失败"""
|
|
test_case = TestCase(
|
|
id="TC005",
|
|
name="测试JSON路径",
|
|
description="测试JSON路径验证",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[{"type": "json_path", "path": "data.user.name", "value": "Jane"}]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{"data": {"user": {"name": "John"}}},
|
|
{}
|
|
)
|
|
|
|
assert passed == False
|
|
assert "JSON路径验证失败" in error
|
|
|
|
def test_validate_regex_success(self, validation_engine):
|
|
"""测试正则表达式验证成功"""
|
|
test_case = TestCase(
|
|
id="TC006",
|
|
name="测试正则表达式",
|
|
description="测试正则表达式验证",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[{"type": "regex", "field": "email", "pattern": r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"}]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{"email": "test@example.com"},
|
|
{}
|
|
)
|
|
|
|
assert passed == True
|
|
|
|
def test_validate_regex_failure(self, validation_engine):
|
|
"""测试正则表达式验证失败"""
|
|
test_case = TestCase(
|
|
id="TC006",
|
|
name="测试正则表达式",
|
|
description="测试正则表达式验证",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[{"type": "regex", "field": "email", "pattern": r"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$"}]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{"email": "invalid-email"},
|
|
{}
|
|
)
|
|
|
|
assert passed == False
|
|
assert "正则表达式验证失败" in error
|
|
|
|
def test_validate_header_success(self, validation_engine):
|
|
"""测试响应头验证成功"""
|
|
test_case = TestCase(
|
|
id="TC007",
|
|
name="测试响应头",
|
|
description="测试响应头验证",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[{"type": "header", "name": "Content-Type", "value": "application/json"}]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{},
|
|
{"Content-Type": "application/json"}
|
|
)
|
|
|
|
assert passed == True
|
|
|
|
def test_validate_header_not_found(self, validation_engine):
|
|
"""测试响应头不存在"""
|
|
test_case = TestCase(
|
|
id="TC007",
|
|
name="测试响应头",
|
|
description="测试响应头验证",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[{"type": "header", "name": "X-Custom-Header"}]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{},
|
|
{"Content-Type": "application/json"}
|
|
)
|
|
|
|
assert passed == False
|
|
assert "响应头中未找到" in error
|
|
|
|
def test_validate_schema_success(self, validation_engine):
|
|
"""测试结构验证成功"""
|
|
test_case = TestCase(
|
|
id="TC008",
|
|
name="测试结构",
|
|
description="测试结构验证",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[{"type": "schema", "schema": {"name": "str", "age": "int"}}]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{"name": "John", "age": 30},
|
|
{}
|
|
)
|
|
|
|
assert passed == True
|
|
|
|
def test_validate_schema_failure(self, validation_engine):
|
|
"""测试结构验证失败"""
|
|
test_case = TestCase(
|
|
id="TC008",
|
|
name="测试结构",
|
|
description="测试结构验证",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[{"type": "schema", "schema": {"name": "str", "age": "int"}}]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{"name": "John", "age": "thirty"},
|
|
{}
|
|
)
|
|
|
|
assert passed == False
|
|
assert "字段 age 类型错误" in error
|
|
|
|
def test_validate_performance_success(self, validation_engine):
|
|
"""测试性能验证成功"""
|
|
from datetime import datetime
|
|
performance = PerformanceMetrics(
|
|
timestamp=datetime.now(),
|
|
response_time=1000,
|
|
request_size=100,
|
|
response_size=200
|
|
)
|
|
|
|
passed, error = validation_engine.validate_performance(performance, 5000)
|
|
|
|
assert passed == True
|
|
assert error == ""
|
|
|
|
def test_validate_performance_failure(self, validation_engine):
|
|
"""测试性能验证失败"""
|
|
from datetime import datetime
|
|
performance = PerformanceMetrics(
|
|
timestamp=datetime.now(),
|
|
response_time=6000,
|
|
request_size=100,
|
|
response_size=200
|
|
)
|
|
|
|
passed, error = validation_engine.validate_performance(performance, 5000)
|
|
|
|
assert passed == False
|
|
assert "响应时间超过阈值" in error
|
|
|
|
def test_validate_multiple_validations(self, validation_engine):
|
|
"""测试多个验证规则"""
|
|
test_case = TestCase(
|
|
id="TC009",
|
|
name="测试多验证",
|
|
description="测试多个验证规则",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[
|
|
{"type": "status_code", "value": 200},
|
|
{"type": "contains", "value": "success"},
|
|
{"type": "equals", "field": "status", "value": "ok"}
|
|
]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{"status": "ok", "message": "operation success"},
|
|
{}
|
|
)
|
|
|
|
assert passed == True
|
|
|
|
def test_validate_multiple_validations_failure(self, validation_engine):
|
|
"""测试多个验证规则(其中一个失败)"""
|
|
test_case = TestCase(
|
|
id="TC009",
|
|
name="测试多验证",
|
|
description="测试多个验证规则",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[
|
|
{"type": "status_code", "value": 200},
|
|
{"type": "contains", "value": "error"},
|
|
{"type": "equals", "field": "status", "value": "ok"}
|
|
]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{"status": "ok", "message": "operation success"},
|
|
{}
|
|
)
|
|
|
|
assert passed == False
|
|
assert "包含验证失败" in error
|
|
|
|
def test_validate_no_validations(self, validation_engine):
|
|
"""测试无验证规则"""
|
|
test_case = TestCase(
|
|
id="TC010",
|
|
name="测试无验证",
|
|
description="测试无验证规则",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={}
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{"message": "success"},
|
|
{}
|
|
)
|
|
|
|
assert passed == True
|
|
assert error == ""
|
|
|
|
def test_validate_unsupported_type(self, validation_engine):
|
|
"""测试不支持的验证类型"""
|
|
test_case = TestCase(
|
|
id="TC011",
|
|
name="测试不支持的类型",
|
|
description="测试不支持的验证类型",
|
|
module="test",
|
|
endpoint="/api/test",
|
|
method=HTTPMethod.GET,
|
|
headers={},
|
|
validations=[{"type": "unsupported_type"}]
|
|
)
|
|
|
|
passed, error = validation_engine.validate_response(
|
|
test_case,
|
|
200,
|
|
{"message": "success"},
|
|
{}
|
|
)
|
|
|
|
assert passed == False
|
|
assert "不支持的验证类型" in error
|