在 UI 测试中将模拟数据插入 Core Data

Posted

技术标签:

【中文标题】在 UI 测试中将模拟数据插入 Core Data【英文标题】:Insert mock data into Core Data in UI Test 【发布时间】:2017-02-16 21:25:56 【问题描述】:

我的应用程序目前正在使用 Core Data 作为持久性,我想用一些模拟数据进行一些 UI 测试。目前,我正在使用之前在开发过程中存储的数据运行 UI 测试。理想情况下,我想在 MOC 中插入一些模拟数据,以允许我编写更多 UI 测试。对于我的单元测试,我将 JSON 文件中的数据插入到 setup 函数中的托管对象上下文中。我想知道这是否可以用于 UI 测试?

我曾尝试在网上查找此内容,但我从人们那里阅读了很多不同的答案,以至于我现在感到困惑。如果这不可能,谁能推荐使用核心数据进行 UI 测试的最佳实践?

【问题讨论】:

【参考方案1】:

无法在您的 UITest 类中创建模型数据,因为 UITest 类无法访问您应用的代码。

来自Apple's Docs:

UI 测试在根本上不同于单元测试。单元测试 使您能够在应用程序的范围内工作并允许您锻炼 可以完全访问您的应用程序变量的函数和方法,以及 状态。 UI 测试以与用户相同的方式练习您的应用程序的 UI 无需访问您应用的内部方法、函数和 变量。这使您的测试能够以与用户相同的方式查看应用程序 确实,暴露了用户遇到的 UI 问题。

如果您想在运行 UITests 时使用模拟数据,您必须在应用代码中创建模拟数据,然后确保仅在运行 UITests 时创建模拟数据。

要完成这项工作,您必须执行以下步骤:

1) 在 UITest 类中启动应用时添加启动参数:

func testExample() 
    let app = XCUIApplication()
     app.launchArguments.append("IS_RUNNING_UITEST")
     app.launch()
     // Do your tests

2) 将创建模拟数据的代码添加到您的应用中(例如,在您的 AppDelegate 中)并在存在启动参数时运行它:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
    if ProcessInfo.processInfo.arguments.contains("IS_RUNNING_UITEST") 
        // insert data from a JSON file into the managed object context
    

【讨论】:

这样,我还可以自定义每次测试运行的数据。例如,我可能需要重新开始,或者我可能需要提供特定的数据——我只是为我需要的任何东西设置了一个不同的参数。不错!

以上是关于在 UI 测试中将模拟数据插入 Core Data的主要内容,如果未能解决你的问题,请参考以下文章

如何在UI测试中将照片添加到模拟器的相机胶卷

Core Data 在 Swift 中将数据添加到关系中

在 Core Data 中将“默认”数据与用户提供的数据混合在一起

如何在 Swift 中将可转换属性保存到 Core Data

如何对 CloudKit/Core Data 进行单元测试?

如何在 Swift 中将 Core Data 与 Cloudkit 和许多设备同步