如何修改UI测试的应用程序构建

时间:2018-02-16 12:06:19

标签: xcode xcode-ui-testing xcuitest

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

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

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

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

2 个答案:

答案 0 :(得分:0)

这个ProcessInfo.processInfo.environment应该是真实应用中的real,您应该在XCUITests 中的mock上测试环境。你可以使它成为某种protocol。并在应用程序中实现它,并作为测试中的模拟对象。

例如,在你的AppDelegate中:

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

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

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

使用

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

然后在app中委托自己: 在单个对象中采用此协议,然后将其传递给您的函数。

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

答案 1 :(得分:0)

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

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

请参阅“进一步采取措施”一节'在this article获取更多指导。