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