Skip to content

计划增加操作SecScore的自动化测试 #7

Description

@PANDAJSR

是联动插件去掉secscore的后端
端到端测试或是mock哪样方便
对应插件仓库你自己找
要能用的提示词:

  • 小明有几分
  • 给小明小张和小泽加两份,昨天主动帮忙值日了
  • 给一组所有人加一分
  • 总积分超过50的有哪些人

Activity

  1. PANDAJSR commented on Aug 31, 2026

    @PANDAJSR
    CollaboratorAuthor

    /oc 给出计划方案

  2. github-actions commented on Aug 31, 2026

    @github-actions
    Contributor

    已完成调研。以下是针对 issue「计划增加操作 SecScore 的自动化测试」的方案。


    计划方案:SecScore 操作自动化测试

    一、背景与结论先行

    • 联动插件仓库已找到:SECTL/SecScore-SecAgent-Connector(插件 id secscore-connector,当前 v2.1.6)。其 README 明确「不连接本机 SecScore,也不创建本地数据库」,直接请求 SECSCORE_SYNC_SERVER_URL(默认 https://secscore-api.sectl.cn)的 /v1/classes、/v1/snapshot、/v1/sync、/v1/operations 等接口——这就是「去掉 secscore 后端」的含义:测试必须把后端 mock 掉,不能依赖真实云端/本机 SecScore。
    • 插件对外暴露的工具(main.mjs):
      • add_score(对模型可见)
      • list_students、find_students、list_groups、list_group_members(隐藏,必须经 secagent__call_hidden_tool 调用)
      • 注册 Skill skills/secscore,带自动加载正则(匹配"加分/扣分/积分"等关键词)。
    • 推荐 mock 方案,不做真 E2E。理由:
      1. 真 E2E 需要真实 LLM Key + 真实 SecScore 账号/班级/云端,CI 不可复现、不稳定、有成本。
      2. 仓库已有成熟 mock 先例:runtime.test.ts 和 model-provider.test.ts 都是注入 fake authBridge + mock globalThis.fetch 脚本化 SSE 响应。
      3. 四个提示词的核心验证点是「模型工具编排 → 插件对后端调用序列 → 最终回答」,mock 后端即可完整覆盖。

    二、Mock 设计(两层)

    1. 模型层:config.agent.baseUrl 指向不可达/本地地址,mock globalThis.fetch 对模型端点的 SSE 响应,返回「工具调用 → 最终回答」的脚本序列(与现有测试完全一致)。
    2. SecScore 后端层:把 SECSCORE_SYNC_SERVER_URL 指向本地 fake Sync Server(http://127.0.0.1:<port>,node:http 实现),维护内存学生/积分表,实现四个端点:
      • GET /v1/classes(插件激活时自动选班级)
      • GET /v1/snapshot?class_id=... 与 POST /v1/sync(查询学生与分组)
      • POST /v1/operations(加分/扣分,写入内存表)
      • 不设置 SECTL_OFFICIAL_API_URL,跳过 Relay introspection/oauth 转换;PluginManager 注入 fake authBridge,getSession() 返回 { accessToken: "test-token", userId: "u1", ... }。
      • 同一 fetch mock 按 URL 分流:/chat/completions 走模型脚本,其余请求转发给本地 fake server。

    三、测试文件与结构(均在 SecAgent 仓库)

    新增 src/secscore-connector.test.ts(沿用 node:test + assert,随 npm test 运行,CI build.yml 已有 build:cli + npm test 步骤),配套 src/test-fixtures/secscore-connector/ 目录存放插件源码副本。

    插件包获取:不用网络下载 release,而是把 main.mjs、secagent-plugin.json、skills/secscore/SKILL.md 拷入 fixtures,测试内用 AdmZip 动态打包→PluginManager.install()。好处是锁定插件契约(工具 key、参数名、Skill 自动加载正则),插件侧一旦改动契约,测试立即失败。

    可复用 helper:

    • fakeSecScoreServer(seedStudents) → 返回 { port, close(), getState() },内置一/二组、6~8 名学生(含小明/小张/小泽)及积分;
    • modelScript(...) → 把 tool_calls→answer 序列转成 SSE 响应;
    • runWithPlugin(prompt, script) → temp workspace → 装插件 → SecAgentRuntime.run() → 收集 trace 与审计记录。

    四、用例(四个提示词)与断言

    # 提示词 期望模型工具序列 断言重点
    1 小明有几分 find_students/list_students 查小明 → 回答 回答含小明当前分数;Skill 自动加载(secagent.skills/auto-load);调用的是插件工具 key(secscore-connector__*)
    2 给小明小张和小泽加两份,昨天主动帮忙值日了 3 次 add_score(delta=2,reason=「昨天主动帮忙值日了」) fake server 收到 3 条 operations,score_delta=2、reason_content 正确;回答确认三人 +2 并报变更前后分数;再次查询三人各 +2
    3 给一组所有人加一分 list_group_members(group_name="一组") → 对每个组员 add_score(1) operations 数量 = 一组组员数;组员各 +1;回答列出「一组」全部成员
    4 总积分超过50的有哪些人 list_students → 过滤 score>50 → 回答 回答只含 >50 的同学(如小李 60、小王 55),不含 ≤50 的;不调用任何写工具

    每个用例额外断言:写入工具的审计记录存在(audit.log 中 tool=secscore-connector__add_score)、无未注册工具错误。

    五、需要改动的文件清单

    • SecAgent 仓库:
      • 新增 src/secscore-connector.test.ts(主测试)
      • 新增 fixtures 目录(插件三件套副本)
      • 不需要改运行时源码——runtime.ts/plugin-manager.ts/mcp-adapter.ts 均保持不动
    • SECTL/SecScore-SecAgent-Connector 仓库(可选,若 issue 希望插件侧也加):
      • 新增 main.test.mjs,直接 mock api 对象(api.fetch/api.getSectlSession/api.setConfig),单元测试 addScore 的同名校验、listStudents 过滤、findStudent 精确/模糊匹配等纯逻辑;package.json 增加 node --test 脚本。

    六、风险与注意

    • add_score 对模型可见,其余隐藏:用例应验证隐藏工具只能经 secagent__call_hidden_tool 调用(Skill 正文即契约)。
    • 同名同学会触发「找到多个同名或相似同学」错误分支,夹具避免同名,并建议补一条同名报错用例。
    • 模型 SSE 脚本必须与提示词一一对应;每用例独立构造 fetch mock,避免状态泄漏。
    • 旧的 SecScoreMcpAdapter / doctor 仍引用 localhost:3901 的旧 MCP 配置,与插件流程无关,本次不改、不受影响。
    • 插件 refreshConnection 激活即请求 /v1/classes,fake server 必须最先实现该端点,否则插件状态为 error。

    七、实施步骤

    1. 拷贝插件三件套为 fixtures,实现 fake Sync Server + 模型 SSE helper;
    2. 按上表实现 4 个用例 + 同名错误分支,断言回答文本、工具调用序列、后端积分变化、审计记录;
    3. npm run build:cli && npm test 全量跑通(CI 已覆盖);
    4. 可选:给插件仓库补 mock api 的单元测试并接入其 CI。

    需要我直接按此方案开始实现吗?

    New%20session%20-%202026-08-31T10%3A18%3A42.832Z
    opencode session  |  github run

  3. PANDAJSR commented on Aug 31, 2026

    @PANDAJSR
    CollaboratorAuthor

    /oc 好的实现

  4. github-actions commented on Aug 31, 2026

    @github-actions
    Contributor

    Author identity unknown

    *** Please tell me who you are.

    Run

    git config --global user.email "you@example.com"
    git config --global user.name "Your Name"

    to set your account's default identity.
    Omit --global to set the identity only in this repository.

    fatal: empty ident name (for runner@runnervmgx7h7.2teta1ngcx3e5onlpkheve315a.bx.internal.cloudapp.net) not allowed

    opencode session  |  github run

  5. PANDAJSR commented on Aug 31, 2026

    @PANDAJSR
    CollaboratorAuthor

    /oc 请继续完成,提交代码并创建 PR

  6. github-actions commented on Aug 31, 2026

    @github-actions
    Contributor

    GitHub Actions is not permitted to create or approve pull requests. - https://docs.github.com/rest/pulls/pulls#create-a-pull-request

    opencode session  |  github run

  7. PANDAJSR commented on Sep 1, 2026

    @PANDAJSR
    CollaboratorAuthor

    /oc 重试

  8. PANDAJSR commented on Sep 1, 2026

    @PANDAJSR
    CollaboratorAuthor

    /oc 重试

  9. opencode-agent commented on Sep 1, 2026

    @opencode-agent

    Created PR #17

    New%20session%20-%202026-09-01T12%3A46%3A39.482Z
    opencode session  |  github run

  10. opencode-agent commented on Sep 1, 2026

    @opencode-agent

    User opencode-agent[bot] does not have write permissions

    github run

  11. PANDAJSR commented on Sep 4, 2026

    @PANDAJSR
    CollaboratorAuthor

    /oc 重试:请继续完成之前的任务;如果任务目标是其他仓库,请使用 GH_TOKEN 访问对应仓库并直接提交代码、创建 PR。

  12. github-actions commented on Sep 4, 2026

    @github-actions
    Contributor

    remote: Invalid username or token. Password authentication is not supported for Git operations.
    fatal: Authentication failed for 'https://github.com/SECTL/SecAgent/'

    opencode session  |  github run

  13. PANDAJSR commented on Sep 5, 2026

    @PANDAJSR
    CollaboratorAuthor

    /oc 继续执行之前的任务:请从当前状态继续完成代码修改,配置 Git 身份和认证已修复;完成测试后直接提交新分支并创建 PR。若任务目标是其他 SECTL 仓库,请使用 GH_TOKEN 访问目标仓库并在那里创建 PR。

  14. PANDAJSR commented on Sep 5, 2026

    @PANDAJSR
    CollaboratorAuthor

    /oc 继续重试:请从之前中断的位置继续完成任务,使用已修复的跨仓库 Git 认证,完成代码修改和测试后直接提交新分支并创建 PR;如果目标是中转服务,请访问 SECTL/secagent-official-relay 并在那里创建 PR。

  15. PANDAJSR commented on Sep 5, 2026

    @PANDAJSR
    CollaboratorAuthor

    /oc 继续执行:请从之前中断处恢复,先确认目标仓库和当前状态;完成代码修改、测试、提交和 PR。不要只输出方案。

  16. github-actions commented on Sep 5, 2026

    @github-actions
    Contributor

    fatal: unable to access 'https://github.com/SECTL/SecAgent/': The requested URL returned error: 400

    opencode session  |  github run

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions