我正在使用XCUITests
来测试我的应用。该应用程序当前在主App目标(AppDelegate内)中读取ProcessInfo.processInfo.environment
以覆盖其某些设置,以便更适合UI测试。例如禁用UI动画,覆盖API端点等
但是,我希望我的应用程序的发布版本没有这些覆盖,只有在实际构建用于UI测试的应用程序时才包含这些测试钩子。
实现这一目标的最佳方式是什么?
例如,是否有一个预处理器定义,我只能在构建用于UI测试的应用程序时包含代码?或者,如果构建用于UI测试,我是否只能包含源文件?
答案 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获取更多指导。