使用Xcode 7 UI Automation模拟对象

gag*_*wal 13 xcode unit-testing ios kif xcode7

到目前为止,我正在使用KIF Framework进行iOS UI自动化.KIF(也是单元测试)目标在与应用程序运行相同的过程中运行单元/ UI测试代码,我们可以轻松模拟应用程序使用的不同对象/类来显示模拟数据.

当切换到基于Xcode 7的新UI自动化时,我发现UI单元测试目标在单独的进程中运行,并且它在单独的进程中启动应用程序.因此,无法通过单元测试访问App类/对象并模拟它们.

有没有人面临同样的问题,并了解任何解决方法?

如果需要更多细节,请告诉我.

答:请参阅下面的详细答案.此处还有来自Apple开发者的回复链接:https://forums.developer.apple.com/thread/23552

Cha*_* A. 11

因为您在不同的进程中运行,所以没有办法通过测试将mocks注入您的应用程序.话虽如此,您确实可以控制应用程序的进程,因此可以对其产生一些影响.

我已经来回了解我对此的看法(我目前尚未决定),但您可以在应用中添加一些代码来读取环境变量(通过NSProcessInfo),使应用程序的行为不同(即更改内容你的依赖注入是注入你的类,所以它使用模拟).

这样做的缺点是模拟代码没有严格包含在测试包中,并且您最终会在应用程序中使用该代码(除非您使用#if语句来隔离它).显然,谨慎处理代码分支也很重要,因此不要使测试无效.

您可以在UI测试中启动应用程序之前设置环境变量:

let app = XCUIApplication()
app.launchEnvironment = ["UITestUseMocks" : "true"]
app.launch()
Run Code Online (Sandbox Code Playgroud)

然后在您的应用程序中,您可以检查,可能在#if声明中并更改您的行为:

#if TEST_TARGET
    if let useMocks = NSProcessInfo().environment["UITestUseMocks"] where useMocks == "true" {
        // Alter services used in dependency injection or some other testing behavior
    }
#endif
Run Code Online (Sandbox Code Playgroud)

我一直在考虑这种方法来实现一个模拟服务层,它只是重放一些罐装服务器响应,所以我可以让我的UI测试不依赖于服务器响应(毕竟其他东西测试服务器).