我该如何从UI测试中访问我的Swift类?

10

我有一个UI测试,如下:

    func testHome(){
         if(isRedOrange.clear()){
                //code
            }
    }

我该如何从我的UI测试中访问isRedOrange.swift文件中的isRedOrange.clear功能?

可能是 https://dev59.com/XFoU5IYBdhLWcg3wK0pX 的重复问题。 - matt
4个回答

24

UI测试是黑盒测试,因此您无法访问代码

您可以在单元测试中使用@testable import,这样就可以提供完全访问权限。 但是,在运行UITests时,这种方法不起作用,因为在UITest期间,您的测试类不能访问应用程序的代码。

来自Apple文档:

  

UI测试在根本上与单元测试不同。单元测试使您能够在应用程序的范围内工作,并允许您使用完全访问应用程序变量和状态的函数和方法。 UI测试以用户相同的方式练习您的应用程序UI,而没有访问应用程序的内部方法、功能和变量。这使得您的测试能够像用户一样查看应用程序,暴露用户遇到的UI问题。

您必须使用元素上的.tap()来完成所有操作。.accessibilityIdentifier将帮助您获取正确的元素。


1
我很惊讶于不能从测试套件中定义应用程序的数据或流程。苹果似乎在推动人们进行集成测试,而我想编写基于提供的视图模型测试应用程序UI部分的原子测试,并且如果我恰好更改应用程序流程,我不想重新编写我的查询。 - Olivier Butler

9
前往项目设置 -> 选择uitests目标 -> 构建阶段选项卡 -> 将您的Swift文件添加到编译源中。

5
明白了,翻译如下:那行得通。我只是想使用一些现有的模型结构来传递一些测试数据。 - David Mayes
1
我在想这是否真的有效。据我所知,Ui测试和应用程序就像并行运行的两个不同应用程序。那么,将文件添加到第二个应用程序中是否会消除语法错误?是的...但这会对主应用程序产生任何影响吗?这难道不只是在“ui项目”中执行代码,而不会对我们正在测试的应用程序产生任何影响吗? - João Serra
1
@JoãoSerra 是正确的。UI测试和应用程序是分开编译的,因此测试无法直接调用应用程序中的函数。但是,您可以将源代码提供给应用程序和测试(如此答案所解释的)。然后,测试和应用程序可以共享算法和数据结构。尽管如此,它们仍然是分别运行的。 - saintamh
另一种方法是打开特定的文件以供测试目标使用,进入文件检查器(Xcode的右侧面板),然后在目标成员资格下勾选测试目标。 - Dan
@Dan 如果我这样做,会出现构建错误"未定义的符号: ..."。 - acmpo6ou
显示剩余2条评论

3

您需要把主模块(项目)导入到测试中:

  • 确保您在主项目目标的Build Settings中设置了ENABLE_TESTABILITY为true。

enable_testability

  • 要将其导入测试中,在您的UITests文件中调用@testable import MAIN_TARGET_NAME

enter image description here


我正在使用Swift。 - Helosy
没有这个模块'InternetAvailability.swift'。 - Helosy
与使用import UIKit导入模块UIKit的方式相同,您将使用@testable import YOUR_APP来导入您的主目标。此外,如果您只有一个全局函数func clear(),则只需使用clear()调用它,而不需要在Swift中调用文件名。 - S2dent
你的目标名称是什么?不是Swift文件,而是Xcode中的目标? - S2dent
8
这适用于单元测试,但不适用于 UI 测试。 - Nicolas Miari
显示剩余3条评论

-2
这个问题没有意义。在UI测试中,您无法访问应用程序的任何代码。如果要访问代码,请编写单元测试。

在我的情况下,我需要模拟NSOpenPanel以在UI测试中提供一致的输出,因此我定义了一个协议并扩展了NSOpenPanel来采用它。我还在我的UI测试目标中定义了一个模拟类,该类也采用了该协议。协议定义需要对应用程序和UI测试都可用。我只是将协议移动到自己的源文件中,并将其“目标成员资格”设置为应用程序和UI测试。 - Nicolas Miari
等等,我意识到无论如何也不能从UI测试目标注入我的模拟类...我必须想办法从应用程序本身确定我是否正在接受UI测试(并使用NSOpenPanel或模拟其行为和返回的URL)。应用程序代码确实无法从UI测试目标访问。这完全有道理,因为UI测试基于macOS的可访问性功能... - Nicolas Miari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接