34

我正在尝试在我的项目中实现一些 UI 测试。只要我保持简单,一切都很好:记录测试用例,添加一些断言,然后运行测试。这很好用,但是当我尝试从测试内部访问应用程序模块时,链接器会引发错误(见下文):

在应用程序源文件中:

func foo() {
   assert(true)
}

在 UI 测试中:

import XCTest
@testable import MyApp

func testExample() {
    foo()
}

错误:

体系结构 i386 的未定义符号:“MyApp.foo () -> ()”,引用自:MyAppUITests.MyAppUITests.testExample (MyAppUITests.MyAppUITests)() -> () in MyAppUITests.old:未找到符号架构 i386 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

架构 x86_64 的未定义符号:“MyApp.foo () -> ()”,引用自:MyAppUITests.MyAppUITests.testExample (MyAppUITests.MyAppUITests)() -> () in MyAppUITests.o ld:未找到符号架构 x86_64

我在这里报告了类似的问题: https ://forums.developer.apple.com/thread/20609 但没有解决方案。在我看来,@testable根本无法正常工作。developer.apple.com上的那个人试图通过在设置中添加测试主机和捆绑加载器来解决问题,但我认为这不是正确的方法。我认为@testable应该让一切正常工作,目前看起来不像。任何帮助表示赞赏!

4

3 回答 3

60

@testable import MainModule不适用于 UI 测试,尽管它会启用代码完成(可能会让您觉得它有效)。到目前为止,它仅用于单元测试。它会导致构建失败,例如:

ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

解决方法是将源代码文件也添加到 UI 测试目标,然后它会开箱即用(即使没有@testable import.

File Inspector -> Target Membership -> 检查UI 测试目标(除了主要目标)

希望 Apple 能尽快修复它,以便我们有更清洁的方式来使用它。

于 2016-04-13T19:30:25.093 回答
6

UI 测试是独立于应用程序的模块,因此不会像逻辑测试那样在应用程序内运行。他们共享代码的唯一方法是编译您需要在两个模块之间共享的所有应用程序文件。查看此博客以了解如何实现这一目标,https://www.bignerdranch.com/blog/ui-testing-in-xcode-7-part-1-ui-testing-gotchas/

还在这里找到了一个雷达,https://openradar.appspot.com/23116258

于 2015-11-30T10:06:30.567 回答
2

@testable import <yourApp>实际上可能导致此错误。把线拿出来就行了。UI 测试不需要它。

“UI 测试在您的应用程序外部以单独的进程运行。您无法从 UI 测试内部访问应用程序代码 - 这是设计的有意的一部分。对需要访问应用程序代码的测试和 UI 测试使用单元测试来自动化用户交互测试"

请注意,在 6 分钟后,Apple 开发人员不再使用 @testable。https://www.youtube.com/watch?v=7zMGf-0OnoU&t=1316s

于 2017-08-03T09:04:45.590 回答