每个可测单元都配有测试,绿灯是每一步推进的门槛(要求 8)。

后端:按服务运行 pytest

每个服务是独立 uv 项目,在各自目录里运行:
cd rakull_server/<service>
uv run pytest -q
一次性跑全部六个服务:
cd rakull_server
for svc in data_server agent_server user_manager immersive_study_server collection_server manager_server; do
  echo "== $svc =="
  ( cd "$svc" && uv run pytest -q )
done

测试目录约定

每个服务镜像同样的结构:
目录内容
tests/unit_test/纯单元测试(仓储方法、安全/JWT、编排流程用 fake 驱动)
tests/functional_test/用 FastAPI TestClient 的进程内接口测试
tests/integration_test/跨服务/外部依赖(按需、env 开关)
外部调用都被 mock,重型依赖(AI SDK 等)不参与基础测试。控制器的功能测试把下游客户端类在其 import 处直接替换成 fake,从而无需真实网络即可覆盖编排逻辑。

当前覆盖

服务自动化测试PR CI
data_server
agent_server
user_manager
immersive_study_server
collection_server
manager_server尚未配置
测试数量会随实现变化,不在文档中固定;以本地 pytest 输出和当前 PR 的 CI 结果为准。manager_server 在补齐 CI 前必须以本地测试结果作为 PR 证据。
测试里会出现 InsecureKeyLengthWarning(因为测试密钥很短),这是预期的、不影响结果。

客户端:flutter test

cd rakullapp_core
flutter pub get
dart fix --apply
flutter analyze
flutter test
客户端测试使用 httpMockClient,不需要真实服务器,覆盖:URL/鉴权头拼装、SSE 行解析、JWT 角色解析、模型解码,以及文章列表 widget。

客户端测试流程

表单/功能两层、按平台与功能拆分的用例清单,以及用来逐项跟踪的可视化看板。