Limesn
Limesn
发布于 2026-09-07 / 4 阅读
0

项目演示

云存储系统手工测试指南

本文档用于手动验证客户端和服务端的主要功能。除特别说明外,命令均在客户端交互界面中执行。

1. 测试前准备

1.1 环境要求

  • Linux
  • GCC、Make、pthread
  • MySQL Client 开发库
  • 可访问配置文件中的 MySQL 服务
  • MySQL 账号已经能够访问 netdisk 数据库

1.2 编译

在项目根目录执行:

make

如果只想检查依赖:

./setup_env.sh check

1.3 启动服务端和客户端

终端 A:

cd server
./bin/cloud_server

终端 B:

cd client
./bin/cloud_client

默认地址是 127.0.0.1:12345,配置见 server/config/server.confclient/config/client.conf

服务端日志默认在:

server/logs/server.log

另开终端观察日志:

tail -f server/logs/server.log

1.4 准备本地测试文件

在项目根目录执行:

mkdir -p manual_test_files downloads
printf 'cloud-storage-manual-test\n' > manual_test_files/small.txt
dd if=/dev/urandom of=manual_test_files/large.bin bs=1M count=20 status=progress
sha256sum manual_test_files/small.txt manual_test_files/large.bin

测试完成后可清理本地文件:

rm -rf manual_test_files downloads

2. 用户注册、登录和密码验证

2.1 注册新用户

在客户端执行:

signup manual_user manual_pass_123 manual@example.com

预期结果:

  • 返回注册成功或类似 OK 的响应。
  • 用户可以使用该账号登录。
  • 数据库 users 表中产生用户记录。

2.2 正确登录

login manual_user manual_pass_123

预期结果:

  • 登录成功。
  • 服务端返回 JWT Token。
  • 后续业务命令可以正常执行。

2.3 错误密码

先退出客户端或新开一个客户端,再执行:

login manual_user wrong_password

预期结果:登录失败,不应进入已登录状态。

2.4 未登录访问业务命令

在未登录的客户端执行:

pwd

预期结果:服务端提示需要先登录。

3. 虚拟目录功能

登录成功后依次执行:

pwd
mkdir manual_dir
ls
cd manual_dir
pwd
cd ..
pwd

预期结果:

  1. 初始 pwd 显示用户根目录。
  2. mkdir manual_dir 创建目录成功。
  3. ls 能看到 manual_dir/
  4. cd manual_dir 成功进入目录。
  5. 进入后 pwd 路径发生变化。
  6. cd .. 返回上一级目录。

继续测试绝对路径和当前路径:

cd /
pwd
ls
cd ./manual_dir
pwd
cd ..

预期结果:/... 能正确解析。

3.1 目录异常情况

cd not_exists
mkdir manual_dir

预期结果:

  • 进入不存在目录失败。
  • 创建同名目录时返回错误,不产生重复目录。

4. 普通上传 puts

先进入目标远程目录:

cd manual_dir

上传到远程目录(不需要写远程文件名):

puts /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/manual_test_files/small.txt ./manual_dir

也可以省略远程目录,此时上传到当前远程目录:

puts /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/manual_test_files/small.txt

预期结果:

  • 客户端显示上传已在后台开始。
  • 稍后显示上传成功。
  • 服务端日志出现上传相关记录。
  • ls 能看到远程文件。
ls

4.1 上传异常情况

puts /tmp/not_exists.txt ./
puts /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/manual_test_files/small.txt ./

预期结果:

  • 本地不存在的文件上传失败。
  • 已存在同名远程文件时上传失败,不覆盖原文件。

5. 文件下载 gets

在客户端执行:

gets small.txt /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/downloads/

预期结果:

  • 客户端显示下载已在后台开始。
  • 下载完成后自动生成 downloads/small.txt
  • 文件内容和源文件一致:
cmp manual_test_files/small.txt downloads/small.txt
echo $?

输出 0 表示内容一致。

下载到已存在的本地文件时,客户端应询问是否覆盖:

gets small.txt /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/downloads/

输入 y 覆盖,输入 n 取消。

6. 删除文件和目录

删除文件:

rm small.txt
ls

预期结果:文件不再出现在列表中。

递归删除目录:

cd ..
mkdir remove_test
cd remove_test
puts /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/manual_test_files/small.txt ./
cd ..
rm -r remove_test
ls

预期结果:remove_test 及其内部文件都被删除。

7. 极速秒传

  1. 上传一个文件并等待成功。
  2. 删除远程文件,但保留本地测试文件。
  3. 再次上传相同内容,并使用不同的远程文件名。
puts /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/manual_test_files/small.txt ./
rm small.txt
mkdir fast_dir
puts /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/manual_test_files/small.txt fast_dir/

