Files
jiebanke/backend/scripts/test-api-endpoints.js
2025-09-03 13:25:08 +08:00

174 lines
4.1 KiB
JavaScript
Raw 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.

#!/usr/bin/env node
/**
* API端点测试脚本
* 用于验证后端API接口的正确性和一致性
*/
const axios = require('axios');
// API配置
const API_BASE_URL = process.env.API_BASE_URL || 'https://webapi.jiebanke.com';
const API_VERSION = process.env.API_VERSION || '/api/v1';
// 测试用例
const testCases = [
// 管理员接口
{
name: '管理员登录接口',
method: 'POST',
path: '/admin/login',
expectedStatus: 200,
data: {
username: 'admin',
password: 'admin123'
}
},
{
name: '获取管理员信息接口',
method: 'GET',
path: '/admin/profile',
expectedStatus: 200,
requiresAuth: true
},
{
name: '获取管理员列表接口',
method: 'GET',
path: '/admin/list',
expectedStatus: 200,
requiresAuth: true
},
// 用户接口
{
name: '用户登录接口',
method: 'POST',
path: '/auth/login',
expectedStatus: 200,
data: {
username: 'user1',
password: 'user123'
}
},
{
name: '获取用户信息接口',
method: 'GET',
path: '/users/profile',
expectedStatus: 200,
requiresAuth: true
},
// 系统接口
{
name: '健康检查接口',
method: 'GET',
path: '/health',
expectedStatus: 200
},
{
name: '系统统计接口',
method: 'GET',
path: '/system-stats',
expectedStatus: 200
}
];
// 认证令牌
let authToken = '';
async function testEndpoint(testCase) {
try {
const url = `${API_BASE_URL}${API_VERSION}${testCase.path}`;
const config = {
method: testCase.method.toLowerCase(),
url: url,
headers: {}
};
// 添加认证头
if (testCase.requiresAuth && authToken) {
config.headers.Authorization = `Bearer ${authToken}`;
}
// 添加请求数据
if (testCase.data) {
config.data = testCase.data;
}
const response = await axios(config);
// 检查状态码
if (response.status === testCase.expectedStatus) {
console.log(`${testCase.name} - 成功 (${response.status})`);
// 如果是登录接口保存token
if (testCase.path === '/admin/login' && response.data.data && response.data.data.token) {
authToken = response.data.data.token;
console.log(` 获取到认证令牌`);
}
return true;
} else {
console.log(`${testCase.name} - 状态码不匹配: 期望 ${testCase.expectedStatus}, 实际 ${response.status}`);
return false;
}
} catch (error) {
if (error.response) {
console.log(`${testCase.name} - 错误: ${error.response.status} ${error.response.statusText}`);
if (error.response.data) {
console.log(` 错误信息: ${JSON.stringify(error.response.data)}`);
}
} else {
console.log(`${testCase.name} - 网络错误: ${error.message}`);
}
return false;
}
}
async function runAllTests() {
console.log('🚀 开始API端点测试');
console.log(`📊 测试环境: ${API_BASE_URL}`);
console.log(`🔗 API版本: ${API_VERSION}`);
console.log('='.repeat(60));
let passed = 0;
let failed = 0;
for (const testCase of testCases) {
const result = await testEndpoint(testCase);
if (result) {
passed++;
} else {
failed++;
}
// 添加短暂延迟,避免请求过于频繁
await new Promise(resolve => setTimeout(resolve, 100));
}
console.log('='.repeat(60));
console.log('📊 测试结果统计:');
console.log(`✅ 通过: ${passed}`);
console.log(`❌ 失败: ${failed}`);
console.log(`📈 成功率: ${((passed / (passed + failed)) * 100).toFixed(1)}%`);
if (failed === 0) {
console.log('🎉 所有测试用例通过!');
process.exit(0);
} else {
console.log('💥 存在失败的测试用例');
process.exit(1);
}
}
// 如果是直接运行此文件,则执行测试
if (require.main === module) {
runAllTests()
.catch(error => {
console.error('❌ 测试执行失败:', error.message);
process.exit(1);
});
}
module.exports = { runAllTests };