Files
FendxPHP/api_test.php
Lawson 2782d765fb feat(database): 添加用户角色权限系统及相关监控功能
- 创建用户表(users)包含基本信息和认证字段
- 创建角色表(roles)用于权限控制
- 创建权限表(permissions)定义系统权限
- 创建用户角色关联表(user_roles)建立用户与角色关系
- 创建角色权限关联表(role_permissions)建立角色与权限关系
- 创建迁移记录表(migrations)追踪数据库变更
- 添加AdminController提供管理员面板功能
- 实现系统监控、配置管理、缓存清理等功能
- 添加AOP切面编程支持的各种通知类型
- 实现告警管理AlertManager支持多渠道告警
- 添加文档注解接口规范
2026-04-08 17:00:28 +08:00

235 lines
6.7 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
declare(strict_types=1);
/**
* FendxPHP API测试脚本
* 使用方法: php api_test.php
*/
echo "🧪 FendxPHP API测试开始...\n\n";
// 基础配置
$baseUrl = 'http://localhost:8000';
$testResults = [];
// 测试函数
function testApi(string $method, string $url, array $data = [], array $headers = []): array
{
global $baseUrl;
$ch = curl_init();
$fullUrl = $baseUrl . $url;
curl_setopt_array($ch, [
CURLOPT_URL => $fullUrl,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => $method,
CURLOPT_HTTPHEADER => array_merge([
'Content-Type: application/json',
'Accept: application/json'
], $headers),
CURLOPT_TIMEOUT => 10
]);
if (!empty($data) && in_array($method, ['POST', 'PUT', 'PATCH'])) {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
}
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
if ($error) {
return [
'success' => false,
'error' => $error,
'http_code' => 0
];
}
$responseData = json_decode($response, true);
return [
'success' => $httpCode >= 200 && $httpCode < 300,
'http_code' => $httpCode,
'data' => $responseData,
'response' => $response
];
}
// 输出测试结果
function outputResult(string $testName, array $result): void
{
global $testResults;
$status = $result['success'] ? '✅ PASS' : '❌ FAIL';
echo "$status $testName\n";
if (!$result['success']) {
if (isset($result['error'])) {
echo " 错误: {$result['error']}\n";
} else {
echo " HTTP状态码: {$result['http_code']}\n";
echo " 响应: {$result['response']}\n";
}
} else {
echo " 状态码: {$result['http_code']}\n";
if (isset($result['data']['traceId'])) {
echo " TraceId: {$result['data']['traceId']}\n";
}
}
echo "\n";
$testResults[$testName] = $result['success'];
}
// 检查服务是否启动
echo "🔍 检查服务状态...\n";
$healthCheck = testApi('GET', '/health');
if (!$healthCheck['success']) {
echo "❌ 服务未启动或无法访问\n";
echo "请先启动Web服务: php -S localhost:8000 -t public\n";
exit(1);
}
echo "✅ 服务运行正常\n\n";
// 开始API测试
echo "🚀 开始API功能测试...\n\n";
// 1. 测试健康检查
outputResult('健康检查接口', testApi('GET', '/health'));
// 2. 测试用户统计
outputResult('用户统计接口', testApi('GET', '/api/users/stats'));
// 3. 测试获取用户列表
outputResult('获取用户列表', testApi('GET', '/api/users'));
// 4. 测试创建用户
$userData = [
'username' => 'testuser_' . time(),
'email' => 'test' . time() . '@example.com',
'password' => 'password123'
];
$createResult = testApi('POST', '/api/users', $userData);
outputResult('创建用户', $createResult);
$userId = null;
if ($createResult['success'] && isset($createResult['data']['data']['id'])) {
$userId = $createResult['data']['data']['id'];
echo "📝 创建的用户ID: $userId\n\n";
}
// 5. 测试获取用户详情
if ($userId) {
outputResult('获取用户详情', testApi('GET', "/api/users/$userId"));
}
// 6. 测试更新用户
if ($userId) {
$updateData = ['username' => 'updated_user_' . time()];
outputResult('更新用户', testApi('PUT', "/api/users/$userId", $updateData));
}
// 7. 测试用户搜索
outputResult('用户搜索', testApi('GET', '/api/users/search?keyword=test'));
// 8. 测试获取活跃用户
outputResult('获取活跃用户', testApi('GET', '/api/users/active'));
// 9. 测试用户存在性检查
if ($userId) {
outputResult('用户存在性检查', testApi('GET', "/api/users/$userId/exists"));
}
// 10. 测试邮箱检查
outputResult('邮箱检查', testApi('POST', '/api/users/check-email', ['email' => 'test@example.com']));
// 11. 测试用户名检查
outputResult('用户名检查', testApi('POST', '/api/users/check-username', ['username' => 'testuser']));
// 12. 测试错误处理 - 404
outputResult('404错误处理', testApi('GET', '/api/nonexistent'));
// 13. 测试错误处理 - 参数验证
outputResult('参数验证错误', testApi('POST', '/api/users', [
'username' => '',
'email' => 'invalid-email'
]));
// 14. 测试错误处理 - 方法不允许
outputResult('方法不允许', testApi('POST', '/api/users/stats'));
// 15. 测试缓存功能(如果用户存在)
if ($userId) {
echo "🔄 测试缓存功能...\n";
// 第一次请求
$start = microtime(true);
$firstRequest = testApi('GET', "/api/users/$userId");
$firstTime = microtime(true) - $start;
// 第二次请求(应该从缓存返回)
$start = microtime(true);
$secondRequest = testApi('GET', "/api/users/$userId");
$secondTime = microtime(true) - $start;
echo "第一次请求时间: " . round($firstTime * 1000, 2) . "ms\n";
echo "第二次请求时间: " . round($secondTime * 1000, 2) . "ms\n";
if ($secondTime < $firstTime) {
echo "✅ 缓存可能生效(第二次请求更快)\n";
} else {
echo "⚠️ 缓存可能未生效或差异不明显\n";
}
echo "\n";
}
// 16. 清理测试数据
if ($userId) {
outputResult('删除测试用户', testApi('DELETE', "/api/users/$userId"));
}
// 生成测试报告
echo "📊 生成测试报告...\n";
$totalTests = count($testResults);
$passedTests = array_sum($testResults);
$failedTests = $totalTests - $passedTests;
$report = [
'test_time' => date('Y-m-d H:i:s'),
'total_tests' => $totalTests,
'passed_tests' => $passedTests,
'failed_tests' => $failedTests,
'success_rate' => round(($passedTests / $totalTests) * 100, 2) . '%',
'test_results' => $testResults
];
file_put_contents('runtime/api_test_report.json', json_encode($report, JSON_PRETTY_PRINT));
echo "✅ API测试报告已保存到 runtime/api_test_report.json\n\n";
// 输出测试总结
echo "📋 API测试总结\n";
echo "================\n";
echo "总测试数: $totalTests\n";
echo "通过测试: $passedTests\n";
echo "失败测试: $failedTests\n";
echo "成功率: {$report['success_rate']}\n\n";
if ($failedTests === 0) {
echo "🎉 所有API测试通过\n";
echo "✅ 框架API功能正常\n";
} else {
echo "⚠️ 有 $failedTests 个测试失败\n";
echo "❌ 请检查相关功能\n";
}
echo "\n📝 详细信息:\n";
echo "- 查看完整报告: runtime/api_test_report.json\n";
echo "- 查看应用日志: runtime/logs/\n";
echo "- 查看测试指南: docs/冒烟测试指南.md\n\n";
echo "🚀 API测试完成\n";