feat(admin): 添加用户管理相关文件
添加用户管理视图、API和状态管理文件
This commit is contained in:
@@ -0,0 +1,297 @@
|
||||
"""测试数据管理器单元测试"""
|
||||
|
||||
import pytest
|
||||
from pathlib import Path
|
||||
from unittest.mock import Mock
|
||||
from apitest.data.test_data_manager import TestDataManager
|
||||
from apitest.models.test_models import TestCase, HTTPMethod
|
||||
from apitest.models.exceptions import TestRunException
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_logger():
|
||||
"""创建模拟日志记录器"""
|
||||
return Mock()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def data_manager(mock_logger):
|
||||
"""创建测试数据管理器实例"""
|
||||
return TestDataManager(logger=mock_logger)
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def sample_test_cases():
|
||||
"""创建示例测试用例"""
|
||||
return [
|
||||
TestCase(
|
||||
id="TC001",
|
||||
name="测试用例1",
|
||||
description="测试用例1",
|
||||
module="test",
|
||||
endpoint="/api/test1",
|
||||
method=HTTPMethod.GET,
|
||||
headers={},
|
||||
enabled=True
|
||||
),
|
||||
TestCase(
|
||||
id="TC002",
|
||||
name="测试用例2",
|
||||
description="测试用例2",
|
||||
module="test",
|
||||
endpoint="/api/test2",
|
||||
method=HTTPMethod.POST,
|
||||
headers={},
|
||||
enabled=True
|
||||
)
|
||||
]
|
||||
|
||||
|
||||
def test_load_test_cases_from_json_success(data_manager, tmp_path):
|
||||
"""测试从JSON文件加载测试用例(成功)"""
|
||||
import json
|
||||
|
||||
test_data = [
|
||||
{
|
||||
"id": "TC001",
|
||||
"name": "测试用例1",
|
||||
"description": "测试用例1",
|
||||
"module": "test",
|
||||
"endpoint": "/api/test1",
|
||||
"method": "GET",
|
||||
"headers": {},
|
||||
"enabled": True
|
||||
},
|
||||
{
|
||||
"id": "TC002",
|
||||
"name": "测试用例2",
|
||||
"description": "测试用例2",
|
||||
"module": "test",
|
||||
"endpoint": "/api/test2",
|
||||
"method": "POST",
|
||||
"headers": {},
|
||||
"enabled": True
|
||||
}
|
||||
]
|
||||
|
||||
test_file = tmp_path / "test_cases.json"
|
||||
with open(test_file, "w", encoding="utf-8") as f:
|
||||
json.dump(test_data, f)
|
||||
|
||||
test_cases = data_manager.load_test_cases_from_json(test_file)
|
||||
|
||||
assert len(test_cases) == 2
|
||||
assert test_cases[0].id == "TC001"
|
||||
assert test_cases[1].id == "TC002"
|
||||
assert test_cases[0].method == HTTPMethod.GET
|
||||
assert test_cases[1].method == HTTPMethod.POST
|
||||
|
||||
|
||||
def test_load_test_cases_from_json_file_not_found(data_manager, tmp_path):
|
||||
"""测试从JSON文件加载测试用例(文件不存在)"""
|
||||
test_file = tmp_path / "nonexistent.json"
|
||||
|
||||
with pytest.raises(TestRunException) as exc_info:
|
||||
data_manager.load_test_cases_from_json(test_file)
|
||||
|
||||
assert "测试用例文件不存在" in str(exc_info.value)
|
||||
|
||||
|
||||
def test_load_test_cases_from_json_invalid_json(data_manager, tmp_path):
|
||||
"""测试从JSON文件加载测试用例(无效JSON)"""
|
||||
test_file = tmp_path / "invalid.json"
|
||||
with open(test_file, "w", encoding="utf-8") as f:
|
||||
f.write("{ invalid json }")
|
||||
|
||||
with pytest.raises(TestRunException) as exc_info:
|
||||
data_manager.load_test_cases_from_json(test_file)
|
||||
|
||||
assert "JSON文件解析失败" in str(exc_info.value)
|
||||
|
||||
|
||||
def test_load_test_cases_from_json_invalid_method(data_manager, tmp_path):
|
||||
"""测试从JSON文件加载测试用例(无效HTTP方法)"""
|
||||
import json
|
||||
|
||||
test_data = [
|
||||
{
|
||||
"id": "TC001",
|
||||
"name": "测试用例1",
|
||||
"description": "测试用例1",
|
||||
"module": "test",
|
||||
"endpoint": "/api/test1",
|
||||
"method": "INVALID",
|
||||
"headers": {},
|
||||
"enabled": True
|
||||
}
|
||||
]
|
||||
|
||||
test_file = tmp_path / "test_cases.json"
|
||||
with open(test_file, "w", encoding="utf-8") as f:
|
||||
json.dump(test_data, f)
|
||||
|
||||
test_cases = data_manager.load_test_cases_from_json(test_file)
|
||||
|
||||
assert len(test_cases) == 1
|
||||
assert test_cases[0].method == HTTPMethod.GET
|
||||
|
||||
|
||||
def test_load_test_data_from_csv_success(data_manager, tmp_path):
|
||||
"""测试从CSV文件加载测试数据(成功)"""
|
||||
test_file = tmp_path / "test_data.csv"
|
||||
with open(test_file, "w", encoding="utf-8", newline="") as f:
|
||||
f.write("param1,param2,param3\n")
|
||||
f.write("value1,value2,value3\n")
|
||||
f.write("value4,value5,value6\n")
|
||||
|
||||
test_data = data_manager.load_test_data_from_csv(test_file)
|
||||
|
||||
assert len(test_data) == 2
|
||||
assert test_data[0] == {"param1": "value1", "param2": "value2", "param3": "value3"}
|
||||
assert test_data[1] == {"param1": "value4", "param2": "value5", "param3": "value6"}
|
||||
|
||||
|
||||
def test_load_test_data_from_csv_file_not_found(data_manager, tmp_path):
|
||||
"""测试从CSV文件加载测试数据(文件不存在)"""
|
||||
test_file = tmp_path / "nonexistent.csv"
|
||||
|
||||
with pytest.raises(TestRunException) as exc_info:
|
||||
data_manager.load_test_data_from_csv(test_file)
|
||||
|
||||
assert "测试数据文件不存在" in str(exc_info.value)
|
||||
|
||||
|
||||
def test_parameterize_test_case_success(data_manager, sample_test_cases):
|
||||
"""测试参数化测试用例(成功)"""
|
||||
test_data = [
|
||||
{"params": {"id": "1"}, "body": {"name": "test1"}},
|
||||
{"params": {"id": "2"}, "body": {"name": "test2"}}
|
||||
]
|
||||
|
||||
parameterized_cases = data_manager.parameterize_test_case(
|
||||
sample_test_cases[0],
|
||||
test_data
|
||||
)
|
||||
|
||||
assert len(parameterized_cases) == 2
|
||||
assert parameterized_cases[0].id == "TC001_1"
|
||||
assert parameterized_cases[0].name == "测试用例1 (数据集 1)"
|
||||
assert parameterized_cases[0].params == {"id": "1"}
|
||||
assert parameterized_cases[0].body == {"name": "test1"}
|
||||
assert parameterized_cases[1].id == "TC001_2"
|
||||
assert parameterized_cases[1].name == "测试用例1 (数据集 2)"
|
||||
assert parameterized_cases[1].params == {"id": "2"}
|
||||
assert parameterized_cases[1].body == {"name": "test2"}
|
||||
|
||||
|
||||
def test_parameterize_test_case_empty_data(data_manager, sample_test_cases):
|
||||
"""测试参数化测试用例(空数据)"""
|
||||
test_data = []
|
||||
|
||||
parameterized_cases = data_manager.parameterize_test_case(
|
||||
sample_test_cases[0],
|
||||
test_data
|
||||
)
|
||||
|
||||
assert len(parameterized_cases) == 0
|
||||
|
||||
|
||||
def test_save_test_cases_to_json_success(data_manager, sample_test_cases, tmp_path):
|
||||
"""测试保存测试用例到JSON文件(成功)"""
|
||||
output_file = tmp_path / "output.json"
|
||||
|
||||
data_manager.save_test_cases_to_json(sample_test_cases, output_file)
|
||||
|
||||
assert output_file.exists()
|
||||
|
||||
import json
|
||||
with open(output_file, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
|
||||
assert len(data) == 2
|
||||
assert data[0]["id"] == "TC001"
|
||||
assert data[1]["id"] == "TC002"
|
||||
|
||||
|
||||
def test_save_test_cases_to_json_create_directory(data_manager, sample_test_cases, tmp_path):
|
||||
"""测试保存测试用例到JSON文件(创建目录)"""
|
||||
output_file = tmp_path / "nested" / "dir" / "output.json"
|
||||
|
||||
data_manager.save_test_cases_to_json(sample_test_cases, output_file)
|
||||
|
||||
assert output_file.exists()
|
||||
assert output_file.parent.exists()
|
||||
|
||||
|
||||
def test_save_test_data_to_csv_success(data_manager, tmp_path):
|
||||
"""测试保存测试数据到CSV文件(成功)"""
|
||||
test_data = [
|
||||
{"param1": "value1", "param2": "value2"},
|
||||
{"param1": "value3", "param2": "value4"}
|
||||
]
|
||||
|
||||
output_file = tmp_path / "output.csv"
|
||||
|
||||
data_manager.save_test_data_to_csv(test_data, output_file)
|
||||
|
||||
assert output_file.exists()
|
||||
|
||||
import csv
|
||||
with open(output_file, "r", encoding="utf-8") as f:
|
||||
reader = csv.DictReader(f)
|
||||
rows = list(reader)
|
||||
|
||||
assert len(rows) == 2
|
||||
assert rows[0]["param1"] == "value1"
|
||||
assert rows[1]["param1"] == "value3"
|
||||
|
||||
|
||||
def test_save_test_data_to_csv_with_fieldnames(data_manager, tmp_path):
|
||||
"""测试保存测试数据到CSV文件(指定字段名)"""
|
||||
test_data = [
|
||||
{"param1": "value1", "param2": "value2", "param3": "value3"},
|
||||
{"param1": "value4", "param2": "value5", "param3": "value6"}
|
||||
]
|
||||
|
||||
output_file = tmp_path / "output.csv"
|
||||
|
||||
data_manager.save_test_data_to_csv(
|
||||
test_data,
|
||||
output_file,
|
||||
fieldnames=["param1", "param2"]
|
||||
)
|
||||
|
||||
assert output_file.exists()
|
||||
|
||||
import csv
|
||||
with open(output_file, "r", encoding="utf-8") as f:
|
||||
reader = csv.DictReader(f)
|
||||
rows = list(reader)
|
||||
fieldnames = reader.fieldnames
|
||||
|
||||
assert len(rows) == 2
|
||||
assert fieldnames == ["param1", "param2"]
|
||||
|
||||
|
||||
def test_save_test_data_to_csv_empty_data(data_manager, tmp_path):
|
||||
"""测试保存测试数据到CSV文件(空数据)"""
|
||||
test_data = []
|
||||
|
||||
output_file = tmp_path / "output.csv"
|
||||
|
||||
with pytest.raises(TestRunException) as exc_info:
|
||||
data_manager.save_test_data_to_csv(test_data, output_file)
|
||||
|
||||
assert "测试数据为空" in str(exc_info.value)
|
||||
|
||||
|
||||
def test_save_test_data_to_csv_create_directory(data_manager, tmp_path):
|
||||
"""测试保存测试数据到CSV文件(创建目录)"""
|
||||
test_data = [{"param1": "value1"}]
|
||||
|
||||
output_file = tmp_path / "nested" / "dir" / "output.csv"
|
||||
|
||||
data_manager.save_test_data_to_csv(test_data, output_file)
|
||||
|
||||
assert output_file.exists()
|
||||
assert output_file.parent.exists()
|
||||
Reference in New Issue
Block a user