08ea5fbe98
添加用户管理视图、API和状态管理文件
307 lines
11 KiB
Python
307 lines
11 KiB
Python
import pytest
|
|
from click.testing import CliRunner
|
|
from unittest.mock import patch, MagicMock
|
|
from apitest.main import cli
|
|
import sys
|
|
|
|
|
|
def test_cli_version():
|
|
"""测试版本信息"""
|
|
runner = CliRunner()
|
|
result = runner.invoke(cli, ['--version'])
|
|
assert result.exit_code == 0
|
|
assert '1.0.0' in result.output
|
|
|
|
|
|
def test_cli_with_no_command():
|
|
"""测试无命令时显示帮助信息"""
|
|
runner = CliRunner()
|
|
result = runner.invoke(cli, [])
|
|
assert result.exit_code == 0
|
|
assert '黑盒API测试工具' in result.output
|
|
|
|
|
|
def test_cli_run_with_valid_options():
|
|
"""测试有效命令执行"""
|
|
runner = CliRunner()
|
|
|
|
with patch('apitest.main.ConfigManager') as mock_config:
|
|
with patch('apitest.main.LoggerManager') as mock_logger:
|
|
with patch('apitest.main.TestOrchestrator') as mock_orchestrator:
|
|
with patch('apitest.main.ReportManager') as mock_report:
|
|
mock_config.return_value = MagicMock()
|
|
mock_logger.return_value = MagicMock()
|
|
mock_orchestrator.return_value = MagicMock()
|
|
mock_report.return_value = MagicMock()
|
|
|
|
mock_results = MagicMock()
|
|
mock_results.passed = 10
|
|
mock_results.failed = 0
|
|
mock_results.skipped = 0
|
|
mock_orchestrator.return_value.run_suite.return_value = mock_results
|
|
|
|
result = runner.invoke(cli, ['run', '--suite', 'test-suite'])
|
|
|
|
assert result.exit_code == 0
|
|
assert mock_orchestrator.return_value.run_suite.called
|
|
|
|
|
|
def test_cli_run_with_filter():
|
|
"""测试带过滤器的运行命令"""
|
|
runner = CliRunner()
|
|
|
|
with patch('apitest.main.ConfigManager') as mock_config:
|
|
with patch('apitest.main.LoggerManager') as mock_logger:
|
|
with patch('apitest.main.TestOrchestrator') as mock_orchestrator:
|
|
with patch('apitest.main.ReportManager') as mock_report:
|
|
mock_config.return_value = MagicMock()
|
|
mock_logger.return_value = MagicMock()
|
|
mock_orchestrator.return_value = MagicMock()
|
|
mock_report.return_value = MagicMock()
|
|
|
|
mock_results = MagicMock()
|
|
mock_results.passed = 5
|
|
mock_results.failed = 0
|
|
mock_results.skipped = 0
|
|
mock_orchestrator.return_value.run_suite.return_value = mock_results
|
|
|
|
result = runner.invoke(cli, ['run', '--filter', 'priority=high'])
|
|
|
|
assert result.exit_code == 0
|
|
|
|
|
|
def test_cli_run_with_parallel():
|
|
"""测试并发执行"""
|
|
runner = CliRunner()
|
|
|
|
with patch('apitest.main.ConfigManager') as mock_config:
|
|
with patch('apitest.main.LoggerManager') as mock_logger:
|
|
with patch('apitest.main.TestOrchestrator') as mock_orchestrator:
|
|
with patch('apitest.main.ReportManager') as mock_report:
|
|
mock_config.return_value = MagicMock()
|
|
mock_logger.return_value = MagicMock()
|
|
mock_orchestrator.return_value = MagicMock()
|
|
mock_report.return_value = MagicMock()
|
|
|
|
mock_results = MagicMock()
|
|
mock_results.passed = 10
|
|
mock_results.failed = 0
|
|
mock_results.skipped = 0
|
|
mock_orchestrator.return_value.run_suite.return_value = mock_results
|
|
|
|
result = runner.invoke(cli, ['run', '--parallel', '--threads', '8'])
|
|
|
|
assert result.exit_code == 0
|
|
|
|
|
|
def test_cli_run_with_failed_tests():
|
|
"""测试有失败测试的情况"""
|
|
runner = CliRunner()
|
|
|
|
with patch('apitest.main.ConfigManager') as mock_config:
|
|
with patch('apitest.main.LoggerManager') as mock_logger:
|
|
with patch('apitest.main.TestOrchestrator') as mock_orchestrator:
|
|
with patch('apitest.main.ReportManager') as mock_report:
|
|
mock_config.return_value = MagicMock()
|
|
mock_logger.return_value = MagicMock()
|
|
mock_orchestrator.return_value = MagicMock()
|
|
mock_report.return_value = MagicMock()
|
|
|
|
mock_results = MagicMock()
|
|
mock_results.passed = 5
|
|
mock_results.failed = 2
|
|
mock_results.skipped = 0
|
|
mock_orchestrator.return_value.run_suite.return_value = mock_results
|
|
|
|
result = runner.invoke(cli, ['run'])
|
|
|
|
assert result.exit_code == 1
|
|
|
|
|
|
def test_cli_run_with_exception():
|
|
"""测试异常处理"""
|
|
runner = CliRunner()
|
|
|
|
with patch('apitest.main.ConfigManager') as mock_config:
|
|
mock_config.side_effect = Exception("Config error")
|
|
|
|
result = runner.invoke(cli, ['run'])
|
|
|
|
assert result.exit_code == 1
|
|
assert '执行测试时出错' in result.output
|
|
|
|
|
|
def test_cli_list_command():
|
|
"""测试list命令"""
|
|
runner = CliRunner()
|
|
|
|
with patch('apitest.main.ConfigManager') as mock_config:
|
|
with patch('apitest.main.LoggerManager') as mock_logger:
|
|
with patch('apitest.main.TestOrchestrator') as mock_orchestrator:
|
|
mock_config.return_value = MagicMock()
|
|
mock_logger.return_value = MagicMock()
|
|
mock_orchestrator.return_value = MagicMock()
|
|
|
|
mock_test_case = MagicMock()
|
|
mock_test_case.id = 'test-001'
|
|
mock_test_case.name = 'Test Case 1'
|
|
mock_test_case.module = 'user'
|
|
mock_test_case.method.value = 'GET'
|
|
mock_test_case.endpoint = '/api/user'
|
|
mock_test_case.priority = 'high'
|
|
mock_test_case.enabled = True
|
|
|
|
mock_orchestrator.return_value.list_test_cases.return_value = [mock_test_case]
|
|
|
|
result = runner.invoke(cli, ['list'])
|
|
|
|
assert result.exit_code == 0
|
|
assert '测试套件' in result.output
|
|
assert 'test-001' in result.output
|
|
|
|
|
|
def test_cli_list_with_filter():
|
|
"""测试带过滤器的list命令"""
|
|
runner = CliRunner()
|
|
|
|
with patch('apitest.main.ConfigManager') as mock_config:
|
|
with patch('apitest.main.LoggerManager') as mock_logger:
|
|
with patch('apitest.main.TestOrchestrator') as mock_orchestrator:
|
|
mock_config.return_value = MagicMock()
|
|
mock_logger.return_value = MagicMock()
|
|
mock_orchestrator.return_value = MagicMock()
|
|
|
|
mock_orchestrator.return_value.list_test_cases.return_value = []
|
|
|
|
result = runner.invoke(cli, ['list', '--filter', 'priority=high'])
|
|
|
|
assert result.exit_code == 0
|
|
|
|
|
|
def test_cli_list_with_exception():
|
|
"""测试list命令异常处理"""
|
|
runner = CliRunner()
|
|
|
|
with patch('apitest.main.ConfigManager') as mock_config:
|
|
mock_config.side_effect = Exception("List error")
|
|
|
|
result = runner.invoke(cli, ['list'])
|
|
|
|
assert result.exit_code == 1
|
|
assert '列出测试用例时出错' in result.output
|
|
|
|
|
|
def test_cli_report_command():
|
|
"""测试report命令"""
|
|
runner = CliRunner()
|
|
|
|
with patch('apitest.main.ConfigManager') as mock_config:
|
|
with patch('apitest.main.LoggerManager') as mock_logger:
|
|
with patch('apitest.main.ReportManager') as mock_report:
|
|
mock_config.return_value = MagicMock()
|
|
mock_logger.return_value = MagicMock()
|
|
mock_report.return_value = MagicMock()
|
|
|
|
result = runner.invoke(cli, ['report'])
|
|
|
|
assert result.exit_code == 0
|
|
assert '报告已生成' in result.output
|
|
|
|
|
|
def test_cli_report_with_output():
|
|
"""测试带输出路径的report命令"""
|
|
runner = CliRunner()
|
|
|
|
with patch('apitest.main.ConfigManager') as mock_config:
|
|
with patch('apitest.main.LoggerManager') as mock_logger:
|
|
with patch('apitest.main.ReportManager') as mock_report:
|
|
mock_config.return_value = MagicMock()
|
|
mock_logger.return_value = MagicMock()
|
|
mock_report.return_value = MagicMock()
|
|
|
|
result = runner.invoke(cli, ['report', '--output', '/tmp/report.html'])
|
|
|
|
assert result.exit_code == 0
|
|
|
|
|
|
def test_cli_report_with_exception():
|
|
"""测试report命令异常处理"""
|
|
runner = CliRunner()
|
|
|
|
with patch('apitest.main.ConfigManager') as mock_config:
|
|
mock_config.side_effect = Exception("Report error")
|
|
|
|
result = runner.invoke(cli, ['report'])
|
|
|
|
assert result.exit_code == 1
|
|
assert '生成报告时出错' in result.output
|
|
|
|
|
|
def test_cli_config_get():
|
|
"""测试config get命令"""
|
|
runner = CliRunner()
|
|
|
|
with patch('apitest.main.ConfigManager') as mock_config:
|
|
mock_config.return_value = MagicMock()
|
|
mock_config.return_value.get.return_value = 'test-value'
|
|
|
|
result = runner.invoke(cli, ['config', '--get', 'test-key'])
|
|
|
|
assert result.exit_code == 0
|
|
assert 'test-key = test-value' in result.output
|
|
|
|
|
|
def test_cli_config_set():
|
|
"""测试config set命令"""
|
|
runner = CliRunner()
|
|
|
|
with patch('apitest.main.ConfigManager') as mock_config:
|
|
mock_config.return_value = MagicMock()
|
|
|
|
result = runner.invoke(cli, ['config', '--set', 'test.key=test-value'])
|
|
|
|
assert result.exit_code == 0
|
|
assert '配置已设置' in result.output
|
|
mock_config.return_value.set.assert_called_once_with('test.key', 'test-value')
|
|
|
|
|
|
def test_cli_config_validate():
|
|
"""测试config validate命令"""
|
|
runner = CliRunner()
|
|
|
|
with patch('apitest.main.ConfigManager') as mock_config:
|
|
mock_config.return_value = MagicMock()
|
|
mock_config.return_value.validate.return_value = (True, [])
|
|
|
|
result = runner.invoke(cli, ['config', '--validate'])
|
|
|
|
assert result.exit_code == 0
|
|
assert '配置验证通过' in result.output
|
|
|
|
|
|
def test_cli_config_validate_with_errors():
|
|
"""测试config validate命令带错误"""
|
|
runner = CliRunner()
|
|
|
|
with patch('apitest.main.ConfigManager') as mock_config:
|
|
mock_config.return_value = MagicMock()
|
|
mock_config.return_value.validate.return_value = (False, ['Error 1', 'Error 2'])
|
|
|
|
result = runner.invoke(cli, ['config', '--validate'])
|
|
|
|
assert result.exit_code == 1
|
|
assert '配置验证失败' in result.output
|
|
|
|
|
|
def test_cli_config_with_exception():
|
|
"""测试config命令异常处理"""
|
|
runner = CliRunner()
|
|
|
|
with patch('apitest.main.ConfigManager') as mock_config:
|
|
mock_config.side_effect = Exception("Config error")
|
|
|
|
result = runner.invoke(cli, ['config'])
|
|
|
|
assert result.exit_code == 1
|
|
assert '配置管理时出错' in result.output
|