移动开发中的Smoke Test——它是什么、任务以及如何应用

作者: IT Sectr 发布日期: 2026-04-08 阅读时间: 9 分钟

Smoke Test(烟雾测试)是在移动应用程序构建后执行的最小检查集,用于确认基本功能正常运行。Smoke Test可以快速拒绝不稳定的构建,而无需执行完整的回归测试循环。据Google Testing Blog(2024)报道,Smoke Test将开发者的反馈时间从2–3小时缩短到10–15分钟。Smoke Test是 CI/CD流水线中的第一个质量过滤器,防止已损坏的构建进入下一阶段。

主要观点

  • Smoke Test——快速检查应用程序的基本功能,以拒绝不稳定的构建。
  • 任务——确认用户关键路径的工作状态(登录、流、个人资料)。
  • Smoke Test在回归测试之前执行,通常需要5–15分钟。
  • 自动化 CI/CD中的Smoke Test是现代移动开发流水线的必要元素。
  • 与回归的区别——Smoke Test只检查关键路径,回归测试覆盖所有功能。

什么是Smoke Test?

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只检查关键路径——基本场景,没有它们应用程序就无用。覆盖深度——主要区别: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包含哪些内容

启动应用程序

启动应用程序——第一个也是最重要的测试。应用程序必须在所有目标设备上无崩溃地启动。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可以在早期阶段检测到它们。

在CI/CD中自动化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分钟,则需要优化:删除多余的检查或并行执行。

ruby
# 用于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

Smoke Test工具

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在无法直接访问源代码的情况下检查应用程序状态。

Swift和Kotlin中的Smoke Test示例

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。

swift
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元素在此时间内未显示,则应用程序无法正常工作。

常见问题

Smoke Test应该包含多少个测试?

最佳数量是每个模块5到15个测试。Smoke Test应覆盖用户的关键路径,但不应该尝试覆盖所有功能。标准——如果Smoke Test的所有测试都通过,应用程序可以在QA环境中打开以进行进一步测试。

Smoke Test与sanity check有什么区别?

Smoke Test检查构建的稳定性,并在每次构建时执行。Sanity check是一个更窄小的测试集,在引入特定更改后执行。Sanity check回答“这次更改是否破坏了功能X?”,而Smoke Test回答“构建基本上是否可以工作?”。

是否需要自动化Smoke Test?

是的,自动化Smoke Test是频繁发布项目的必要实践。自动化确保了检查的一致性和执行速度。手动Smoke Test仅在项目早期阶段合理,当构建数量不超过每周2–3个时。

如果Smoke Test未通过怎么办?

构建将被标记为不稳定,并不会被发送进行进一步测试。开发者将收到含有Smoke Test失败日志的通知。修复问题后,将创建新的构建,并重新运行Smoke Test。阻塞缺陷将被记录在跟踪器中。

Smoke Test应该多久更新一次?

Smoke Test随着用户关键路径的每次更改而更新。如果添加了新的必要屏幕(例如引导页),它必须被包含在Smoke Test中。建议每个 sprint都要检查Smoke Test集的内容,以确保检查的时效性。

总结

  • Smoke Test是应用程序关键路径的最小检查集,在每次构建后执行。
  • 基本检查——启动应用程序、授权、加载内容和导航主要屏幕。
  • 与回归测试的区别——Smoke Test覆盖5–10%的场景,在5–15分钟内完成,而不是几个小时。
  • 工具——iOS用XCUITest,Android用Espresso,React Native用Detox。
  • 自动化 Smoke Test通过Fastlane、GitHub Actions或Bitrise集成到CI/CD中。
  • Smoke Test在回归测试之前执行,可筛选出达到30%的不稳定构建。
  • 建议每个 sprint都要检查Smoke Test的组成,以保持其时效性。

我们将开发一款交钥匙移动应用程序

IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。

讨论项目

另请阅读