【问题标题】:Rerun failed unit test - Xcode XCTest重新运行失败的单元测试 - Xcode XCTest
【发布时间】:2016-07-05 12:59:51
【问题描述】:

当我运行 XCTests 时,我想自动重新运行一次失败的任何集成(单元/ui)测试。这可能吗?

这将在同一个测试中完成,而不必在我的测试或我的测试的任何部分再次点击“运行”。我正在从命令行运行我的所有测试。

我正在做使用网络调用服务器的 UI 测试。如果存在严重的服务器问题,测试将/应该失败并报告错误。但是,如果只是请求的临时问题,最好自动重新运行测试并查看它是否通过。此外,在 Xcode UI 测试的当前状态下,偶尔会出现一些问题,即它会由于不明原因而崩溃,最好自动重新运行测试以查看它是否通过了第二次。

如果它可以输出发生的事情就特别好,即“测试第一次失败,因为刷新快照失败,但第二次通过了”

【问题讨论】:

  • 问题是您不应该依赖网络调用进行测试。您可以使用NSURLProtocol 子类或使用OHTTPStubs 之类的东西来存根这些网络请求,否则您需要编写一个脚本来运行您的测试、查找错误并尝试重新运行这些测试。
  • 如果 OP 正在使用真实用户和数据编写集成测试,则这是不可能的。

标签: xcode xctest xcode-ui-testing


【解决方案1】:

在没有快速通道和粒度测试重新运行的情况下完成此任务的任务列表

  • 创建一个脚本来重新运行测试并捕获失败的测试列表,然后使用 xcodebuild 的 -only-testing:TEST-IDENTIFIER 标志重新运行测试。
  • 解析 resultBundle 或 .xcresult 以查找失败的测试
  • 编写代码以擦除执行测试的设备或模拟器
  • 如果是真实设备则重启设备以清除任何可能的对话框
  • 使用 XCAttachment 收集您关心的内容,例如应用日志
  • 使用 xchtmlreport 从包含您的快照和附件的结果包中生成一个漂亮的网页。

【讨论】:

    【解决方案2】:

    Fastlane 可以让这成为可能 这里是关于相同的很棒的博客文章

    Stabilizing the CI By Re-runing Flaky iOS XCUI Tests

    【讨论】:

    • 这种方法的缺点:依赖 fastlane,无法在不重新运行整个套件的情况下重新运行单个失败的测试,示例无法处理真实设备。
    最近更新 更多