【问题标题】:Get the name of the unit test class in the ios host application获取ios宿主应用中单元测试类的名称
【发布时间】:2021-07-26 02:59:00
【问题描述】:

我正在使用标准的 XCTestCase 类与宿主 ios 应用程序一起实现和触发单元测试。 是否可以将单元测试(XCTestCase 子类)中的一条信息传递给宿主应用程序,并在宿主的 main.m 中读取此信息?

XCUIApplication().launchArguments 不适合我。在构建设置中添加值也不是解决方案。

我需要根据 XCTestCase 的子类更改宿主应用程序的行为。

被测类(XCTestCase 的子类)受宿主的 App Delegate 类影响。我想实例化一个不会影响被测类的特殊 AppDelegateFake 类(在 main.m 中)。

可以检测宿主应用程序是否使用单元测试集运行并实例化一个特殊的假测试应用程序委托类: https://marcosantadev.com/fake-appdelegate-unit-testing-swift/

但是这样我就必须使用这个假的应用程序委托进行 ALL 测试(XCTestCase's)。

如果在宿主应用程序中有这样的东西会很好:

let isRunningTests = NSClassFromString("XCTestCaseSubclassXY") != nil

但不幸的是,这是不可能的。我还试图以某种方式获取 XCTestConfiguration 的实例,其中包含正在运行的 XCTestCase 名称,但同样不可能。

谢谢。

【问题讨论】:

  • 你能更详细地解释你的问题是什么吗?据我了解,应用程序应该独立于其测试。即使您的应用具有测试驱动设计,也没有必要根据当前测试更改应用的行为。
  • @ReinhardMänner 感谢您的回复。我已经更新了帖子。
  • 现在我明白了。我这样做,在我的XCTestCase 子类中使用XCUIApplication().launchArguments = "-isUITesting",在我的main.swift 文件中使用let isUITesting = ProcessInfo.processInfo.arguments.contains("-isUITesting“)。你提到这对你不起作用。为什么?会发生什么?
  • @ReinhardMänner 原则上,这是我所要求的,这是不可能的。对于单元测试,有一个正在运行的应用程序的主机实例。另一方面,对于 UI 测试,每次都会加载一个专用应用程序 - 并且可以使用 XCUIApplication().launchArguments 进行配置
  • 所以在测试运行时你想要一个不同的 App Delegate,对吗?您的应用是否使用场景委托启动?

标签: unit-testing xctestcase


【解决方案1】:

按照我的要求,原则上是不可能的。对于单元测试,有一个正在运行的主机应用程序实例。另一方面,对于 UI 测试,每次都会加载一个专用的应用程序实例 - 并且可以使用 XCUIApplication().launchArguments 进行配置

【讨论】:

    【解决方案2】:

    我通常在测试中包含TestingAppDelegate。当单元测试运行时,它们会在启动前被注入到正在运行的应用程序中。因此生产代码可以检查TestingAppDelegate 的存在并决定使用哪个应用代理。

    在我有一个替换应用委托的用例中,我在 main.swift 中执行以下操作:

    let appDelegateClass: AnyClass =
        NSClassFromString("TestingAppDelegate") ?? AppDelegate.self
    

    这会搜索具有给定名称的类,如果存在则使用它。否则,它会退回到常规生产代码AppDelegate。然后我用它来启动应用程序:

    UIApplicationMain(
        CommandLine.argc,
        CommandLine.unsafeArgv,
        nil,
        NSStringFromClass(appDelegateClass)
    )
    

    但这种技术不适用于使用场景委托启动的应用,因为场景在启动之间被缓存。

    我无法想象您为什么需要多个应用委托来进行测试。如果要在启动时配置不同的设置,我会在“测试”部分的“参数”选项卡“启动时传递的参数”中的方案级别指定这些设置。然后TestingAppDelegate 可以从UserDefaults 中读取这些参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 2014-10-09
      • 2017-01-27
      • 1970-01-01
      • 2011-12-09
      相关资源
      最近更新 更多