【问题标题】:iOS Testing: Is there a way to skip tests?iOS 测试:有没有办法跳过测试?
【发布时间】:2015-08-09 06:39:21
【问题描述】:

如果该功能当前被禁用,我不想执行某些测试。有没有办法“跳过”测试(并在控制台上获得适当的反馈)?

类似这样的:

func testSomething() {
  if !isEnabled(feature: Feature) {
    skip("Test skipped, feature \(feature.name) is currently disabled.")
  }

  // actual test code with assertions here, but not run if skip above called.
}

【问题讨论】:

    标签: ios swift xctest


    【解决方案1】:

    从 Xcode 11.4 开始,您将能够使用 XCTSkipUnless(_:_:file:line:)

    release notes 阅读,

    XCTest 现在支持基于运行时动态跳过测试 条件,例如仅在某些条件下运行时执行某些测试 设备类型或远程服务器何时可访问。当一个测试是 跳过,Xcode 在 Test Navigator 和 Test 中以不同的方式显示它 报告,并突出显示跳过发生的代码行 带有可选的用户描述。有关跳过测试的信息是 也包含在 .xcresult 中以进行编程访问。

    要跳过测试,请从一个新的 XCTSkip* 函数中调用一个 测试方法或 setUp()。例如:

    func test_canAuthenticate() throws {
        try XCTSkipIf(AuthManager.canAccessServer == false, "Can't access server")
    
        // Perform test… 
    }
    

    XCTSkipUnless(::file:line:) API 类似于 XCTSkipIf(::file:line:) 但如果提供的表达式是则跳过 false 而不是 true,可以使用 XCTSkip API 跳过 无条件地。 (13696693)

    【讨论】:

      【解决方案2】:

      如果您使用 Xcode 11 和 TestPlan,您可以调整配置以跳过或允许特定测试。 Xcode TestPlan 毕竟是 JSON 格式。

      默认启用所有测试,您可以跳过测试列表或测试文件。

      "testTargets" : [
          {
              "skippedTests" : [
                  "SkippedFileTests", // skip the whole file
                  "FileTests\/testSkipped()" // skip one test in a file
              ]
          ...
      
      

      相反,您也可以默认跳过所有测试并仅启用少数测试。

      "testTargets" : [
          {
              "selectedTests" : [
                  "AllowedFileTests", // enable the whole file
                  "FileTests\/testAllowed()" // enable only a test in a file
              ]
          ...
      

      我不确定您是否可以将这两种配置结合起来。它基于Automatically includes new tests翻转逻辑。

      【讨论】:

        【解决方案3】:

        从 Xcode 11.4+ 开始,您可以使用 XCTSkipIf()XCTSkipUnless()

        try XCTSkipIf(skip condition, "message")
        
        
        try XCTSkipUnless(non-skip condition, "message")
        

        https://developer.apple.com/documentation/xctest/methods_for_skipping_tests#overview

        【讨论】:

          【解决方案4】:

          它不是那么通用,但是您可以在 XCTestCase 中覆盖 invokeTest 并避免在必要时调用 super。不过,我不确定控制台中的适当反馈。

          例如,以下片段使测试仅在带有 iPhone 7 Plus/iPad Pro 9.7"/iOS 11.4 的 iOS 模拟器上运行:

          class XXXTests : XCTestCase {
          
              let supportedModelsAndRuntimeVersions: [(String, String)] = [
                  ("iPhone9,2", "11.4"),
                  ("iPad6,4", "11.4")
              ]
          
              override func invokeTest() {
                  let environment = ProcessInfo().environment
                  guard let model = environment["SIMULATOR_MODEL_IDENTIFIER"], let version = environment["SIMULATOR_RUNTIME_VERSION"] else {
                      return
                  }
                  guard supportedModelsAndRuntimeVersions.contains(where: { $0 == (model, version) }) else {
                      return
                  }
                  super.invokeTest()
              }
          

          【讨论】:

            【解决方案5】:

            这就是测试计划的目的。 您可以针对不同的测试情况或需求制定不同的方案。 例如,您可能想要创建一个运行所有测试的方案(完整回归方案),或者您可能想要选择其中的一小部分在您的应用程序进行小的更改时进行快速冒烟测试。 这样,您可以根据需要进行多少测试来选择不同的方案。 去吧

            Product >> Scheme

            【讨论】:

              【解决方案6】:

              我在一些文章中找到的另一种可能的解决方案:在您跳过的测试前加上“skipped_”之类的前缀

              好处:

              • XCode 不会将它们视为测试
              • 您可以使用搜索轻松找到它们
              • 您可以再次对其进行测试,将“skipped_”替换为“”

              【讨论】:

              • 在我看来,这比通过 Xcode 禁用更容易发现,这使得禁用非常不可见。 +1
              【解决方案7】:

              您可以通过右键单击左侧编辑器托盘中的测试符号来禁用 Xcode 运行的 XCTests。

              您将获得此菜单,并且可以选择“禁用”选项。

              再次右键单击将允许您重新启用。此外,正如用户 @sethf 的回答中所述,您将在 .xcscheme 文件中看到当前禁用测试的条目。

              最后一点,我建议不要禁用测试并在 xcscheme 中提交禁用代码。测试注定要失败,而不是因为不方便而被静音。

              【讨论】:

              • 我觉得 Xcode 应该有一个语法来声明代码中禁用的测试,而不仅仅是通过 xcscheme 文件。
              【解决方案8】:

              我找到了一种方法,方法是修改我的 ui 测试 .xcscheme 文件并在 TestableReference 下添加一个名为 SkippedTests 的部分,然后添加带有“Identifier”属性的单个测试标签以及您的类和测试方法的名称。比如:

              <SkippedTests>
                     <Test Identifier="ClassName/testMethodName" />
              </SkippedTests>
              

              希望对你有帮助

              【讨论】:

                【解决方案9】:

                没有跳过测试用例。您可以使用 if-else block:nested 并运行/打印您想要的输出。

                【讨论】:

                  【解决方案10】:

                  不幸的是,没有内置的测试用例跳过。测试用例要么通过,要么失败。

                  这意味着您必须自己添加该功能 - 您可以通过将信息打印到控制台的类别将功能添加到 XCTestCase(例如 XCTestCase.skip)。但是,您必须在之后放置一个return 以防止其他断言运行。

                  【讨论】:

                    猜你喜欢
                    • 2010-10-24
                    • 1970-01-01
                    • 2011-05-22
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-06-09
                    • 2020-04-28
                    • 2015-12-31
                    • 1970-01-01
                    相关资源
                    最近更新 更多