如何修改 UI 测试的应用生成



我正在使用XCUITests来UI测试我的应用程序。应用当前在主应用目标(在 AppDelegate 内部)中读取ProcessInfo.processInfo.environment,以覆盖其某些设置,以便更适合 UI 测试。例如禁用 UI 动画、覆盖 API 端点等。

但是,我希望我的应用程序的发布版本没有这些覆盖,并且只有在实际构建用于 UI 测试的应用程序时才包含这些测试钩子。

实现这一目标的最佳方法是什么?

例如,是否有预处理器定义,我只能在构建用于 UI 测试的应用时用于包含代码?或者,如果为 UI 测试而构建,我只能包含源文件吗?

这个ProcessInfo.processInfo.environment应该在实际应用程序中real,你应该从XCUITests内部mock测试环境中。 你可以让它成为某种protocol.并在应用程序中真正实现它,并在测试中作为模拟对象。

例如,在您的应用程序委托中:

protocol ProcessInfo {
var processId: UInt? { get set }
var processName: String? { get set }
...
}

然后,在任何需要 ProcessInformation 的函数中,不要使用单一实例,而是将其传递给您的函数。

func doSomethingWithYourProcessInfo() {
ProcessInfo.shared.doSomething() // DON'T DO THAT
}

func doSomethingWithYourProcessInfo(_ p: ProcessInfo) {
p.doSomething()
}

然后在应用委托本身中: 在单例对象中采用此协议,然后将其传递给函数。

在测试中 在另一个单例(在XCUITests内部)中采用此协议,然后将其传递给您的函数。

在要测试的应用目标的构建设置中,添加自定义编译器标志,例如-D UI_TESTS- 这将使您能够在编译时使用预处理器宏来筛选代码路径。

#if UI_TESTS
// do UI Test code path...
#endif
// normal codepath...

有关更多指导,请参阅本文中的"更进一步"部分。

最新更新