使用Vapor Server Side Swift框架存根XCUITests

最初在XCBlog上发布在这里

毫无疑问,Swift是用于为iOS,macOS,watchOS和tvOS等Apple平台开发本机应用程序的出色语言。 但是,作为一种新语言,Swift缺少许多测试功能,就像我们在其他编程语言(如Ruby)中看到的那样。 在Swift中使用协议模拟类非常困难,并且存根网络请求的选项非常有限。 模拟是脆弱而艰苦的,到Swift时模拟变得更加困难。 Swift中没有可用的成熟模拟库来生成类似Java,Ruby,Python或其他语言的模拟。 开发人员必须手动编写所有模拟,并将测试代码与生产代码紧密耦合。 这里有一篇很棒的关于iOS网络测试的文章,以了解有关如何使用协议进行模拟的更多信息。 存根是测试代码的另一种方式,而不必依赖后端或网络。 使用存根,我们仍然可以实现网络测试的目标,并且不必将测试代码与生产代码紧密耦合。 我们将看到可用于存根的库的详细信息。 一些最受欢迎的库是用于XCTest(unit)测试的OHHTTPStubs,Mockingjay,Hippolyte。 用户界面测试贯穿网络层,涵盖了网络测试的所有方面。 苹果有XCUITest框架来涵盖Xcode UI测试。 我们可以使用一些库来为UITest存根网络。 一些流行的库包括Swifter,SBTUITestTunel和XCUITest(UITest)的Embassy。 但是,市场上出现了新的服务器端Swift框架,例如Vapor,Kitura,Perfect,它们也可以用于暂存网络请求。 在这篇文章中,我们将看到如何使用Vapor服务器端swift框架对网络请求进行存根。

Apple在WWDC 2015上宣布了Xcode的UI测试支持。UI测试被设计为完全黑盒,无需访问主应用程序代码和数据。 XCUITest使用两个独立的进程Test Runner和Target应用程序,测试运行器启动了目标应用程序,并使用UIKit内置的可访问性功能与在单独进程中运行的应用程序进行交互。 在嘲笑或测试UITest时,我们几乎没有选择

  • 模拟和通过发射参数/环境

这意味着您不能直接模拟API。 与代理应用程序通信的唯一方法是传递启动参数或启动环境。 我们可以传递模拟API并创建启动环境变量,然后将其传递给XCUITests,但这需要大量的工作。 代码用if-else语句括起来,以确定听起来不太好的构建配置。

  • Web服务器存根后端并返回响应

剩下的其他选择是对网络呼叫进行存根并从服务器获取所需的数据。 为此,我们需要模拟后端并指向我们的应用程序以使用这些端点。 问题是我们是否仍可以使用上面提到的存根服务进行单元测试。 我们仍然可以使用这些库来处理网络请求,但是有时它需要更改主应用程序的逻辑,并且需要重构某些东西以增加额外的工作。 我们需要在生产代码中添加很多测试代码。

在我先前关于XCUITest的网络存根选项的文章中,我们介绍了所有选项,例如Swifter,SBTUITestTunel和Embassy for XCUITest。 现在,让我们详细介绍一下Vapor。

服务器端Swift框架尚未投入生产,但我们可以将其用于存根XCUITest的目的。 我还没有在互联网上读过任何人做的书,但是它工作得很好。 市场上几乎没有可用的Server Side Swift框架,例如Perfect,Kitura,Zewo和Vapor,但在此演示中,我们将使用Vapor。 选择蒸气的原因是它很容易学习,并且蒸气周围的社区正在迅速发展。 它完全由Swift编写,并带有易于上手的Vapor工具箱。

为了演示此功能,我创建了一个演示应用程序,当我们在文本字段中输入Github用户名时,它将显示Github用户信息。 您可以从Github Vapor-XCTest克隆该应用程序,该应用程序具有带有和不带有存根的XCUITests。

您需要安装Xcode 9+和OpenSSL,然后我们才能签出演示应用程序。

  $ git clone https://github.com/Shashikant86/Vapor-XCTest 
$ cd Vapor-XCTest
$打开Vapor-XCTest.xcodeproj

这是显示Github用户信息的示例应用程序。 它要求用户输入您的Github用户名,然后单击“提交”按钮,它会显示所有用户详细信息。 现在,您将看到带有两个演示UITests的示例应用程序。 一个具有真实的网络请求,另一个具有通过蒸气的网络请求存根

尝试运行LocationCheckWithoutStub.swift,它发出真正的网络请求。 您可以看到它使用来自真实服务器app.launchEnvironment = [“ BASEURL”:“ https://api.github.com”]的launchEnvironment值发出真实的网络请求。

现在,导航到我们具有所有Vapor设置的Vapor-Server目录。 生成项目并运行服务器。 服务器将发送在main.swift文件中存根的虚拟响应。

  $ cd蒸气服务器 
$快速建立
$ .build / debug / Vapor-Server服务

这将在端口8080上启动蒸气服务器,并侦听本地蒸气服务器的响应。

现在运行使用本地响应的UITest LocationCheckWithVaporStub.swift,您可以看到本地网络的launchEnvironment值。 app.launchEnvironment = [“ BASEURL”:“ http:// localhost:8080”]您可以看到测试将通过响应Stubbed数据。

现在,我们已经看到示例应用程序使用Vapor存入了存根数据。 让我们探讨一下如何设置您的应用程序以使用Vapor服务器的存根响应的过程。

  • 允许本地网络

为了使用来自Vapor的残存数据,我们需要做一些设置以配置我们的主应用程序以侦听本地网络呼叫。 这可以通过添加密钥来编辑主应用程序Plist文件来完成

   NSAppTransportSecurity  


NSAllowsLocalNetworking


NSAllowsArbitraryLoads

这将允许iOS应用程序联网。 但是,您应该仅对调试构建配置执行此操作,而不应对发布配置执行此操作。

  • 设置启动参数/环境以使用本地响应

为了用本地请求替换真实的网络请求。 我们需要设置一些XCUITests可以使用的启动参数/环境。 这样,我们可以通过传递启动参数或环境来对真实请求和存根请求进行测试。

  • 在iOS应用中获取蒸气

有几种方法可以在iOS项目中获得Vapor。 我们可以使用Vapor工具箱,也可以使用Swift Package Manager获得Vapor,如此处所述。 我建议使用Swift Package Manager来获取它,因为我们可能不需要Vapor工具箱提供的大量Web框架。 在此处参考演示应用程序和package.swift文件中的Vapor Server示例

  • 开始存根网络请求

获得所有必要的工具后,就该对网络请求进行实际存根了。 Vapor拥有关于如何处理JSON中的请求和响应的全面文档。 就像在演示应用程序中一样,我们将请求存根到/ users / shsahsikant86以返回存根响应。

 导入Vaporlet drop =尝试Droplet()drop.get(“ users / shashikant86”){ 
var json = JSON()
尝试json.set(“ location”,“ StubLocation”)
尝试json.set(“ name”,“ StubName”)
尝试json.set(“ blog”,“ http://shashikantjagtap.net”)
尝试json.set(“ followers”,100000000000000000000000000000)
尝试json.set(“ public_repos”,100000000000000000000000000)
返回json
}尝试drop.run()

您可以看到,通过存根,我们可以实际测试难以用实际数据测试的边缘情况和场景。 很好的例子是如何为拥有数万个关注者的用户测试演示Github应用。 在现实生活中,没有人有那么多的追随者,但我们可以像上面的代码所示对它进行存根并对其进行测试。

我在BBC办公室的Meetup上发表了关于Vapor London的演讲。 幻灯片在下面

Shashikant Jagtap 于2018年3月伦敦蒸气 峰会上

使用Vapor等服务器端Swift框架,我们可以对XCUITests可以用来运行用户界面测试的网络请求进行存根。 我们可以利用Swift语言的优势来进行网络调用,从而消除了使用其他编程语言(例如Ruby或Java)运行服务器的需求。 您如何看待这种方法? 还是您仍然更喜欢nodeJS,Sinatra服务器?还是将诸如Swifter之类的轻量级服务器用于对XCUITest的请求进行存根? 在Twitter上与我联系@ Shashikant86

像XCBlog的 XCTEQ 发布的帖子一样 您可能还喜欢我们的一些服务,例如访客博客或Mobile DevOps(CI / CD)或测试自动化。 Github 搜索我们的 服务 ,开源项目, 或者在 Twitter Facebook Youtube LinkedIn 上关注我们 下载我们的 XCBlog iOS应用程序以离线阅读博客。

X CTEQ 一家专门从事基于Mobile DevOps,CI / CD,Mobile,AI / ML的测试自动化Checkout XCTEQ产品和服务的公司, 网址 http://www.xcteq.co.uk 或写信给我们info@xcteq.co。英国..