options = $this->parseArguments($argv); $this->baseCommand = 'php artisan test'; } /** * 运行测试 */ public function run(): void { $this->displayHeader(); if (isset($this->options['help'])) { $this->displayHelp(); return; } if (isset($this->options['config'])) { $this->displayConfig(); return; } $this->checkEnvironment(); if (isset($this->options['all'])) { $this->runAllTests(); } elseif (isset($this->options['pesticide'])) { $this->runPesticideTests(); } elseif (isset($this->options['weedicide'])) { $this->runWeedicideTests(); } elseif (isset($this->options['watering'])) { $this->runWateringTests(); } elseif (isset($this->options['suite'])) { $this->runTestSuite(); } else { $this->displayHelp(); } } /** * 解析命令行参数 */ private function parseArguments(array $argv): array { $options = []; for ($i = 1; $i < count($argv); $i++) { $arg = $argv[$i]; if (strpos($arg, '--') === 0) { $options[substr($arg, 2)] = true; } } return $options; } /** * 显示头部信息 */ private function displayHeader(): void { echo "\n"; echo "========================================\n"; echo " 灾害去除系统测试运行器\n"; echo "========================================\n"; echo "时间: " . date('Y-m-d H:i:s') . "\n"; echo "环境: " . (env('UNITTEST_URL') ?: '未配置') . "\n"; echo "========================================\n\n"; } /** * 显示帮助信息 */ private function displayHelp(): void { echo "使用方法:\n"; echo "php run_disaster_removal_tests.php [选项]\n\n"; echo "选项:\n"; echo " --all 运行所有测试\n"; echo " --pesticide 只运行除虫测试\n"; echo " --weedicide 只运行除草测试\n"; echo " --watering 只运行浇水测试\n"; echo " --suite 运行完整测试套件\n"; echo " --config 显示测试配置\n"; echo " --help 显示帮助信息\n\n"; echo "示例:\n"; echo " php run_disaster_removal_tests.php --all\n"; echo " php run_disaster_removal_tests.php --pesticide\n"; echo " php run_disaster_removal_tests.php --suite\n\n"; } /** * 显示测试配置 */ private function displayConfig(): void { echo "测试配置信息:\n"; echo "========================================\n"; echo "测试用户:\n"; echo " 用户ID: " . TestConfig::getTestUserId() . "\n"; echo " 密码: " . TestConfig::getTestUserPassword() . "\n\n"; echo "除虫测试配置:\n"; $pesticideConfig = TestConfig::getPesticideTestConfig(); foreach ($pesticideConfig as $key => $value) { echo " {$key}: {$value}\n"; } echo "\n"; echo "除草测试配置:\n"; $weedicideConfig = TestConfig::getWeedicideTestConfig(); foreach ($weedicideConfig as $key => $value) { echo " {$key}: {$value}\n"; } echo "\n"; echo "浇水测试配置:\n"; $wateringConfig = TestConfig::getWateringTestConfig(); foreach ($wateringConfig as $key => $value) { echo " {$key}: {$value}\n"; } echo "\n"; echo "测试物品:\n"; $items = ['pesticide', 'weedicide', 'watering_tool', 'invalid_item']; foreach ($items as $itemType) { $item = TestConfig::getTestItem($itemType); if (!empty($item)) { echo " {$itemType}: ID={$item['item_id']}, 名称={$item['name']}\n"; } } echo "\n"; } /** * 检查环境 */ private function checkEnvironment(): void { echo "检查测试环境...\n"; // 检查环境变量 $testUrl = env('UNITTEST_URL'); if (!$testUrl) { echo "警告: 未设置 UNITTEST_URL 环境变量,将使用默认值 http://localhost:8000\n"; } else { echo "测试URL: {$testUrl}\n"; } // 检查网络连接 $this->checkConnection($testUrl ?: 'http://localhost:8000'); echo "环境检查完成\n\n"; } /** * 检查网络连接 */ private function checkConnection(string $url): void { echo "检查服务器连接: {$url}...\n"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_TIMEOUT, 5); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_NOBODY, true); $result = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($result !== false && $httpCode > 0) { echo "服务器连接正常 (HTTP {$httpCode})\n"; } else { echo "警告: 无法连接到服务器,测试可能会失败\n"; } } /** * 运行所有测试 */ private function runAllTests(): void { echo "运行所有灾害去除测试...\n\n"; $this->runPesticideTests(); $this->runWeedicideTests(); $this->runWateringTests(); echo "\n所有测试完成!\n"; } /** * 运行除虫测试 */ private function runPesticideTests(): void { echo "运行除虫测试...\n"; $this->executeTest('app/Module/AppGame/Tests/Land/PesticideHandlerTest.php'); } /** * 运行除草测试 */ private function runWeedicideTests(): void { echo "运行除草测试...\n"; $this->executeTest('app/Module/AppGame/Tests/Land/WeedicideHandlerTest.php'); } /** * 运行浇水测试 */ private function runWateringTests(): void { echo "运行浇水测试...\n"; $this->executeTest('app/Module/AppGame/Tests/Land/WateringHandlerTest.php'); } /** * 运行测试套件 */ private function runTestSuite(): void { echo "运行完整测试套件...\n"; $this->executeTest('app/Module/AppGame/Tests/Land/DisasterRemovalTestSuite.php'); } /** * 执行测试 */ private function executeTest(string $testFile): void { $command = "{$this->baseCommand} {$testFile}"; echo "执行命令: {$command}\n"; echo "----------------------------------------\n"; $startTime = microtime(true); // 执行测试命令 $output = []; $returnCode = 0; exec($command . ' 2>&1', $output, $returnCode); $endTime = microtime(true); $duration = round($endTime - $startTime, 2); // 显示输出 foreach ($output as $line) { echo $line . "\n"; } echo "----------------------------------------\n"; echo "测试耗时: {$duration}秒\n"; echo "返回码: {$returnCode}\n"; if ($returnCode === 0) { echo "✅ 测试通过\n\n"; } else { echo "❌ 测试失败\n\n"; } } } // 运行测试 $runner = new DisasterRemovalTestRunner($argv); $runner->run();