XCTest:如果我只是对测试目标进行更改,如何防止 Xcode 不必要地重新编译我的项目

Posted

技术标签:

【中文标题】XCTest:如果我只是对测试目标进行更改,如何防止 Xcode 不必要地重新编译我的项目【英文标题】:XCTest: How do I prevent Xcode from needlessly recompiling my project if I'm only making changes to my test Target 【发布时间】:2019-09-25 15:00:48 【问题描述】:

就源文件的数量和代码行而言,我的 Xcode 项目非常庞大。 当我只更改 XCTest 代码并在单个测试、单个测试文件甚至整个测试套件上运行时,Xcode 首先重新编译我的主机应用程序,即使主机应用程序中没有任何文件发生更改.每次我对任何测试文件进行任何更改时都会这样做。

这对编写测试提出了效率挑战,因为测试代码中的小调整需要很长时间才能重新运行和重新验证。 (每次运行超过 3 分钟 - 是的,这是一个很大的项目,我们已经采取了许多措施来减少构建时间,通过检查构建日志等......)

在 Swift 4.2 中使用 Xcode 10.3

测试正在使用:

@testable import MyModuleName

如果我只更改了测试,有没有办法阻止 Xcode 重新构建整个项目?

【问题讨论】:

【参考方案1】:

我发现了问题。

我们在项目的构建阶段部分下有一些自定义脚本,它们实际上更改了代码库中的一些可编译资产。我们还有一个 Carthage 依赖复制阶段。

从构建阶段注释掉这两个阶段可以使整个项目在仅更改测试时不会重新编译。这些脚本实际上是对可编译代码进行更改,使 XCode 强制重新编译。

故事的寓意:检查您的构建阶段是否有任何可能修改您的源代码的步骤,包括可能是目标一部分的资源文件。将来我们将尝试以更自动化的方式执行此操作,而无需注释掉这些构建步骤。

【讨论】:

对于运行脚本的构建阶段,出于这个原因,我们必须显式添加输入/输出文件或文件列表。

以上是关于XCTest:如果我只是对测试目标进行更改,如何防止 Xcode 不必要地重新编译我的项目的主要内容,如果未能解决你的问题,请参考以下文章

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

现有项目的 XCTest

iOS:使用 XCTest 对 UIViewController 组件进行单元测试

XCTest 更改队列

XCTest 不会从我的目标应用程序链接类

如何使用 XCTest 测试线程安全性