【问题标题】:Running individual XCTest (UI, Unit) test cases for iOS apps from the command line从命令行为 iOS 应用程序运行单个 XCTest(UI、单元)测试用例
【发布时间】:2016-05-12 00:14:59
【问题描述】:

是否可以从 iOS 应用测试目标而不是所有测试用例从命令行界面运行单个测试用例或单个测试套件?

您可以使用xcodebuild 从命令行运行测试,开箱即用。当您这样做时,您将运行您选择的测试目标中包含的所有测试用例。

您也可以使用来自 Fastlane 的 scan 执行此操作,但我相信您只能运行您选择的构建方案的所有测试(如上所述),因此它与 xcodebuild 没有什么不同。

您可以使用来自 Facebook 的 xctool 运行特定测试,但它不使用 xcodebuild,并且仅限于在模拟器上运行,而不是在实际的 iOS 测试设备上运行。

我找到了直接运行xctest 命令行实用程序的参考,但它似乎是一个未记录的功能并针对DerivedData。 UI 测试 have their *xctest files in a separate XCTRunner bundle.

【问题讨论】:

  • 你应该有一个使用 xctool 的示例来运行特定的 UI 测试吗?
  • @emoleumassi xctool 具有“-only”选项,可让您指定一次运行的单个测试文件(套件)和测试方法(案例)。它适用于单元测试,我认为它适用于 UI 测试。不过我自己没有尝试过,因为我需要一个测试解决方案才能在真实设备上运行,而不仅仅是在模拟器上,所以 xctool 不是一个解决方案。
  • xctool 不支持 UI 测试,请看这个答案:stackoverflow.com/questions/35181126/…
  • 感谢您的提醒。我原以为可以像运行单元测试一样触发 Xcode UI 测试,但我想我错了。

标签: ios unit-testing xctest xcode-ui-testing


【解决方案1】:

现在可以在 Xcode 8 中使用 -only-testing 参数和 xcodebuild

xcodebuild test -workspace <path>
                -scheme <name>
                -destination <specifier>
                -only-testing:TestBundle/TestSuite/TestCase

【讨论】:

  • 完美。感谢您的屏幕截图。还值得一提的是,这对我来说是个新闻,我们还有新的 xcodebuild 操作来拆分原始 test 操作的组件 - 即 build-for-testingtest-without-building。如果您想多次运行测试而无需每次都构建开销,则后者很方便。如果您需要,也非常适合与 Maven 生命周期阶段保持一致。
  • xcodebuild test -workspace &lt;path&gt; -scheme &lt;name&gt; -destination &lt;specifier&gt; -only-testing:TestBundle/TestSuite/TestCase
  • 是否可以使用星号进行过滤?
【解决方案2】:

运行单个测试

要运行单个测试用例,您可以使用-only-testing

-only-testing 模式

-only-testing:<target>/<class_name>/<test_name>

xcodebuild 模式

xcodebuild test 
-workspace "<name>.xcworkspace"  
-scheme "<name>" 
-destination '<options>' 
-only-testing "<test_case>"

例子

//for example(several test cases)
xcodebuild test 
-workspace "MyApp.xcworkspace"
-scheme "MyAppTest" 
-destination 'platform=iOS Simulator,name=iPhone 11 Pro Max,OS=13.5' 
-only-testing "MyAppTest/TestClass/foo"
-only-testing "MyAppTest/TestClass/foo2"

例如,如果Test Navigator 看起来像

参数将具有以下类型

-only-testing:F49088168M_OBDIITests/HexUtilityTests/testHexToBinStringFormat

如果您想添加一个额外的测试用例,您可以再添加一个-only-testing

您也可以使用以下方式跳过测试:-skip-testing

测试结果你可以在Derived Data[About]找到

<derived_data>/<project_name>-dzqvyqfphypgrrdauxiyuhxkfxmg/Logs/Test/Test-<target_name>-<date>.xcresult

[Xcode screenshot]

【讨论】:

    【解决方案3】:

    我的情况与您类似,并且构建了一个 python 脚本来触发我想要的一组测试用例。这是一个有点复杂的过程,但对我有用,并且随着时间的推移在实现 DataProvider 方法、重新运行失败的测试用例和我需要的其他自定义方面非常有用。

    您想要实现的一些相关步骤。

    1. 覆盖 XCTestCase 中存在的 testInvocations 方法以执行以下步骤
      • 在这种方法中,我读取了环境变量 XXXX。
      • 这个环境变量基本上是一个逗号分隔的测试用例方法名。
      • 现在为您要触发的每个测试方法创建 NSInvocations。
      • 返回调用数组。
    2. 如何传递环境变量?
      • 在方案中添加一个名为 XXXX 的环境变量。
      • 方案文件是标准的 xml 文件,编写一个脚本来修改方案文件以在环境变量中包含逗号分隔的值。

    如果您需要更多信息,请添加评论,我会回复。

    【讨论】:

      【解决方案4】:

      您可以编辑方案以仅运行特定测试。选择方案,然后编辑方案。在出现的窗口中,选择测试阶段并禁用/启用单个测试。

      您还可以添加方案来运行测试子集。从命令行运行测试时,您可以指定用于测试的方案(至少在 fastlane 中)。

      【讨论】:

      • 对于 100 个测试子集,您将有 100 个方案。没有好的模拟器。我更喜欢另一个带环境变量的。
      【解决方案5】:

      要运行单个测试或测试类,您可以单击装订线中它旁边的菱形。如果您打开它们,它就在显示行号的位置旁边。

      在此屏幕截图中,我的鼠标悬停在钻石上。注意它是如何变成一个小的播放箭头来指示它会运行的。

      然后您可以使用 ⌃⌥⌘ G 重新执行最近运行的测试。

      据我所知,这无法通过xcodebuild 完成。

      【讨论】:

      • 我已经澄清了最初的问题。我的主要意图是询问是否可以从命令行触发单个测试用例,因此可能存在仅调用测试子集而不是整个目标的持续集成。
      • 查看@dasdom 的回答。 Swift 邮件列表中正在进行一些讨论,旨在添加这个确切的功能。
      • 虽然您没有回答 OP 的问题,但这正是 我的 问题,非常感谢您的回答!
      猜你喜欢
      • 2014-03-20
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 2011-03-18
      • 1970-01-01
      相关资源
      最近更新 更多