23 KiB
23 KiB
社交服务 HTTP 完整测试流程
目录
环境准备
1. 数据库准备
确保 PostgreSQL 数据库已启动并创建了 top-fans 数据库:
CREATE DATABASE "top-fans" OWNER haihuizhu ENCODING 'UTF8';
2. 环境变量配置
# Gateway 配置
export SERVER_PORT=8080
export GIN_MODE=debug
export DUBBO_USER_SERVICE_URL="tri://127.0.0.1:20000"
export DUBBO_SOCIAL_SERVICE_URL="tri://127.0.0.1:20001"
export JWT_SECRET="topfans-secret-key-please-change-in-production"
3. 工具准备
推荐使用以下工具之一进行API测试:
- Postman (推荐)
- curl 命令行
- HTTPie
- Insomnia
服务启动
1. 启动 UserService
cd /Users/haihuizhu/infinite_matrix/top-fans/backend/services/userService
./start.sh
预期输出:
Starting User Service...
Dubbo-go service started successfully. Press Ctrl+C to exit.
检查端口:
lsof -i :20000
2. 启动 SocialService
cd /Users/haihuizhu/infinite_matrix/top-fans/backend/services/socialService
./start.sh
预期输出:
Starting Social Service...
Social service started successfully. Press Ctrl+C to exit.
检查端口:
lsof -i :20001
3. 启动 Gateway
cd /Users/haihuizhu/infinite_matrix/top-fans/backend/gateway
./start.sh
预期输出:
Starting Top-Fans Gateway...
Gateway server started successfully
检查端口:
lsof -i :8080
4. 健康检查
curl http://localhost:8080/health
预期响应:
{
"status": "ok",
"service": "top-fans-gateway"
}
用户准备
步骤 1: 注册用户 A(张三)
curl -X POST http://localhost:8080/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{
"mobile": "13800000001",
"password": "password123",
"star_id": 1,
"nickname": "张三"
}'
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_expires_at": 1736234567890,
"user": {
"id": 1,
"mobile": "13800000001",
"avatar_url": "",
"is_active": true
},
"fan_profile": {
"id": 1,
"user_id": 1,
"star_id": 1,
"nickname": "张三",
"level": 1,
"social": 0
}
}
}
保存变量:
USER_A_ID: 1USER_A_TOKEN: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
步骤 2: 注册用户 B(李四)
curl -X POST http://localhost:8080/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{
"mobile": "13800000002",
"password": "password123",
"star_id": 1,
"nickname": "李四"
}'
保存变量:
USER_B_ID: 2USER_B_TOKEN: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
步骤 3: 注册用户 C(王五)
curl -X POST http://localhost:8080/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{
"mobile": "13800000003",
"password": "password123",
"star_id": 1,
"nickname": "王五"
}'
保存变量:
USER_C_ID: 3USER_C_TOKEN: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
好友功能测试
API 概览
| 序号 | 功能 | 方法 | 路径 | 说明 |
|---|---|---|---|---|
| 1 | 查找用户 | GET | /api/v1/social/search-user |
根据用户ID查找陌生人信息 |
| 2 | 获取随机用户 | GET | /api/v1/social/random-users |
获取同一明星下的随机用户(用于推荐加好友) |
| 3 | 发送好友请求 | POST | /api/v1/social/friend-requests |
向指定用户发送好友请求 |
| 4 | 获取好友请求列表 | GET | /api/v1/social/friend-requests |
获取收到或发出的好友请求 |
| 5 | 处理好友请求 | POST | /api/v1/social/friend-requests/handle |
接受或拒绝好友请求 |
| 6 | 获取好友列表 | GET | /api/v1/social/friends |
获取好友列表(支持分页和搜索) |
| 7 | 关键字搜索好友 | GET | /api/v1/social/friends?keyword=xxx |
在好友列表中模糊搜索 |
| 8 | 检查好友关系 | GET | /api/v1/social/friendship/check |
检查是否为好友关系 |
| 9 | 获取好友数量 | GET | /api/v1/social/friends/count |
获取当前用户的好友数量 |
| 10 | 设置好友备注 | PUT | /api/v1/social/friends/remark |
设置好友的备注名 |
| 11 | 删除好友 | DELETE | /api/v1/social/friends |
删除好友关系 |
测试场景 1: 发送好友请求
1.1 张三向李四发送好友请求
curl -X POST http://localhost:8080/api/v1/social/friend-requests \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${USER_A_TOKEN}" \
-d '{
"friend_user_id": 2,
"message": "你好,我是张三,我们交个朋友吧!"
}'
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"request_id": 1,
"status": "pending",
"created_at": 1736234567890,
"expires_at": 1738826567890
}
}
1.2 查看发出的请求列表(张三)
curl -X GET "http://localhost:8080/api/v1/social/friend-requests?type=sent&page=1&page_size=10" \
-H "Authorization: Bearer ${USER_A_TOKEN}"
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"has_more": false,
"items": [
{
"created_at": 1767697774916,
"expires_at": 1770289774915,
"from_user_fan_level": 1,
"from_user_id": 106,
"from_user_nickname": "不爱战战",
"id": 31,
"message": "你好,我是张三,我们交个朋友吧!",
"star_id": 87,
"status": "pending",
"to_user_fan_level": 1,
"to_user_id": 2,
"to_user_nickname": "爱战战"
},
{
"created_at": 1767697552714,
"expires_at": 1770289552714,
"from_user_fan_level": 1,
"from_user_id": 106,
"from_user_nickname": "不爱战战",
"id": 30,
"message": "你好,我们交个朋友吧!",
"star_id": 87,
"status": "pending",
"to_user_fan_level": 1,
"to_user_id": 108,
"to_user_nickname": "张小明"
}
],
"page": 1,
"page_size": 10,
"total": 2
}
}
1.3 查看收到的请求列表(李四)
curl -X GET "http://localhost:8080/api/v1/social/friend-requests?type=received&status=pending&page=1&page_size=10" \
-H "Authorization: Bearer ${USER_B_TOKEN}"
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"items": [
{
"id": 1,
"from_user_id": 1,
"to_user_id": 2,
"star_id": 1,
"status": "pending",
"message": "你好,我是张三,我们交个朋友吧!",
"created_at": 1736234567890,
"expires_at": 1738826567890,
"from_user_nickname": "张三",
"from_user_avatar": "",
"from_user_fan_level": 1
}
],
"total": 1,
"page": 1,
"page_size": 10,
"has_more": false
}
}
测试场景 2: 接受好友请求
2.1 李四接受张三的好友请求
curl -X POST http://localhost:8080/api/v1/social/friend-requests/handle \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${USER_B_TOKEN}" \
-d '{
"request_id": 1,
"action": "accept"
}'
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"action": "accept",
"friendship_created": true,
"processed_at": 1736234600000
}
}
2.2 查看张三的好友列表
curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20" \
-H "Authorization: Bearer ${USER_A_TOKEN}"
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"items": [
{
"id": 1,
"user_id": 1,
"friend_id": 2,
"star_id": 1,
"created_at": 1736234600000,
"friend_nickname": "李四",
"friend_avatar": "",
"friend_fan_level": 1,
"friend_social": 1
}
],
"total": 1,
"page": 1,
"page_size": 20,
"has_more": false
}
}
2.3 查看李四的好友列表
curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20" \
-H "Authorization: Bearer ${USER_B_TOKEN}"
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"items": [
{
"id": 2,
"user_id": 2,
"friend_id": 1,
"star_id": 1,
"created_at": 1736234600000,
"friend_nickname": "张三",
"friend_avatar": "",
"friend_fan_level": 1,
"friend_social": 1
}
],
"total": 1,
"page": 1,
"page_size": 20,
"has_more": false
}
}
2.4 查看好友数量
curl -X GET "http://localhost:8080/api/v1/social/friends/count" \
-H "Authorization: Bearer ${USER_A_TOKEN}"
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"count": 1
}
}
测试场景 3: 检查好友关系
curl -X GET "http://localhost:8080/api/v1/social/friendship/check?friend_user_id=2" \
-H "Authorization: Bearer ${USER_A_TOKEN}"
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"is_friend": true
}
}
测试场景 4: 设置好友备注
curl -X PUT http://localhost:8080/api/v1/social/friends/remark \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${USER_A_TOKEN}" \
-d '{
"friend_user_id": 2,
"remark": "小李"
}'
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"remark": "小李"
}
}
4.1 再次查看好友列表(确认备注)
curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20" \
-H "Authorization: Bearer ${USER_A_TOKEN}"
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"items": [
{
"id": 1,
"user_id": 1,
"friend_id": 2,
"star_id": 1,
"created_at": 1736234600000,
"remark": "小李",
"friend_nickname": "李四",
"friend_avatar": "",
"friend_fan_level": 1,
"friend_social": 1
}
],
"total": 1,
"page": 1,
"page_size": 20,
"has_more": false
}
}
测试场景 5: 根据用户ID查找陌生人(用于加好友)
说明: 在发送好友请求前,可以先查找目标用户的信息,查看是否可以添加为好友。
# 张三查找李四的信息(假设李四的 user_id 为 2)
curl -X GET "http://localhost:8080/api/v1/social/search-user?friend_user_id=2" \
-H "Authorization: Bearer ${USER_A_TOKEN}"
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"user_id": 2,
"nickname": "李四",
"avatar": "https://example.com/avatar/2.jpg",
"fan_level": 1,
"relationship_status": "stranger",
"can_send_request": true
}
}
relationship_status 说明:
stranger: 陌生人,可以发送好友请求friend: 已经是好友pending_sent: 我已发送请求,等待对方处理pending_received: 对方已发送请求给我,等待我处理rejected: 之前被拒绝,在冷静期内(会返回cooldown_ends_at字段)
测试场景 6: 关键字搜索好友
说明: 在自己的好友列表中进行模糊搜索(搜索昵称或备注名)。
curl -X GET "http://localhost:8080/api/v1/social/friends?keyword=小李&page=1&page_size=20" \
-H "Authorization: Bearer ${USER_A_TOKEN}"
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"items": [
{
"id": 1,
"user_id": 1,
"friend_id": 2,
"star_id": 1,
"created_at": 1736234600000,
"remark": "小李",
"friend_nickname": "李四",
"friend_avatar": "",
"friend_fan_level": 1,
"friend_social": 1
}
],
"total": 1,
"page": 1,
"page_size": 20,
"has_more": false
}
}
测试场景 7: 拒绝好友请求
6.1 王五向李四发送好友请求
curl -X POST http://localhost:8080/api/v1/social/friend-requests \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${USER_C_TOKEN}" \
-d '{
"friend_user_id": 2,
"message": "李四你好!"
}'
6.2 李四拒绝王五的好友请求
curl -X POST http://localhost:8080/api/v1/social/friend-requests/handle \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${USER_B_TOKEN}" \
-d '{
"request_id": 2,
"action": "reject"
}'
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"action": "reject",
"friendship_created": false,
"processed_at": 1736234700000
}
}
6.3 验证好友关系未建立
curl -X GET "http://localhost:8080/api/v1/social/friendship/check?friend_user_id=2" \
-H "Authorization: Bearer ${USER_C_TOKEN}"
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"is_friend": false
}
}
测试场景 8: 设置好友备注
curl -X PUT http://localhost:8080/api/v1/social/friends/remark \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${USER_A_TOKEN}" \
-d '{
"friend_user_id": 2,
"remark": "小李"
}'
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"remark": "小李"
}
}
测试场景 9: 删除好友
curl -X DELETE http://localhost:8080/api/v1/social/friends \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${USER_A_TOKEN}" \
-d '{
"friend_user_id": 2
}'
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"success": true
}
}
7.1 验证好友已被删除(张三)
curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20" \
-H "Authorization: Bearer ${USER_A_TOKEN}"
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"items": [],
"total": 0,
"page": 1,
"page_size": 20,
"has_more": false
}
}
7.2 验证好友已被删除(李四)
curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20" \
-H "Authorization: Bearer ${USER_B_TOKEN}"
预期响应:
{
"code": 200,
"message": "ok",
"data": {
"items": [],
"total": 0,
"page": 1,
"page_size": 20,
"has_more": false
}
}
测试场景 10: 获取随机用户
获取同一明星下的随机用户信息(用于推荐加好友等功能)。
10.1 获取单个随机用户(默认)
curl -X GET "http://localhost:8080/api/v1/social/random-users" \
-H "Authorization: Bearer ${USER_A_TOKEN}"
预期响应:
{
"code": 200,
"message": "ok",
"data": [
{
"user_id": 2,
"nickname": "李四"
}
]
}
说明:
- 默认返回 1 个随机用户
- 返回的用户必须是同一
star_id下的活跃用户 - 每次调用返回的用户可能不同(随机算法)
10.2 获取多个随机用户
curl -X GET "http://localhost:8080/api/v1/social/random-users?count=3" \
-H "Authorization: Bearer ${USER_A_TOKEN}"
预期响应:
{
"code": 200,
"message": "ok",
"data": [
{
"user_id": 2,
"nickname": "李四"
},
{
"user_id": 3,
"nickname": "王五"
},
{
"user_id": 4,
"nickname": "赵六"
}
]
}
说明:
count参数指定返回数量(1-100)- 如果数据库中的用户数量少于请求的数量,返回实际存在的用户数量
- 如果数据库中没有用户,返回空数组
10.3 验证随机性
多次调用接口,验证返回的用户不同:
# 第一次调用
curl -X GET "http://localhost:8080/api/v1/social/random-users" \
-H "Authorization: Bearer ${USER_A_TOKEN}" | jq -r '.data[0].user_id'
# 第二次调用
curl -X GET "http://localhost:8080/api/v1/social/random-users" \
-H "Authorization: Bearer ${USER_A_TOKEN}" | jq -r '.data[0].user_id'
# 第三次调用
curl -X GET "http://localhost:8080/api/v1/social/random-users" \
-H "Authorization: Bearer ${USER_A_TOKEN}" | jq -r '.data[0].user_id'
说明:
- 多次调用可能返回不同的用户(随机算法)
- 如果数据库中只有少量用户,可能会重复返回
10.4 边界情况测试
测试 1: count 参数为 0 或负数
curl -X GET "http://localhost:8080/api/v1/social/random-users?count=0" \
-H "Authorization: Bearer ${USER_A_TOKEN}"
预期响应: 默认返回 1 个用户
测试 2: count 参数超过最大值
curl -X GET "http://localhost:8080/api/v1/social/random-users?count=200" \
-H "Authorization: Bearer ${USER_A_TOKEN}"
预期响应: 最多返回 100 个用户
测试 3: 数据库中没有用户
如果当前 star_id 下没有任何活跃用户:
curl -X GET "http://localhost:8080/api/v1/social/random-users" \
-H "Authorization: Bearer ${USER_A_TOKEN}"
预期响应:
{
"code": 200,
"message": "ok",
"data": []
}
异常场景测试
异常 1: 查找不存在的用户
curl -X GET "http://localhost:8080/api/v1/social/search-user?friend_user_id=99999" \
-H "Authorization: Bearer ${USER_A_TOKEN}"
预期响应:
{
"code": 404,
"message": "用户不存在"
}
异常 2: 查找自己
curl -X GET "http://localhost:8080/api/v1/social/search-user?friend_user_id=1" \
-H "Authorization: Bearer ${USER_A_TOKEN}"
预期响应:
{
"code": 400,
"message": "不能查找自己"
}
异常 3: 未登录访问
curl -X GET "http://localhost:8080/api/v1/social/friends?page=1&page_size=20"
预期响应:
{
"code": 401,
"message": "未授权"
}
异常 4: 重复发送好友请求
# 第一次
curl -X POST http://localhost:8080/api/v1/social/friend-requests \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${USER_A_TOKEN}" \
-d '{"friend_user_id": 2}'
# 第二次(重复)
curl -X POST http://localhost:8080/api/v1/social/friend-requests \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${USER_A_TOKEN}" \
-d '{"friend_user_id": 2}'
第二次预期响应:
{
"code": 400,
"message": "已有待处理的好友请求"
}
异常 5: 添加自己为好友
curl -X POST http://localhost:8080/api/v1/social/friend-requests \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${USER_A_TOKEN}" \
-d '{"friend_user_id": 1}'
预期响应:
{
"code": 400,
"message": "不能添加自己为好友"
}
异常 4: 冷却期内重复请求
# 假设李四拒绝了张三的请求后,张三立即重新发送
curl -X POST http://localhost:8080/api/v1/social/friend-requests \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${USER_A_TOKEN}" \
-d '{"friend_user_id": 2}'
预期响应:
{
"code": 400,
"message": "请求已被拒绝,请 7 天后再试"
}
异常 6: 处理不存在的请求
curl -X POST http://localhost:8080/api/v1/social/friend-requests/handle \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${USER_B_TOKEN}" \
-d '{
"request_id": 99999,
"action": "accept"
}'
预期响应:
{
"code": 404,
"message": "好友请求不存在"
}
异常 7: 删除不存在的好友
curl -X DELETE http://localhost:8080/api/v1/social/friends \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${USER_A_TOKEN}" \
-d '{"friend_user_id": 99999}'
预期响应:
{
"code": 400,
"message": "你们不是好友"
}
异常 8: 无效的参数
curl -X POST http://localhost:8080/api/v1/social/friend-requests \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${USER_A_TOKEN}" \
-d '{}'
预期响应:
{
"code": 400,
"message": "参数错误: Key: 'friend_user_id' Error:Field validation for 'friend_user_id' failed on the 'required' tag"
}
异常 8: 备注过长
curl -X PUT http://localhost:8080/api/v1/social/friends/remark \
-H "Content-Type: application/json" \
-H "Authorization: Bearer ${USER_A_TOKEN}" \
-d '{
"friend_user_id": 2,
"remark": "这是一个超过50个字符的备注名这是一个超过50个字符的备注名这是一个超过50个字符的备注名这是一个超过50个字符的备注名"
}'
预期响应:
{
"code": 400,
"message": "备注长度不能超过50个字符"
}
测试数据清理
方法 1: 通过 API 删除(推荐)
依次删除好友关系和用户数据(通过应用逻辑)。
方法 2: 直接清理数据库
-- 删除好友关系
DELETE FROM friendships WHERE star_id = 1;
-- 删除好友请求
DELETE FROM friend_requests WHERE star_id = 1;
-- 删除粉丝档案
DELETE FROM fan_profiles WHERE star_id = 1;
-- 删除用户(可选)
DELETE FROM users WHERE mobile IN ('13800000001', '13800000002', '13800000003');
测试检查清单
- 所有服务正常启动
- 健康检查通过
- 用户注册成功
- 发送好友请求成功
- 查看请求列表正确
- 接受好友请求成功
- 好友列表显示正确
- 好友数量统计正确
- 检查好友关系正确
- 设置好友备注成功
- 关键字搜索好友有效
- 拒绝好友请求成功
- 删除好友成功
- 所有异常场景返回正确错误
常见问题
Q1: 服务启动失败怎么办?
检查:
- 数据库是否正常运行
- 端口是否被占用
- 配置文件是否正确
- 依赖服务是否已启动
Q2: Token 过期怎么办?
重新登录获取新的 Token:
curl -X POST http://localhost:8080/api/v1/auth/login \
-H "Content-Type: application/json" \
-d '{
"mobile": "13800000001",
"password": "password123"
}'
Q3: 如何查看服务日志?
# UserService 日志
tail -f /path/to/user-service.log
# SocialService 日志
tail -f /path/to/social-service.log
# Gateway 日志
tail -f /path/to/gateway.log
Q4: 如何重置测试环境?
- 停止所有服务
- 清理数据库(执行上述清理SQL)
- 重新启动所有服务
- 重新注册测试用户
附录
A. 完整的 Postman Collection
可以导入以下 JSON 到 Postman 进行测试:
B. 自动化测试脚本
参考 tests/social_service_integration_test.sh 进行自动化测试。
C. 性能测试建议
- 使用 Apache Bench 或 wrk 进行压力测试
- 建议并发用户数:100-1000
- 观察响应时间和错误率
文档版本: v1.0
最后更新: 2026-01-06
维护者: AI Assistant