You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

4.4 KiB

文件存储测试 Mock 数据更新

日期: 2026-02-02
类型: 测试维护
影响范围: 单元测试

背景

在完成 MinIO 到 boto3 S3 迁移后,单元测试中的 mock 数据仍使用旧的 MinIO 格式,需要更新以反映实际生产环境配置。

变更内容

更新的测试文件

文件: server/tests/unit/test_file_storage_service.py

Mock 数据调整

1. storage_provider 字段

# 旧值
storage_provider="minio"

# 新值
storage_provider="oss"

2. file_url 格式

# 旧格式(MinIO)
file_url="http://localhost:6185/jointo/test/test.txt"

# 新格式(阿里云 OSS)
file_url="https://static.timelab.cn/test/test.txt"

3. 预签名 URL 格式

# 旧格式
expected_url = "http://localhost:6185/presigned-url"

# 新格式
expected_url = "https://static.timelab.cn/test/file.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&..."

涉及的测试用例

  1. test_upload_new_file - 上传新文件
  2. test_upload_duplicate_file - 上传重复文件(去重)
  3. test_get_presigned_url - 生成预签名 URL
  4. test_increase_reference_count - 增加引用计数
  5. test_decrease_reference_count_with_remaining_refs - 减少引用计数(仍有引用)
  6. test_decrease_reference_count_to_zero - 减少引用计数到 0
  7. test_cleanup_unused_files - 清理无引用文件
  8. test_cleanup_with_deletion_error - 清理时部分文件删除失败

测试结果

单元测试

docker exec jointo-server-app pytest tests/unit/test_file_storage_service.py -v

结果: 11/11 通过

tests/unit/test_file_storage_service.py::TestCalculateChecksum::test_calculate_checksum PASSED
tests/unit/test_file_storage_service.py::TestCalculateChecksum::test_calculate_checksum_empty_file PASSED
tests/unit/test_file_storage_service.py::TestUploadFile::test_upload_new_file PASSED
tests/unit/test_file_storage_service.py::TestUploadFile::test_upload_duplicate_file PASSED
tests/unit/test_file_storage_service.py::TestUploadFile::test_upload_file_storage_error PASSED
tests/unit/test_file_storage_service.py::TestGetPresignedUrl::test_get_presigned_url PASSED
tests/unit/test_file_storage_service.py::TestReferenceCount::test_increase_reference_count PASSED
tests/unit/test_file_storage_service.py::TestReferenceCount::test_decrease_reference_count_with_remaining_refs PASSED
tests/unit/test_file_storage_service.py::TestReferenceCount::test_decrease_reference_count_to_zero PASSED
tests/unit/test_file_storage_service.py::TestCleanupUnusedFiles::test_cleanup_unused_files PASSED
tests/unit/test_file_storage_service.py::TestCleanupUnusedFiles::test_cleanup_with_deletion_error PASSED

集成测试

状态: 无需调整

集成测试不使用硬编码的 mock 数据,而是:

  • 实际调用 API 获取响应
  • 验证字段存在性和逻辑正确性
  • 自动适配当前环境配置(.env 中的 S3 配置)

技术细节

为什么单元测试需要调整?

单元测试使用 mock 对象模拟依赖,mock 数据中的 storage_providerfile_url 是硬编码的。虽然不影响测试通过(因为是 mock),但会导致:

  1. 文档价值降低 - 测试数据与实际环境不一致
  2. 维护困惑 - 未来开发者可能误以为仍在使用 MinIO
  3. 最佳实践 - 测试数据应尽可能反映真实场景

为什么集成测试不需要调整?

集成测试的特点:

  • 使用真实的 StorageService 实例
  • .env 读取配置
  • 返回的 file_url 自动使用 S3_PUBLIC_URL
  • 测试代码只验证逻辑,不验证具体值

环境配置参考

当前生产环境配置(.env):

STORAGE_PROVIDER=oss
S3_ENDPOINT_URL=https://oss-cn-beijing.aliyuncs.com
S3_BUCKET_NAME=jointo
S3_REGION=oss-cn-beijing
S3_PUBLIC_URL=https://static.timelab.cn

相关文档

影响评估

  • 无破坏性变更
  • 测试逻辑未改变
  • 测试覆盖率保持不变
  • 所有测试通过

总结

成功将文件存储单元测试的 mock 数据从 MinIO 格式更新为阿里云 OSS 格式,确保测试数据与实际生产环境配置一致,提高了测试的文档价值和可维护性。