如何从 Xcode UI 测试访问核心数据存储?

Posted

技术标签:

【中文标题】如何从 Xcode UI 测试访问核心数据存储?【英文标题】:How can I access a core data store from an Xcode UI test? 【发布时间】:2016-04-21 13:45:09 【问题描述】:

我们有一套使用 KIF 编写的应用程序的 UI 测试,我想将其转换为使用新的 Xcode UI 测试框架。

我们目前的一些测试是这样工作的:

Assert that there are no objects in a core data table
Do some stuff in the UI
Assert that there are some objects in the core data table
Cancel the thing we were doing in the UI
Assert that there are no leaked objects in the core data table

我需要查看实际的核心数据存储,而不仅仅是 UI,因为泄露的行不一定会显示在 UI 中。

【问题讨论】:

@import 可测试您的模块,然后直接访问核心数据存储(就像您在应用程序中一样) @ogres 我不知道那是什么意思。这是一件快事吗?我的应用和测试都是 Obj-C。 【参考方案1】:

答案是你不能,而不是不滥用信号。 XCUITests 不打算接触金属;它们仅用于练习面向用户的行为。

不过,您描述的测试听起来非常适合单元测试!

更新:

(基于 OP 的 cmets)

嗯,据我所知,你有四个选择

    您可以创建一个反向通道,该通道将使用传递的信号来中断 XCUITest 和应用程序内部的分离。 你可以 构建功能以在单元测试中模拟 UI 交互 以便您可以针对副作用进行验证。 您可以添加一个 断言,然后手动执行它。 您可以提交雷达 要求功能。

【讨论】:

不幸的是,它不适合单元测试 - 我想测试由开始创建具有子对象的对象然后取消创建所涉及的 UI 步骤引起的事物组合不不要留下孤儿。 好吧,据我所知,您有四个选择。 1 - 您可以创建一个反向通道,该通道将使用传递的信号来打破 XCUITest 和应用程序内部之间的分离。 2 - 您可以构建功能来模拟单元测试中的 UI 交互,以便您可以针对副作用进行验证。 3 - 您可以添加一个断言,然后手动执行它。 4 - 您可以提交雷达请求功能。 ;)【参考方案2】:

您可以轻松地针对 Core Data 进行测试,但您描述的测试没有多大意义。如果您取消 UI 操作,那么 Core Data 不会保存到磁盘。当您提到“表”时,对我来说这意味着您正在查看磁盘。

如果你想加载一个空的 Core Data 存储,创建一些对象,验证它们是否被创建,删除它们并确认它们被删除;这些都可以在 UI 测试中完成。

    开始时不存储在磁盘上(或使用内存中的存储) 运行 UI 测试 对 Core Data 进行提取并确认对象在内存中 执行您的取消代码 确认代码已从 Core Data 中删除。

你对哪一部分有问题?

【讨论】:

问题是我无法从 UI 测试访问核心数据存储,因为新的 Xcode UI 测试在不同的应用程序中运行。据我所知,主机应用程序无权访问托管应用程序的数据。我们当前基于 KIF 的测试没有这种限制,它们按照您的描述运行。

以上是关于如何从 Xcode UI 测试访问核心数据存储?的主要内容,如果未能解决你的问题,请参考以下文章

从 XCode UI 测试目标访问项目文件

如何通过 UI 测试(Xcode 12、iOS14)访问推送通知?

XCode 7 UI 测试 - 可用的操作

如何从 Swift 中每个 UI 测试断言的空核心数据开始?

如何从 XCTest 中的 UI 目标调用主目标中的方法?

如何在 Xcode UI 测试中获得授权部分