SuperAPI AI 工具集

writing-tests

测试与质量

查看项目

更新于 10-15 23:31

技能介绍

用途:这是 IntelliJ IDEA 代码库中编写测试的官方指南,面向在该代码库中新增或维护测试的开发者,核心是优先使用 JUnit 5 而非 JUnit 4。

主要能力与写法:

  • 用 @TestApplication 注解替代继承 LightJavaCodeInsightFixtureTestCase。JUnit 5 的优势包括无类层次开销、通过伴生对象共享 fixture、用注解替代手动 setup/teardown、可在同一类中混合 EDT 与非 EDT 测试、每个测试自动获得全新 disposable。
  • 共享 fixture:在 companion object 中用 projectFixture() 与 projectFixture.moduleFixture("src") 创建,测试内通过 get() 获取。
  • 生命周期:使用 @BeforeAll/@AfterAll(需 @JvmStatic)与 @BeforeEach/@AfterEach;资源清理优先用 @TestDisposable 而非手动 @AfterEach。
  • @TestDisposable 可注入测试级 disposable(字段或方法参数)。
  • @RegistryKey 替代 Registry.get().setValue();@SystemProperty 替代 System.setProperty()。
  • 协程与 UI 测试:以 com.intellij.testFramework.common.timeoutRunBlocking 作为协程边界并加 30 秒 @Timeout(其默认超时 10 秒)。setup、后台工作和断言保持在 UI 线程之外,仅把 Swing 操作放进小的 withContext(Dispatchers.UI) 块。Dispatchers.UI 是严格的,只提供 UI 线程亲和性;仅当被测操作确实需要模型或锁访问时才用 Dispatchers.EDT,并保持写操作显式。编辑器创建/销毁、文档修改、补全调用、action-group 展开、文件编辑器操作等模型相关例外,应把完整同步生命周期放在窄的 Dispatchers.EDT 块中。新测试不要用 @RunInEdt、@RunMethodInEdt、runInEdtAndWait、runInEdtAndGet。同步回调 API 无法调用挂起函数时,可用窄的有界适配器。优先使用可观察的完成信号、flow、latch 或虚拟时间而非 sleep;必须轮询时要有界并让谓词可挂起。launched 工作使用外层测试作用域,仅在独立作用域本身被测时才创建独立 CoroutineScope 并在 finally 取消。

关键类:TestApplication、TestDisposable、RegistryKey、SystemProperty、timeoutRunBlocking、projectFixture、moduleFixture。示例见 community/platform/testFramework/junit5/test/showcase/。

运行方式:命令行运行参见 TESTING.md,快速示例:./tests.cmd --module <test-module> --test com.example.MyTest。

限制:资料未提供更多平台、收费或版本兼容信息。