总计: 0 通过: 0 失败: 0 跳过: 0
__('权限不足', 'yoone-subscriptions'))); } $suite = sanitize_text_field($_POST['suite']); $results = $this->run_test_suite($suite); wp_send_json_success($results); } /** * 运行测试套件 * * @param string $suite 测试套件名称 * @return array 测试结果 */ public function run_test_suite($suite = 'all') { $this->test_results = array(); switch ($suite) { case 'subscription': $this->run_subscription_tests(); break; case 'payment': $this->run_payment_tests(); break; case 'bundle': $this->run_bundle_tests(); break; case 'cron': $this->run_cron_tests(); break; case 'all': default: $this->run_subscription_tests(); $this->run_payment_tests(); $this->run_bundle_tests(); $this->run_cron_tests(); break; } return $this->compile_results(); } /** * 运行订阅测试 */ private function run_subscription_tests() { // 运行完整的订阅流程测试 $this->add_test_result( 'subscription_flow_test', '订阅完整流程测试', '测试订阅的完整生命周期流程', function() { if (!class_exists('Yoone_Subscription_Flow_Test')) { throw new Exception('Yoone_Subscription_Flow_Test类不存在'); } $flow_test = new Yoone_Subscription_Flow_Test(); $flow_results = $flow_test->run_full_test(); // 分析流程测试结果 $error_count = 0; $warning_count = 0; foreach ($flow_results as $result) { if ($result['type'] === 'error') { $error_count++; } elseif ($result['type'] === 'warning') { $warning_count++; } } if ($error_count > 0) { throw new Exception("流程测试发现 {$error_count} 个错误"); } return $warning_count === 0 ? true : "通过但有 {$warning_count} 个警告"; } ); // 测试订阅类是否存在 $this->add_test_result( 'subscription_class_exists', '订阅类存在性测试', '检查Yoone_Subscription类是否正确加载', function() { return class_exists('Yoone_Subscription'); } ); // 测试订阅创建 $this->add_test_result( 'subscription_creation', '订阅创建测试', '测试创建新订阅的功能', function() { if (!class_exists('Yoone_Subscription')) { throw new Exception('Yoone_Subscription类不存在'); } $subscription = new Yoone_Subscription(); $subscription->set_customer_id(1); $subscription->set_status('active'); $subscription->set_billing_period('month'); $subscription->set_billing_interval(1); $subscription->set_start_date(current_time('mysql')); // 添加订阅商品 $subscription->add_item(array( 'product_id' => 100, 'quantity' => 1, 'line_total' => 29.99 )); // 验证属性设置 return $subscription->get_customer_id() === 1 && $subscription->get_status() === 'active' && count($subscription->get_items()) === 1; } ); // 测试订阅状态管理 $this->add_test_result( 'subscription_status_management', '订阅状态管理测试', '测试订阅状态的变更功能', function() { if (!class_exists('Yoone_Subscription')) { throw new Exception('Yoone_Subscription类不存在'); } $subscription = new Yoone_Subscription(); $subscription->set_status('active'); // 测试暂停 $subscription->pause(); if ($subscription->get_status() !== 'paused') { throw new Exception('暂停功能失败'); } // 测试恢复 $subscription->resume(); if ($subscription->get_status() !== 'active') { throw new Exception('恢复功能失败'); } // 测试取消 $subscription->cancel(); if ($subscription->get_status() !== 'cancelled') { throw new Exception('取消功能失败'); } return true; } ); // 测试下次付款日期计算 $this->add_test_result( 'next_payment_calculation', '下次付款日期计算测试', '测试下次付款日期的计算逻辑', function() { if (!class_exists('Yoone_Subscription')) { throw new Exception('Yoone_Subscription类不存在'); } $subscription = new Yoone_Subscription(); $subscription->set_billing_period('month'); $subscription->set_billing_interval(1); $subscription->set_start_date('2024-01-01 00:00:00'); $next_payment = $subscription->calculate_next_payment_date(); $expected = '2024-02-01 00:00:00'; return $next_payment === $expected; } ); } /** * 运行支付测试 */ private function run_payment_tests() { // 测试支付网关接口 $this->add_test_result( 'payment_gateway_interface', '支付网关接口测试', '检查支付网关接口是否正确定义', function() { return interface_exists('Yoone_Payment_Gateway_Interface'); } ); // 测试Moneris网关类 $this->add_test_result( 'moneris_gateway_class', 'Moneris网关类测试', '检查Moneris支付网关类是否存在', function() { return class_exists('Yoone_Moneris_Gateway'); } ); // 测试支付令牌管理 $this->add_test_result( 'payment_token_management', '支付令牌管理测试', '测试支付令牌的创建和管理', function() { if (!class_exists('Yoone_Payment_Token')) { throw new Exception('Yoone_Payment_Token类不存在'); } $token = new Yoone_Payment_Token(); $token->set_customer_id(1); $token->set_gateway_id('moneris'); $token->set_token('test_token_123'); $token->set_card_type('visa'); $token->set_last_four('1234'); return $token->get_customer_id() === 1 && $token->get_token() === 'test_token_123'; } ); // 测试支付处理流程 $this->add_test_result( 'payment_processing_flow', '支付处理流程测试', '测试支付处理的基本流程', function() { // 这里只测试类和方法的存在性,不进行实际支付 if (!class_exists('Yoone_Moneris_Gateway')) { throw new Exception('Moneris网关类不存在'); } $gateway = new Yoone_Moneris_Gateway(); // 检查必要方法是否存在 $required_methods = array( 'process_payment', 'process_subscription_payment', 'create_payment_token', 'delete_payment_token' ); foreach ($required_methods as $method) { if (!method_exists($gateway, $method)) { throw new Exception("方法 {$method} 不存在"); } } return true; } ); } /** * 运行捆绑测试 */ private function run_bundle_tests() { // 测试捆绑类 $this->add_test_result( 'bundle_class_exists', '捆绑类存在性测试', '检查Yoone_Bundle类是否正确加载', function() { return class_exists('Yoone_Bundle'); } ); // 测试价格计算 $this->add_test_result( 'bundle_price_calculation', '捆绑价格计算测试', '测试捆绑产品的价格计算功能', function() { if (!class_exists('Yoone_Bundle')) { throw new Exception('Yoone_Bundle类不存在'); } $bundle = new Yoone_Bundle(); $bundle->set_discount_type('percentage'); $bundle->set_discount_value(10); // 10%折扣 // 添加测试商品 $bundle->add_item(array( 'product_id' => 1, 'quantity' => 2, 'price' => 100 )); $bundle->add_item(array( 'product_id' => 2, 'quantity' => 1, 'price' => 50 )); // 原价应该是 (100 * 2) + (50 * 1) = 250 // 折扣后应该是 250 * 0.9 = 225 $calculated_price = $bundle->calculate_price(); return abs($calculated_price - 225) < 0.01; // 允许小数点误差 } ); // 测试数量验证 $this->add_test_result( 'bundle_quantity_validation', '捆绑数量验证测试', '测试捆绑产品的数量验证功能', function() { if (!class_exists('Yoone_Bundle')) { throw new Exception('Yoone_Bundle类不存在'); } $bundle = new Yoone_Bundle(); $bundle->set_min_quantity(2); $bundle->set_max_quantity(10); // 测试有效数量 if (!$bundle->validate_quantity(5)) { throw new Exception('有效数量验证失败'); } // 测试无效数量(太少) if ($bundle->validate_quantity(1)) { throw new Exception('最小数量验证失败'); } // 测试无效数量(太多) if ($bundle->validate_quantity(15)) { throw new Exception('最大数量验证失败'); } return true; } ); } /** * 运行定时任务测试 */ private function run_cron_tests() { // 测试定时任务类 $this->add_test_result( 'cron_class_exists', '定时任务类存在性测试', '检查Yoone_Cron类是否正确加载', function() { return class_exists('Yoone_Cron'); } ); // 测试定时任务调度 $this->add_test_result( 'cron_scheduling', '定时任务调度测试', '测试定时任务的调度功能', function() { if (!class_exists('Yoone_Cron')) { throw new Exception('Yoone_Cron类不存在'); } // 检查WordPress定时任务是否已注册 $scheduled_events = wp_get_scheduled_event('yoone_process_subscription_renewals'); return $scheduled_events !== false; } ); // 测试日志清理功能 $this->add_test_result( 'log_cleanup_function', '日志清理功能测试', '测试日志清理功能是否正常', function() { if (!class_exists('Yoone_Logger')) { throw new Exception('Yoone_Logger类不存在'); } // 检查清理方法是否存在 return method_exists('Yoone_Logger', 'cleanup_old_logs'); } ); } /** * 添加测试结果 * * @param string $id 测试ID * @param string $name 测试名称 * @param string $description 测试描述 * @param callable $test_function 测试函数 */ private function add_test_result($id, $name, $description, $test_function) { $result = array( 'id' => $id, 'name' => $name, 'description' => $description, 'status' => 'passed', 'result' => '', 'error' => '', 'execution_time' => 0 ); $start_time = microtime(true); try { $test_result = call_user_func($test_function); if ($test_result === true) { $result['result'] = '测试通过'; } elseif ($test_result === false) { $result['status'] = 'failed'; $result['result'] = '测试失败'; } else { $result['result'] = '测试通过: ' . $test_result; } } catch (Exception $e) { $result['status'] = 'failed'; $result['error'] = $e->getMessage(); } catch (Error $e) { $result['status'] = 'failed'; $result['error'] = $e->getMessage(); } $result['execution_time'] = round((microtime(true) - $start_time) * 1000, 2); $this->test_results[] = $result; // 记录测试日志 Yoone_Logger::info("测试执行: {$name}", array( 'test_id' => $id, 'status' => $result['status'], 'execution_time' => $result['execution_time'] )); } /** * 编译测试结果 * * @return array 编译后的结果 */ private function compile_results() { $summary = array( 'total' => count($this->test_results), 'passed' => 0, 'failed' => 0, 'skipped' => 0 ); foreach ($this->test_results as $result) { $summary[$result['status']]++; } return array( 'summary' => $summary, 'tests' => $this->test_results ); } } // 初始化测试套件 if (is_admin()) { new Yoone_Test_Suite(); }