Smoke Test(烟雾测试)是在移动应用程序构建后执行的最小检查集,用于确认基本功能正常运行。Smoke Test可以快速拒绝不稳定的构建,而无需执行完整的回归测试循环。据Google Testing Blog(2024)报道,Smoke Test将开发者的反馈时间从2–3小时缩短到10–15分钟。Smoke Test是 CI/CD流水线中的第一个质量过滤器,防止已损坏的构建进入下一阶段。
主要观点
Smoke Test(烟雾测试)是一组快速测试,无需深入分析即可检查应用程序的基本功能。这个术语来自硬件工程学:如果设备装配后开始冒烟,它将不会被送去进行全面测试。在移动开发中,Smoke Test执行相同的功能——筛选出根本无法工作的构建。据Microsoft DevOps(2024)报道,实施 Smoke Test可使达到 QA团队的缺陷数量减少40%。
Smoke Test在每个新构建上执行——既在Android上,也在iOS上。理想情况下,Smoke Test不应超过15分钟,并应在成功构建后自动启动。通过标准——Smoke Test集中的100%测试必须成功完成。如果至少有一个测试失败,构建将被标记为不稳定,并不会被发送进行进一步测试。据Google Testing Blog(2024)报道,这种方法可将功能交付给用户的时间缩短25%。
Smoke Test可以是手动的(5–10项检查清单),也可以是自动化的。在现代移动项目中,嵌入在CI/CD中的自动化Smoke Test更受青睐。手动Smoke Test仅在项目早期阶段合理,当自动化不经济时。据Bitrise(2025)报道,73%的移动开发团队自动化了Smoke Test。
Smoke Test和回归测试常常被混淆,但它们是目的不同的不同实践。回归测试检查代码更改是否破坏了现有功能。它覆盖应用程序的所有模块和场景,包括稀有和边界情况。Smoke Test只检查关键路径——基本场景,没有它们应用程序就无用。覆盖深度——主要区别:Smoke Test覆盖5–10%的功能,回归测试覆盖80–100%。
第二个区别——执行时间。移动应用程序的回归测试集根据项目规模和平台数量可能需要2到12小时。Smoke Test需要5–15分钟。据Sauce Labs(2025)报道,iOS应用程序回归测试集的平均执行时间为4.5小时,Android为3.2小时。Smoke Test在两个平台上均可在10–15分钟内完成。
第三个区别——在流水线中的位置。Smoke Test在构建后立即执行,在回归测试之前。如果Smoke Test未通过,回归测试将不会启动——这节省了 CI/CD资源。Pipeline efficiency——Smoke Test可筛选出达到30%无法通过回归测试的构建,节省下的资源足以并行执行其他任务。
| 参数 | Smoke Test | 回归测试 |
|---|---|---|
| 目标 | 快速检查关键路径 | 检查所有功能 |
| 范围 | 5–10%场景 | 80–100%场景 |
| 时间 | 5–15分钟 | 2–12小时 |
| 频率 | 每次构建 | 发布前或每天 |
| CI/CD | 构建后、回归前 | Smoke Test后 |
启动应用程序——第一个也是最重要的测试。应用程序必须在所有目标设备上无崩溃地启动。Smoke Test检查冷启动:安装 → 打开 → 显示第一屏幕。如果应用程序在启动时崩溃,进一步的测试将毫无意义。XCUITest和Espresso可以在2–3行代码内自动化启动检查。Launch argument `-AppleLanguages (zh)`有助于在启动时检查本地化。
授权——第二个关键场景。Smoke Test必须检查登录表单是否显示、输入字段是否对触摸做出响应、登录按钮是否发送请求以及授权成功后应用程序是否跳转到主屏幕。授权错误会阻断对所有其他功能的访问,因此其检查被包含在最小集合中。Token refresh——针对具有OAuth 2.0的应用程序的附加检查。
主要内容加载——Smoke Test的第三个测试。应用程序的主屏幕或流必须加载并显示数据。如果API没有响应或响应解析受损,用户将看到空白屏幕。Smoke Test中的网络检查包括向主端点发送基本GET请求,并验证响应是否具有预期结构。导航——第四个场景。Smoke Test遍历应用程序的主要屏幕:主屏幕 → 搜索 → 个人资料 → 设置。选项卡栏和侧边菜单——导航中的典型问题来源,Smoke Test可以在早期阶段检测到它们。
Fastlane——自动化移动CI/CD的标准工具。Fastlane上的Smoke Test通过`scan`(针对XCUITest)或`gradle`(针对Espresso)启动。Fastlane可以在多个设备上并行配置Smoke Test,从而缩短总时间。配置在Fastfile中包含Smoke Test集的目标和通过阈值:100%成功的测试。
GitHub Actions(2024)发布了一个内置Smoke Test的移动CI/CD模板。该模板包括三个阶段:构建 → Smoke Test → 回归。如果Smoke Test失败,模板将自动终止流水线,并向Slack或Telegram发送通知。Matrix strategy可以同时在三个iOS版本和五个Android模型上运行Smoke Test。
职责分工在CI/CD中:Smoke Test负责快速反馈,回归测试负责全面覆盖。Smoke Test不应复制回归测试,反之亦然。粒度 Smoke Test——每个关键场景进行一次检查。如果Smoke Test超过15分钟,则需要优化:删除多余的检查或并行执行。
# 用于Smoke Test的Fastfile配置
platform :ios do
lane :smoke do
scan(
scheme: 'App',
devices: ['iPhone 15', 'iPhone SE'],
testplan: 'SmokeTest',
output_directory: 'reports/smoke',
fail_build: true
)
end
lane :regression do
scan(
scheme: 'App',
devices: ['iPhone 15', 'iPhone 14', 'iPhone SE'],
testplan: 'FullRegression'
)
end
end
XCUITest——Apple用于 iOS应用程序UI测试的框架。XCUITest用于自动化Smoke Test:启动应用程序、检查界面元素、模拟用户操作。与Xcode Server或GitHub Actions组合使用时,XCUITest在每次提交时运行。XCTest——用于单元测试的基础框架,补充XCUITest进行逻辑检查。
Espresso——Google用于 Android UI测试的框架。Espresso与 UI线程同步,并保证在检查开始前所有动画已完成。Espresso通过`onView(withId(...)).check(matches(...))`支持检查。Android Test Orchestrator在独立的进程中运行每个Smoke Test,防止前一个测试影响后一个测试。
Detox——针对React Native的框架,支持Smoke Test和灰盒测试。Detox与React Native bridge同步,并自动等待异步操作完成。灰盒测试允许Detox在无法直接访问源代码的情况下检查应用程序状态。
XCUITest用于 iOS包含两项检查:启动应用程序和显示主屏幕。测试通过`XCUIApplication().launch()`启动应用程序,并检查关键元素(例如`navigationBar`)是否存在。如果应用程序在启动时崩溃,XCTest框架会记录错误,测试以FAIL结束。Smoke Test不检查内容——只检查屏幕是否打开。
Espresso用于 Android使用`ActivityScenario`来启动Activity,使用`onView`来检查元素。平台之间的关键区别:iOS模拟器可能表现出与真实设备不同的行为,因此建议在Firebase Test Lab或模拟器上运行Android上的Smoke Test。Firebase Test Lab支持在10个设备上并行运行Smoke Test。
import XCTest
class LoginSmokeTest: XCTestCase {
let app = XCUIApplication()
override func setUp() {
continueAfterFailure = false
app.launch()
}
func testLoginButtonExists() {
XCTAssertTrue(app.buttons["登录"].exists)
}
func testLoginFlow() {
app.textFields["email"].tap()
app.textFields["email"].typeText("test@test.com")
app.secureTextFields["password"].tap()
app.secureTextFields["password"].typeText("password123")
app.buttons["Log In"].tap()
XCTAssertTrue(app.staticTexts["Welcome"].waitForExistence(timeout: 5))
}
}
上述示例展示了iOS上登录屏幕的Smoke Test。第一个测试检查登录按钮是否存在于屏幕上。第二个测试遍历完整的授权路径,并检查成功登录后是否显示欢迎消息。Timeout针对waitForExistence的 5秒钟超时——这是Smoke Test的标准值:如果UI元素在此时间内未显示,则应用程序无法正常工作。
常见问题
最佳数量是每个模块5到15个测试。Smoke Test应覆盖用户的关键路径,但不应该尝试覆盖所有功能。标准——如果Smoke Test的所有测试都通过,应用程序可以在QA环境中打开以进行进一步测试。
Smoke Test检查构建的稳定性,并在每次构建时执行。Sanity check是一个更窄小的测试集,在引入特定更改后执行。Sanity check回答“这次更改是否破坏了功能X?”,而Smoke Test回答“构建基本上是否可以工作?”。
是的,自动化Smoke Test是频繁发布项目的必要实践。自动化确保了检查的一致性和执行速度。手动Smoke Test仅在项目早期阶段合理,当构建数量不超过每周2–3个时。
构建将被标记为不稳定,并不会被发送进行进一步测试。开发者将收到含有Smoke Test失败日志的通知。修复问题后,将创建新的构建,并重新运行Smoke Test。阻塞缺陷将被记录在跟踪器中。
Smoke Test随着用户关键路径的每次更改而更新。如果添加了新的必要屏幕(例如引导页),它必须被包含在Smoke Test中。建议每个 sprint都要检查Smoke Test集的内容,以确保检查的时效性。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。