ConfigBase and Test

This commit is contained in:
UnCLAS-Prommer
2026-01-12 18:20:03 +08:00
parent 3ab0a2c737
commit 207dc460cb
6 changed files with 1076 additions and 141 deletions

View File

@@ -0,0 +1,105 @@
# 本文件为测试文件请忽略Lint error内含大量的ignore标识
from typing import Any, Optional, Union, List
from pathlib import Path
from importlib import util
import sys
import pytest
TEST_ROOT = Path(__file__).parent.parent.absolute().resolve()
logger_file = TEST_ROOT / "logger.py"
spec = util.spec_from_file_location("src.common.logger", logger_file)
module = util.module_from_spec(spec) # type: ignore
spec.loader.exec_module(module) # type: ignore
sys.modules["src.common.logger"] = module
# 测试对象导入
PROJECT_ROOT: Path = Path(__file__).parent.parent.parent.absolute().resolve()
sys.path.insert(0, str(PROJECT_ROOT))
sys.path.insert(0, str(PROJECT_ROOT / "src" / "config"))
from src.config.config_base import ConfigBase, Field # noqa: E402
class IllegalConfig_Dict(ConfigBase):
a: dict = Field(default_factory=dict)
class IllegalConfig_List(ConfigBase):
b: list = Field(default_factory=list)
class IllegalConfig_Set(ConfigBase):
c: set = Field(default_factory=set)
class IllegalConfig_Tuple(ConfigBase):
d: tuple = Field(default_factory=tuple)
class IllegalConfig_Union(ConfigBase):
e: Union[int, str] = Field(default_factory=str)
class IllegalConfig_Any(ConfigBase):
f: Any = Field(default_factory=dict)
class IllegalConfig_NestedGeneric(ConfigBase):
g: list[List[int]] = Field(default_factory=list)
class IllegalConfig_Any_suppress(ConfigBase):
f: Any = Field(default_factory=dict)
_validate_any: bool = False
class SubClass(ConfigBase):
x: Optional[int] = Field(default=None)
y: list[int] = [123]
class LegalConfig(ConfigBase):
a: dict[str, list[int]] = Field(default_factory=dict)
b: list[int] = Field(default_factory=list)
c: set[str] = Field(default_factory=set)
d: Optional[str] = Field(default=None)
e: SubClass = Field(default_factory=SubClass)
@pytest.mark.parametrize(
"config_class, expected_exception, expected_message",
[
(IllegalConfig_Dict, TypeError, "必须指定键和值的类型参数"),
(IllegalConfig_List, TypeError, "必须指定且仅指定一个类型参数"),
(IllegalConfig_Set, TypeError, "必须指定且仅指定一个类型参数"),
(IllegalConfig_Tuple, TypeError, "不允许使用 Tuple 类型注解"),
(IllegalConfig_Union, TypeError, "不允许使用 Union 类型注解"),
(IllegalConfig_Any, TypeError, "不允许使用 Any 类型注解"),
(IllegalConfig_NestedGeneric, TypeError, "不允许嵌套泛型类型"),
(IllegalConfig_Any_suppress, None, ""),
],
)
def test_illegal_config(config_class, expected_exception, expected_message):
# sourcery skip: no-conditionals-in-tests
if expected_exception:
with pytest.raises(expected_exception) as exc_info:
config_class()
assert expected_message in str(exc_info.value)
assert expected_exception == exc_info.type
else:
config_instance = config_class()
assert isinstance(config_instance, config_class)
def test_legal_config():
config_instance = LegalConfig()
assert isinstance(config_instance, LegalConfig)
assert isinstance(config_instance.a, dict)
assert isinstance(config_instance.b, list)
assert isinstance(config_instance.c, set)
assert config_instance.d is None
assert isinstance(config_instance.e, SubClass)
assert config_instance.e.x is None
assert isinstance(config_instance.e.y, list)
assert config_instance.e.y == [123]

22
pytests/logger.py Normal file
View File

@@ -0,0 +1,22 @@
class MyLogger:
def __init__(self):
pass
def info(self, msg):
print(f"INFO: {msg}")
def error(self, msg):
print(f"ERROR: {msg}")
def debug(self, msg):
print(f"DEBUG: {msg}")
def warning(self, msg):
print(f"WARNING: {msg}")
def trace(self, msg):
print(f"TRACE: {msg}")
def get_logger(*args, **kwargs):
return MyLogger()