在测试运行时,如何在Xcode UI测试中模拟网络请求?

时间:2016-04-21 11:56:47

标签: ios xcode-ui-testing

我们为使用KIF编写的应用程序提供了一套UI测试,我希望将其转换为使用新的Xcode UI测试框架。

该应用程序是Rest AI的客户端,我们当前正在通过使用NSURLProtocol来响应GET,POST,PUT等提供预定义的JSON文件进行模拟...所有测试都是使用这些文件中的数据,所以我想继续使用它们。服务器上的相同端点在测试中的不同点返回不同的数据,因此我无法预先模拟它们,我需要能够在测试运行时调用方法来模拟服务器'下一步回应。

不幸的是,在Xcode UI测试中使用NSURLProtocol并不会影响测试的应用程序,我只看到了通过启动参数或环境向应用程序发送数据的方法,例如在{{3}中}。我需要在测试期间的不同阶段以不同的方式模拟它们。如何以在测试期间发生变化的方式模拟UI测试中的网络请求?或者我如何与正在测试的应用程序通信,以便我可以让它来模拟请求本身?

3 个答案:

答案 0 :(得分:4)

我们在纯Swift中开发了一个嵌入式HTTP服务器,您可以在测试用例中使用简单的模拟响应处理程序运行HTTP服务器,然后通过环境变量API_BASE_URL将URL传递给目标应用程序。我写了一篇关于如何做的文章

Embedded web server for iOS UI testing

基本上有两个库,一个是Embassy,它是简单的异步HTTP服务器。另一个是Ambassador,一个用于模拟API端点的简单Web框架。

答案 1 :(得分:2)

我们一直面临着尝试从KIF迁移到UI测试的完全相同的问题。为了克服关于存根和模拟的UI测试的限制,我们使用在应用程序上实例化的Web服务器在应用程序和测试代码之间构建了自定义链接。测试代码将HTTP请求发送到应用程序,该请求可以方便地转换为存根请求(OHHTPStub),NSUserDefault更新,上传/下载项目到应用程序或从应用程序下载项目。当您需要检查特定端点是否被调用时,甚至可以开始监视网络呼叫。如果您觉得缺少某些功能,添加新功能应该相当简单。

使用该库非常简单,请查看我们的github repo

答案 2 :(得分:-1)

您可以使用OHHTTPStubs模拟它们,也可以编写自己的存根。

简而言之,您应该使用NSURLSession子类存根请求,并将存根NSURLSession注入您的网络层。 launchEnvironment属性可能有助于将模拟的URL传递给测试。