在大型测试中进行资源管理

2018-03-12   出处:code.facebook.com  作/译者:Jeffrey Dunn, Alexander Mols ,Phyllipe Medeiros, etc/初心  

      随着全球越来越多的人使用Facebook,我们希望确保我们的应用和服务在各种场景下都能够运行良好。按照Facebook的用户规模,这意味着在我们发布新代码之前,需要在数以百计的移动设备和操作系统上进行测试,以确保应用和服务运行正常且具有较好的性能。

      去年,我们推出了Facebook移动设备实验室,它允许工程师通过远程访问我们数据中心中可用的数千种移动设备来进行测试。从那以后,我们建立了一个名为One World的新的统一资源管理系统来管理这些设备和工具,如网页浏览器和模拟器。Facebook的工程师们在测试时可以通过使用API与这些远程设备进行通信。如今One World正管理着数以万计的资源,并且每天需要执行超过100万个请求。在One World发展到这个规模的过程中,我们学到了很多东西——因为我们希望One World是一个既能够处理设备可靠性和复杂性,又能够提供简单易用的API接口的系统,在实现这一目标的过程中我们遇到了很多独特的挑战。

 

      One World的结构

      One World中,我们希望能够支持任何应用,开发工程师在他们的代码或开发环境中只需做少量的修改就可以使用远程的服务。这意味着我们需要能够支持标准的通信机制,例如adb(Android Debug Bridge),提供一种在本地使用远程设备的错觉。One World系统包含四个主要组成部分:

      1、工作者服务程序:每种资源类型都有相应的工作者服务程序,该服务程序在管理资源的计算机上运行,它将管理资源的生命周期,并响应客户端对其资源的使用请求。

      2One World守护进程:这个轻量级服务进程运行在将要连接到远程资源的本地机器上。该服务进程实现了与1中的工作者服务程序进行通信的协议,并设置本地环境以允许本地进程与远程资源进行通信。

      3、调度程序:我们使用Jupiter调度程序来将客户请求与可用资源进行匹配。

      4SatelliteSatellite是一种允许工程师将本地资源与全球的One World部署进行连接的最小工作者服务程序部署。

      工作者服务程序

      One World中的每一个资源都有一个对应工作者服务程序,其主要职责如下:

      1、资源配置和初始化:在接收请求之前,大多数资源需要某种初始设置。对于移动设备,这      可能包括解锁设备,禁用锁定屏幕以及配置其他系统设置。对于浏览器,它可能包括启动独立的selenium服务器以允许远程控制。

      2、设备故障检查:长时间使用后,物理设备可能出现故障;此外,我们实验室中的设备与一般的个人设备相比使用频率更高。我们需要对设备进行一系列的检查,以确保设备在允许客户访问之前处于健康的状态。某些检查可能需要技术人员修理或移除设备,其他问题则可能会以自动化的方式解决,例如由于电池电量过低而对设备充电。

      3、恢复资源状态:使用资源后,我们需要为下一个客户请求做好准备。对于仿真器,模拟器和浏览器等资源,这可能是一个简单的过程,例如从映像重新引导即可。移动设备的状态恢复则面临着一些独特的挑战,因为完整的重新映像需要大量时间并会增加内部闪存存储的磨损。要恢复到特定的良好状态,我们可以通过重置大多数内核参数,卸载应用程序和擦除数据分区来进行设备恢复。

      在工作者服务程序中,这些步骤被表示为状态机。每个状态都有监控和日志记录,我们可以逐步了解系统中的瓶颈和故障率。示例状态机可能采用以下形式:

                                              

     在此状态机示例中,绿色步骤表示工作者服务程序与客户端进行交互的时刻。在客户端连接到工作者服务程序之前,可以进行设备配置/设置以及执行设备状况检查等任务。这些步骤可能需要几分钟时间,因此提前运行它们可以在客户端连接时实现最短的延迟(通常,我们的连接延迟时间仅为几秒钟)。在将资源交付使用之前,工作者服务程序可以响应客户请求。客户端断开连接后,工作者服务程序可以将特定元数据附加到稍后可以查询的会话上。可以使用这种方式来存储日志(例如设备logcat)和会话视频。通过允许工作者服务程序异步地添加元数据,客户端不必等待上传完成。
     工作者服务程序是用Python 3编写的,这使我们可以在各种平台上运行它们,包括Linux,Mac OS和Windows。对每个受管的资源都会启动单独的服务实例。我们试图在支持它的平台上将这些服务实例相互隔离。例如,在Linux上运行时,这意味着每个服务都以自己的控制组权限启动,该控制组被配置为仅提供对其组内所控制的资源的访问。

      远程接入移动测试设备
     我们希望在One World中能够支持Andorid现有的全套开发工具,这意味着我们的系统应能够正常调用adb命令。否则,Facebook上使用的每个工具都需要进行修改,这样将带来极大的不便。One World在远程设备主机上运行adb服务器,并通过建立TCP隧道来制造运行本地adb实例的错觉。例如,我们可以在端口5037(标准adb端口)上创建TCP隧道,并将所有流量转发到远程设备主机的adb实例。我们在adb二进制文件周围部署了一个瘦包装器,它可以理解这些命令,并创建带有两跳的隧道 ——首先连接到远程设备主机,然后连接到设备本身。
     iOS开发所使用的大部分工具都是Xcode的一部分。当OneWorld远程运行iOS设备时,我们需要一个类似的机制进行远程交互,以便可以运行应用程序和执行不同类型的测试。
     在2015年,我们开源了 FBSimulatorControl,,这是一个控制IOS模拟器的项目。此后,我们扩展了这个项目,以允许与设备进行接口连接,使我们能够适应Facebook上的许多应用程序。        FBSimulatorControl的功能包括:
     1、生成自动化的结构化输出:FBSimulatorControl以机器可读的格式报告设备和模拟器的状态,适用于诸如引导模拟器和启动应用程序之类的交互。
     2、应用程序管理:iOS上最常见的自动化场景包括安装和启动iOS应用程序。 FBSimulatorControl为模拟器和设备提供了一致的接口,降低One World工作者服务程序实现的复杂性。
     3、用户界面操作的自动化:iOS工程师可能熟悉用于编写自动UI测试的XCUITest框架。在Facebook,我们基于该框架开发了WebDriverAgent项目,这是一个在iOS上运行的WebDriver服务器。这使我们能够从另一台机器自动化地运行iOS应用程序的用户界面,而无需在工作者服务程序上运行其他软件。我们的端到端测试使用这种方法在独立的机器上执行,在并行化时为测试带来了巨大的性能优势。

     4、远程调用:查看自动化测试的结果时,可以请求诊断数据。 FBSimulatorControl提供了用于请求从iOS模拟器和设备收集的视频和日志的API。


      One World守护进程:
     客户端不是直接与远程工作者服务程序对话,而是连接到处理协商和环境设置的本地守护进程。客户端首先与守护进程创建一个新会话,会话包含了客户端需要的运行时类型的说明以及它需要的并发数。例如,在运行大型测试套件时,客户端可能会请求20个并发Android模拟器的会话。守护进程通过预定远程工作者服务实例并执行特定的准备步骤来准备所请求的资源。对于Android会话,这意味着设置适当的TCP隧道来侦听本地主机请求并将流量转发到远程机器上的adb守护进程。
      当客户端需要访问其会话中的每个预定资源时,它将向本地守护程序请求“租用”。 守护进程将回应连接的详细信息,或通知客户资源尚不可用。这些详细信息包括用于adb和FBSimulatorControl的本地端口等信息。客户端完成使用资源后,通过再次调用守护进程来释放它。此时,守护进程会完全释放该资源以供不同的客户端使用,或者如果可能,保留该资源以便在同一个会话中重用。
      在整个会话中,远程工作者服务程序和本地守护进程都是作为前述状态机模型的一部分进行通信的。一旦工作者服务程序通过调度服务被预定,它就会连接到相应的守护进程以为该请求提供服务。在会话期间,守护进程和工作者服务程序都将执行存活性检查,因为它们中的任何一个都可能意外死亡。一旦客户端完成其会话,守护进程就会向工作着服务程序发送一条消息,以进入状态机的“恢复状态”部分。

       Satellite 模式
     虽然与远程资源的连接允许客户端扩展,但有时工程师希望在本地设备上使用相同的工具来调试问题。我们提供“卫星服务”,允许工程师将本地资源连接到One World云。这意味着你桌面上的手机可以与其他工程师共享,并通过运行简单的命令就能够被Facebook的所有自动化功能使用。与工作者服务程序一样,卫星服务程序从本地机器到One World建立了一系列SSH隧道,以连接到其他基础设施。使用卫星设备而不是受管设备的实现不需要更改代码,卫星服务所必需的是网络和可用的资源。

        使用One World
        上述的One World守护进程负责进行服务连接的繁重工作。我们提供简单的库来实现与守护进程通信的通用模式,使工程师能够轻松地将One World进行集成。下面的代码片段演示了用于在One World设备上运行adb命令的Python API。它启动One World守护进程,然后OneWorldADB建立一个会话并阻塞,直到设备可用。一旦Python工程师的代码完成,一个Python上下文管理器就负责拆分所有的东西。

      One World还支持使用多个并发资源。One World守护进程管理这些并发资源,并且工程师可以通过API实现自己特定的功能。在下面的例子中,10个仿真器被用于运行100个作业——下一个作业将在新仿真器可用时立即执行。最后的结果变量将包含run_custom_test方法返回的100个结果。

      应用

      除了为临时使用资源提供环境外,One World还支持Facebook上的众多基础设施项目,其中包括:

      1、端到端和集成测试:在每次对应用程序进行代码更改时,我们都运行一大套测试,以避免在代码库中引入新的错误。在Facebook的规模上,每天都会进行数千次代码更改,从而导致数十万次测试的运行。One World允许我们在仿真器和设备上运行这些测试,并在工程师编写代码时提供测试结果的快速反馈。

      2CT-Scan:除了发现错误之外,我们还仔细测试了我们的应用程序的性能,以确保应用程序在各种设备上顺利运行。One World可以访问那些使用Facebook的人所使用的典型的设备,并且它允许CT-Scan专注于测试性能而不是管理设备。

      3Sapienz:这是一个多目标端到端测试系统,Sapienz使用基于搜索的方法自动地生成测试序列,通过它能够找到的最短路径来发现崩溃。Saintez团队可以专注于能够发现系统崩溃的算法,同时能够让One World管理其使用的仿真器。

 

      如今One World已经能够提供很多重要的应用,但我们希望我们未来的工作能够大大拓展我们在工作流程中使用One World的方式。 我们正在研究一些令人兴奋的新功能,其中包括:

      1、实时流媒体:工程师通常希望重现特定平台的错误。有时候,只使用adb这样的远程接口是不够的 ——您可能需要滚动新闻Feed,撰写评论或点击Like按钮。我们正在构建一个实时流媒体服务,使工程师能够通过网络浏览器与我们实验室中的设备互动。这意味着他们只需点击一下按钮,就能调试问题,而所有这一切都是坐在办公桌前完成的。

      2、远程分析:由于不同的操作系统版本,硬件差异等原因,相同的代码可能在不同设备上具有非常不同的性能。我们正在构建一项服务,允许工程师提交的代码同时在多个设备上运行,检索全部设备中详细的分析数据,以了解这些因素如何影响其代码的性能。

 

      【英文原文】https://code.facebook.com/posts/1708075792818517/managing-resources-for-large-scale-testing/

      {测试窝原创译文,译者:初心}

      译者简介:初心,东南大学在读硕士研究生



欢迎给测试窝投稿或参与内容翻译工作,请邮件至editors@testwo.com。也欢迎大家通过新浪微博(@测试窝)或微信公众号(测试窝)关注我们,并与我们的编辑和其他窝友交流。
154°|1549 人阅读|0 条评论

登录 后发表评论
最新文章