关于 capacitor-testing
这项测试技能面向 Capacitor 应用和插件开发者,涵盖 Web、原生桥接及设备测试,帮助选择合适的测试层,并指导模拟、原生测试、端到端测试和 CI。
主要功能
- 01选择测试层的指导
- 02使用 Vitest 模拟插件
- 03Web 流程与组件测试
- 04Swift 和 Kotlin 插件测试
- 05设备验证与 CI 指导
适用场景
- 01为 Capacitor 应用添加测试
- 02在 Web 测试中模拟插件 API
- 03测试原生插件代码
- 04验证应用在设备上的行为
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ cap-go/ capgo-skills --skill capacitor-testing安装后在 Claude Code 中输入/capacitor-testing确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
metadata.jsonreferences/ci.mddevice-verification-loop.mde2e.mdnative-plugin-tests.mdweb-unit-tests.md详细介绍
测试 Capacitor 应用和插件
Capacitor 应用有三个测试层:Web 应用(大部分逻辑)、原生桥接和插件(Swift/Kotlin),以及设备上运行的应用。选择能捕获该 Bug 的成本最低的层。
适用场景
在以下情况下使用:
- 为 Capacitor 应用添加单元测试、组件测试或端到端测试
- 在 Vitest / Jest 中模拟 Capacitor 或插件 API
- 为插件编写或更新原生单元测试(Swift Testing、XCTest、JUnit)
- 在模拟器、仿真器或设备上验证更改(“测试一下”“能正常工作吗”“在设备上检查”)
- 端到端测试无法在应用中找到 Web 元素(WebView 上下文)
- 在 CI 中设置测试作业
以下情况不使用:
- 读取设备或崩溃日志:
ios-android-logs - Safari Web Inspector / Chrome DevTools 调试:
debugging-capacitor - 构建、签名和发布流水线:
capacitor-ci-cd - App Intents 测试:
capacitor-app-intents(AppIntentsTesting)
选择测试层
| 更改内容 | 测试方式 | 参考资料 |
|---|---|---|
| 业务逻辑、状态、调用插件的服务 | 使用模拟插件的 Vitest | references/web-unit-tests.md |
| 组件(React、Vue、Angular、Svelte) | 使用 Vitest 上的 Testing Library | references/web-unit-tests.md |
| Web 工作流(路由、表单) | 使用 Playwright 测试开发服务器或 dist | references/e2e.md |
| 插件原生代码(Swift / Kotlin) | Swift Testing 或 XCTest;JUnit | references/native-plugin-tests.md |
| 设备上的完整应用、原生 UI、权限、深层链接 | Agent 验证循环;使用 Appium 或 Maestro 编写可重复运行的测试套件 | references/device-verification-loop.md、references/e2e.md |
| CI 作业 | GitHub Actions 矩阵 | references/ci.md |
仅在涉及相应测试层时才加载参考资料。
有助于节省时间的信息
- 在 jsdom 中运行的插件会执行其 Web 实现,如果没有 Web 实现,则会抛出
unimplemented。除非模拟@capacitor/core,否则Capacitor.isNativePlatform()在测试中会返回false。应在插件包边界进行模拟,而不是深入应用内部模拟。 - 端到端测试工具会将 WebView 视为一个原生元素。 Appium 必须切换到
WEBVIEW_*上下文才能查找 DOM 元素。Capacitor 会在调试构建中允许检查 WebView;对于发布构建,请在capacitor.config中设置ios.webContentsDebuggingEnabled/android.webContentsDebuggingEnabled。切勿因疏忽而在启用该设置的情况下发布应用。 - 不能使用 Detox。 它面向 React Native,无法驱动 Capacitor WebView 内容。
- Swift Testing 不能取代所有 XCTest。 UI 测试(XCUIApplication)和
measure {}性能测试仍需使用 XCTest。单元测试可以逐个类迁移;同一个文件可以同时包含两者。 - 仅支持 iOS 的插件包不能使用
swift test,因为它们依赖 UIKit 和 Capacitor。请运行xcodebuild test -scheme <Package> -destination 'platform=iOS Simulator,...'。 - Capacitor 9 移除了已弃用的 Swift API。 使用旧版
CAPPluginCall(callbackId:options:success:error:)初始化器或CAPPlugin(bridge:pluginId:pluginName:)来构建调用的测试,必须改用CAPPluginCall(callbackId:methodName:options:success:error:)和普通的init()。 - Capacitor 9 更改了实时重载标记。 Capacitor 9:
npx cap run ios --url http://<lan-ip>:5173。Capacitor 8:npx cap run ios -l --host <lan-ip> --port 5173。Ionic CLI 的ionic cap run ios -l --external是另一种工具。
工作流
- 检查。 阅读
package.json(测试运行器、框架、@capacitor/*版本)、capacitor.config.*、现有测试配置(vitest.config.*、playwright.config.*、wdio.conf.*、.maestro/),如果是插件,还要检查Package.swift、podspec、ios/Tests/、android/src/test/。 - 询问 如果请求比较笼统,询问用户想测试哪个层级。建议选择能覆盖风险的最低成本方案。
- 编写测试,使用匹配的参考资料。遵循项目现有的测试运行器和风格;不要添加第二个测试运行器。
- 运行测试并展示输出。未运行的测试不算完成。
- 对于会影响 UI 的更改,运行设备验证循环(references/device-verification-loop.md),并报告截图和发现。
验证
# Web layer
npx vitest run
npx playwright test
# Plugin, iOS (from the plugin repo)
xcodebuild test -scheme <PluginPackageName> \
-destination "platform=iOS Simulator,name=$(xcrun simctl list devices available | grep -m1 -o 'iPhone [^(]*' | sed 's/ *$//')"
# Plugin, Android (from the plugin repo)
cd android && ./gradlew test
# App native tests, if the app has a test target
xcodebuild test -project ios/App/App.xcodeproj -scheme App -destination 'platform=iOS Simulator,name=<device>'
# CocoaPods projects: -workspace ios/App/App.xcworkspace
报告:添加的测试、运行的命令、通过/失败数量,以及本地无法运行的内容(没有模拟器、没有设备、缺少 Android SDK)。
错误处理
| 症状 | 原因 | 修复方法 |
|---|---|---|
在 Vitest 中出现 "<Plugin>" plugin is not implemented on web | 在 jsdom 中运行了真实插件 | 在 setup 文件中使用 vi.mock('<plugin package>') |
| Mock 被忽略,仍调用真实插件 | Mock 路径与导入路径不同,或 Mock 注册晚于导入 | Mock 应用导入的确切说明符。在 setupFiles 中或测试文件顶部添加 vi.mock |
Appium 找不到 data-testid 元素 | 仍处于 NATIVE_APP 上下文 | 等待 getContexts() 列出 WEBVIEW_* 条目后,执行 await driver.switchContext(webviewContext) |
没有 WEBVIEW_* 上下文 | WebView 不可检查(发布构建) | 使用调试构建,或仅为测试构建启用 webContentsDebuggingEnabled |
| Android WebView 上下文因 chromedriver 版本错误而失败 | Chromedriver 与设备上的 WebView 不匹配 | 启用 Appium 的 chromedriver 自动下载(这是一项不安全的功能标志),或指定匹配的 chromedriver;参阅 Appium UiAutomator2 文档 |
No such module 'Testing' | Xcode 版本过旧 | Swift Testing 需要 Xcode 16+ 工具链。Capacitor 9 无论如何都需要 Xcode 27 |
swift test 出现 error: no such module 'UIKit' | 在 macOS 主机构建 iOS 软件包 | 使用 xcodebuild test,并指定 iOS Simulator 目标 |
'init(callbackId:options:success:error:)' is deprecated/不可用 | 测试辅助工具版本过旧 | 添加 methodName: |
实时重载:error: unknown option '-l' | Capacitor 9 CLI | 使用 --url http://<lan-ip>:<port> |
| 实时重载应用显示空白页 | 开发服务器绑定到 localhost,或 IP 地址错误 | 绑定到 0.0.0.0(Vite:--host),使用局域网 IP,并确保连接同一 Wi-Fi |
相关技能
debugging-capacitor:检查 WebView 和原生调试器ios-android-logs:在设备运行期间流式查看日志capacitor-ci-cd:构建和发布流水线capacitor-ios-resizability:设备运行期间调整窗口大小时的检查要点capacitor-plugin-upgrade-v8-to-v9:会影响测试辅助工具的插件 API 移除项
评论
支持 Markdown