预期结果:第二次上传很快完成,服务端根据 SHA-256 哈希复用 storage_files 中已有的物理文件,而不是重新传输全部数据。

可在日志中搜索哈希或秒传相关记录:

grep -iE 'hash|秒传|fast|upload' server/logs/server.log | tail -n 30

8. 断点续传

客户端会把未完成上传的任务号按文件哈希保存到:

$HOME/.netdisk_upload_tasks/

手工测试步骤:

  1. 使用较大的文件开始上传:
puts /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/manual_test_files/large.bin ./
  1. 上传开始后,在客户端进程仍运行时中断网络、停止服务端,或结束客户端进程。
  2. 确认任务文件仍存在:
ls -l "$HOME/.netdisk_upload_tasks"
  1. 恢复服务端并重新启动客户端,登录同一用户。
  2. 再次执行相同的上传命令:
puts /home/limesn/work/cpp74_Group_1/Project_01_Cloud_Storage/manual_test_files/large.bin ./

预期结果:

  • 客户端提示发现未完成上传任务并尝试断点续传。
  • 服务端根据 upload_id 和已接收大小返回续传偏移量。
  • 只发送剩余数据,最终上传成功。
  • 成功后对应的本地任务记录被清除。

注意:文件必须保持不变,否则 SHA-256 会变化,客户端不会匹配原断点任务。

9. Token 验证和会话恢复

9.1 正常 Token 验证

登录后执行:

pwd
ls

预期结果:业务命令正常执行,说明客户端携带的 JWT 通过服务端验证。

9.2 Token 失效

可使用两个客户端进行测试:

  1. 客户端 A 登录并保持运行。
  2. 等待 Token 过期,或在测试环境修改 JWT 密钥/时间配置后重启服务端。
  3. 客户端 A 执行:
ls

预期结果:服务端拒绝请求并提示 Token 无效或已过期,需要重新登录。

不要在生产环境中直接修改密钥;该步骤只适合测试环境。

10. 超时踢出

当前配置为 30 秒:

idle_timeout=30

为了缩短测试时间,可在测试环境将 server/config/server.conf 改为:

idle_timeout=5

重启服务端后:

  1. 客户端登录。
  2. 不输入任何命令,等待超过 5 秒。
  3. 再执行:
pwd

预期结果:空闲连接被服务端关闭,客户端检测到断线并尝试重新连接或提示连接状态变化。

传输大文件时不要把“传输中”误判为超时:上传或下载期间服务端会暂停空闲计时,传输结束后再恢复。

测试结束后建议恢复:

idle_timeout=30

11. 断线重连

11.1 客户端自动重连

  1. 启动客户端并登录。
  2. 让服务端暂时停止:
pkill -x cloud_server
  1. 在客户端执行任意业务命令,例如:
pwd
  1. 重新启动服务端:
cd server
./bin/cloud_server
  1. 再次在客户端执行:
pwd

预期结果:

  • 客户端发现控制连接断开。
  • connection_ensure() 重新建立连接。
  • 客户端使用缓存的登录信息完成重新登录。
  • 客户端恢复之前的工作目录,然后命令继续执行。

11.2 手动确认目录恢复

cd manual_dir
pwd

临时停止并恢复服务端后,再执行:

pwd

预期结果:仍然位于 manual_dir,而不是回到根目录。

12. 日志和并发观察

在终端 C 持续观察日志:

tail -f server/logs/server.log

另开多个客户端,分别执行上传、下载、mkdirpwd。重点观察:

  • 客户端 fd、用户 ID 和命令。
  • 上传文件名、文件大小、哈希和 upload_id
  • 数据通道创建失败、文件同名和服务器繁忙提示。
  • 上传/下载开始、完成和失败记录。

并发上传同一个远程文件名时,预期只有一个请求成功进入上传流程,其余请求提示同名文件正在上传或服务器繁忙。

13. 测试结果记录表

编号测试项预期结果实际结果是否通过
1注册新用户创建成功
2正确登录返回 JWT
3错误密码登录失败
4pwd/ls/cd目录操作正常
5mkdir创建目录成功且不重复
6普通 puts文件上传成功
7gets文件下载且内容一致
8rm / rm -r文件或目录删除成功
9极速秒传相同哈希内容快速复用
10断点续传从偏移量继续并完成
11Token 验证无效 Token 被拒绝
12超时踢出空闲连接被关闭
13断线重连登录状态和目录恢复
14日志关键操作有记录

14. 一键自动化对照

手工测试完成后,可以运行已有自动化测试进行交叉验证:

python3 tests/test_server.py --skip-build

首次运行或需要重新编译时:

python3 tests/test_server.py

测试报告生成在 tests/reports 目录。