到目前为止,我一直在使用KIF Framework进行iOS UI自动化。KIF (也是Unit Test)目标在与应用程序运行的相同进程中运行Unit/UI测试代码,我们可以轻松地模拟应用程序用来显示模拟数据的不同对象/类。
当切换到基于Xcode 7的新UI自动化时,我发现UI单元测试目标在单独的进程中运行,它在单独的进程中启动应用程序。因此,不可能通过单元测试访问App类/对象并对它们进行模拟。
是否有人面临同样的问题,并知道有什么解决办法?
如果需要更多的细节,请告诉我。
答:请参阅下面的详细答案。这里还有来自Apple的回复链接:https://forums.developer.apple.com/thread/23552
发布于 2015-10-23 20:20:37
因为您是在不同的进程中运行,所以没有一种方法可以通过测试将模拟注入到应用程序中。话虽如此,你还是可以控制你的应用程序的过程,从而对它产生一些影响。
我反复讲述了我对此的感受(目前我还没有决定),但是您可以在应用程序中添加一些代码,通过NSProcessInfo读取环境变量,从而使应用程序的行为有所不同(也就是说,更改您的依赖项注入到类中的内容,使其使用模拟)。
这样做的缺点是,模拟代码并不严格地包含在测试包中,最终会在应用程序中得到该代码(除非您使用#if语句来隔离它)。显然,谨慎处理代码分支也很重要,这样就不会使测试无效。
您可以在UI测试中启动应用程序之前设置一个环境变量:
let app = XCUIApplication()
app.launchEnvironment = ["UITestUseMocks" : "true"]
app.launch()然后,在您的应用程序中,您可以检查这一点,可能是在#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我一直在考虑这种实现模拟服务层的方法,它只是重放一些固定的服务器响应,这样我就可以使UI测试不依赖于服务器响应(毕竟,其他东西会测试服务器)。
https://stackoverflow.com/questions/33266957
复制相似问题