fixtures/ 中的示例项目上,每个项目都有少量源文件、能通过的测试、一个可选开启的失败测试和一处有意保留的警告。
由于需要安装这些工具,冒烟测试不包含在 cargo nextest run 或 pnpm test 中。CI 在 Language smoke 工作流里用固定版本运行它们。
语言冒烟测试
针对每种语言,在其示例项目上用应用默认启动的语言服务器跑一遍日常清单:补全、跳转到定义、Find Usages、悬停、带快速修复的诊断、一个 intention、重命名、格式化、参数信息、Structure 视图、自动导入、Optimize Imports 和移动文件。每项检查都写明了要找什么,失败时能直接看出是哪项操作出了问题。#[ignore] 标注了所需的服务器(如 #[ignore = "language smoke: needs vtsls"])。先装好对应的服务器;每种语言怎么装可以参考 CI 工作流。
项目冒烟测试按应用的方式打开示例项目(从构建文件识别源码和测试根目录、索引、Go to Class / Symbol、Maven / Gradle 模型)。其中被 ignore 的测试会运行 Maven、Gradle、python3 和 JDK 21:
运行与调试冒烟测试
这两套是 Vitest 套件(pnpm smoke,配置在 smoke/vitest.config.ts),驱动前端自己的模块——run store、测试结果上报、调试器状态——连接真实的后端。smoke/server.ts 启动 openidea-server --stdio,smoke/desktop.ts 提供一个进程内的 Tauri 运行时,其命令经由远程开发同样的路由发给该服务端。
先构建服务端,再运行某一种语言:
-t 是对测试名的匹配模式;记得加锚点('^c$'),否则 c 也会选中 cpp。
- run:检测示例项目的运行配置并启动,把输出解析成测试树,打开那个有意失败的测试,再重跑失败的测试。
- debug:在入口点的 “Set a breakpoint here” 这一行打断点,从文件上下文启动 Debug(调试器需要显式选择时则用保存的配置),然后检查暂停的栈帧、变量、求值、Step Over 和 Resume。C 和 C++ 使用 GDB 自带的 DAP 解释器(GDB 14+),其他语言使用 IDE 安装的调试器。
在 macOS 上,CodeLLDB 和 Delve 可能需要开启开发者模式:
sudo DevToolsSecurity -enable。IDE 会从 GitHub releases
下载部分调试器;遇到限流时设置 GITHUB_TOKEN(CI 就是这么做的)。CI 中
.github/workflows/language-smoke.yml 为每种语言(typescript、python、rust、go、java、kotlin、php、c、cpp)各跑一个任务。触发条件是推送到 main,以及改动了 crates/、languages/、fixtures/、Cargo.toml/Cargo.lock、src/features/run/、src/features/debugger/、src/platform/、smoke/、package.json/pnpm-lock.yaml 或该工作流本身的 PR。每个任务依次运行语言冒烟测试、相关的项目冒烟测试,然后是运行和调试冒烟测试。
服务器版本固定在工作流的 env 里,避免某个服务器发版导致无关的 PR 失败;升级要有意为之:
什么时候跑
改动了示例项目、languages/ 中的语言定义、ide-lsp、ide-dap、运行或调试功能,或者某种语言工具的安装方式时,请为受影响的语言跑冒烟测试,并把命令和结果写进 PR 的 How it was verified。