0

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

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

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

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

4

2 回答 2

0

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

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

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

于 2018-02-17T11:17:57.573 回答
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()
}

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

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

于 2018-02-16T12:15:49.840 回答