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

Posted

技术标签:

【中文标题】如何从 XCTest 中的 UI 目标调用主目标中的方法?【英文标题】:How to call a method in main target from UI target in XCTest? 【发布时间】:2017-03-27 07:44:09 【问题描述】:

在问这个问题之前,我应该说一下。我对 Xcode 中 UI 测试的理解:

UI 测试仅用于自动化 UI 工作流程 最终用户无法访问原始源。同理,UI Tests 也无法访问应用的源代码 在 UI 测试用例中只能访问元素属性/标识符。

我的场景:

我想在我的 UI 测试用例的源代码中调用视图控制器(例如 MyVC.h/MyVC.m)中的一个方法(例如 myMethod())。

注意:我的源代码是用 Objective C 编写的,我正在用 Swift 编写测试用例。

据我了解,要做到这一点,我也应该在 UITest 目标中添加MyVC.m(我们不能将 .h 添加到目标中)。然后我需要在我的 UITest 桥接文件中导入MyVC.h。然后我可以像这样从 UITest 调用myMethod()

MyVC.myMethod()

它会起作用的!

问题:

大多数类实时使用 Util 类、常量文件(头文件)、从 .pch 文件导入的类、共享管理器等。

如果MyVC是一个独立的类,意味着不使用上述任何一个类,我可以毫无问题地访问myMethod()

但是,如果MyVC 间接使用这些类,则运行 UITest 会在所有源代码中显示缺少头文件错误。

我尝试了什么:

为了解决这个问题,我通过将所有源文件添加到 UI 目标中进行了测试。仍然会发生这些问题。由于我无法添加 .h 文件 我创建了单元测试类,我可以在其中调用任何类的方法(因为单元测试类有一个选项“允许测试主机应用程序 API”)。然后我尝试从 UI 测试用例访问单元测试用例。在这里,每个文件中也会发生相同的错误。

问题:

我应该在主源的所有文件中添加所有需要的文件头吗?

有人遇到过这种错误吗?有没有人通过 UI 测试完成 DB 访问?

【问题讨论】:

看看这个答案***.com/questions/34771278/… 您为什么要从 UI 测试访问应用程序代码?你的测试场景是什么? 【参考方案1】:

两件事:

您问题的后半部分似乎涉及构建问题。对于那些,是的,您需要目标中的所有依赖项。 问题的标题询问有关从 UI 测试调用测试应用程序中的方法。 UI 测试在与应用程序不同的进程中运行,因此您不能只访问应用程序中的对象。您需要通过添加可访问的 UI 来在带内移动触发器,或者安装一个侧通道,这可能使用本地套接字来实现。

我认为第二点可能对您的需求无关紧要,因为从关于从 UI 测试中访问数据库的那一点来看,听起来您不需要应用程序中的特定对象,只需该类的对象即可获取某些出于某种原因在其上声明的数据库访问方法。为此,只需能够在类中编译并实例化并发送消息就足够了。 (不过,通过将这些与 DB 相关的方法分解到非 UI 类中,您仍然可以让您的生活更轻松。)

【讨论】:

@jeremy-w-sherman 关于 UI 测试中的本地套接字,您有任何示例或知识可以分享吗?将这样的东西集成到 ios UI 开发工作流程中会非常有趣。

以上是关于如何从 XCTest 中的 UI 目标调用主目标中的方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 XCTest 中的方法 - 仅在目标 C 中

在非测试目标中使用 XCTest

如何从 UI Xctest 调用 Appdelegate 的“OpenURL”功能

在 XCTest 中:如何测试函数是不是强制执行到主线程

如何在 Xcode 中配置和运行目标 C 测试用例--XCTest

如何通过与 swift/xctest 协调来点击 iOS 主屏幕上的某个点