自动化即服务— Scriptflask简介

作者: Fazal Allanabanda Vilas Veeraraghavan

介绍

不到一年前,我们分享了在全球范围内测试“高影响力标题”(HIT)时的测试胜利和面临的挑战。 所有这些都确保了Netflix的创新步伐不会放慢。 从那时起,我们对自动化进行了重大改进。 因此,在这篇文章中,我们想谈谈去年以来的发展。

我们团队的重点仍然是在全球范围内(在发布之前和发布之后)为HIT提供测试覆盖,并确保在测试推出之前对A / B测试逻辑进行全面验证。 我们通过手动和自动测试的混合来实现这些目标。

在上一篇文章中,我们谈到了如何构建一套通用的实用程序(将与netflix服务生态系统中的每个微服务通信的shell / python脚本),这为我们提供了一种简单的方法来获取数据并在数据的任何部分进行断言服务管道。 但是,我们开始达到模型极限的速度比我们预期的要快得多。 在下一节中,我们将讨论我们面临的一些障碍以及我们如何开发解决方案来克服这一障碍。

可扩展性

随着我们的测试范围扩大到涵盖Netflix服务管道中的大量微服务,可伸缩性问题变得更加突出。 我们开始创建脚本(shell / python),将其用作从每个微服务访问数据的实用程序,并迅速遇到问题。 特别,

  1. 熟悉微服务并为它们创建脚本所需的时间很短:每次我们为新服务创建实用程序时,我们都必须花时间了解该服务最常请求的内容,服务是什么体系结构允许我们访问以及如何请求对公开数据进行修改以达到我们想要的测试。 所需的工作没有扩展。
  2. 随着时间的推移,维护这些脚本的成本很高:随着负责这些服务的每个团队的速度不断变化,我们有责任与他们并肩前进,以确保立即解决破损问题并且不影响我们的利益相关者。 再次,根据我们现有的团队章程和组成,这是一项巨大的努力(包括资源和时间)。

Netflix生态系统中存在数百种微服务,而许多其他微服务则处于不断发展的阶段,以支持新的产品创意。 我们希望有一种方法可以为应用程序创建测试实用程序,该实用程序可以由相应的应用程序团队成员及其测试伙伴拥有。 这样可以加快测试速度,功能团队可以与我们合作制作实用程序。 我们可以保持循环,但可以减少我们团队的时间和资源投资。

易用性

作为集成测试团队,我们的重点不仅在于创建新测试,还在于使其他团队易于运行相同的测试,从而使整个产品组织都能从最初的努力中受益。

但是,这意味着这些测试应该使用一种通用语言,因此当测试人员/开发人员/其他人尝试运行它们时,他们可以轻松地学习将测试及其结果用于其目的。 大多数团队专注于他们的应用程序,但是有了一套通用的实用程序,我们可以使测试人员以最少的时间投入编写端到端测试。 通常,这将加快集成测试和开发的速度。

但是,使用shell / python脚本时,需要从代码存储库中下载该脚本以进行试用,调试通常需要我们小组中的团队成员,而且每个微服务返回的数据的格式也不相同,因此解析非平凡的任务对于使用脚本的人。

让其他团队使用我们的工具已经给我们带来了巨大的好处。 举例来说,在最近努力提高拇指评级的过程中,负责该项目的质量检查团队在部署之前使用了许多实用程序来运行功能测试。 提供所有设备类型的登录页面的MAP团队还发现我们的测试实用程序可用于运行集成测试。 因此,集中式API将使所有测试团队受益匪浅。

可扩充性

让我们以一个测试用例为例-验证测试成员是否具有特定标题(由算法确定是否与他们匹配),并在登录后在其Netflix登陆页面的前3行中获取标题。 这个简单的测试语句很容易手动检查,但是涉及自动化时,它并不是一步验证。 我们需要探查多种服务来运行此测试的断言。 因此,我们将其分解,如下图所示。

上述每个步骤都需要使用一组特定的参数调用微服务,然后解析响应。 我们将每个步骤称为“简单测试动词”,因为每个操作都是对服务的单个步骤/ REST / HTTP调用。 如图所示-该测试用例与4种不同的服务(用不同的颜色表示)相连接,这意味着在API更改的情况下可能会出现4点故障。

我们的目标是创建更高阶的“复杂测试动词”,该动词将同时调用许多这样的动词。 这实际上意味着上述所有测试步骤(即简单动词)都可以由一个高阶复杂动词封装,该动词一步完成所有工作,例如:

  • 断言(复杂动词)—其中复杂动词=“新成员(目标是标题)的登录页面的第三行包含标题”

创建复杂的测试动词的优势在于,它允许集成测试人员编写非常具体的测试,并可以以简单的方式重用这些测试,例如,开发人员可以验证错误修复程序,其他团队可以断言他们自己不了解/的特定行为。能见度。 我们现有的方法在创建这些动词和达到测试框架所需的可扩展性方面有太多障碍。 我们需要一个抽象层,使我们能够实现目标。

Scriptflask简介

为了克服我们遇到的可伸缩性,可用性和可扩展性方面的缺点,我们将框架重构为Netflix生态系统中的一阶应用程序。 在功能上,我们通过针对REST端点的自动化方法取得了巨大成功。 我们的意图是进一步建立这个模型-因此,Scriptflask是我们测试自动化的合理下一步。 我们现有的一组python实用程序脚本采用了一组参数,并单独执行了一个功能。 Scriptflask的核心是作为REST端点公开的这些实用程序的集合。

我们是怎么来到这里的?

我们的基础架构过去看起来像这样:

我们的测试用例是shell脚本,它们依赖于实用程序,每个实用程序将执行一项功能。 然后,这些实用程序访问各个微服务,并为用户检索或修改数据。 为了使Netflix的更多团队使用这些实用程序,我们考虑了两种选择:

  1. 将实用程序发布为库,其他团队可以使用
  2. 将实用程序公开为REST端点

我们选择选项2的原因很简单,因为它可以消除版本冲突的需要,并且也不需要检索任何代码,因为所有交互都可以通过http调用实现。

为什么选择烧瓶?

我们使用了Flask Web服务器来编写python脚本。

我们的主要要求是REST API,因此我们对构建UI或对数据库没有任何用途都没有兴趣,Flask对我们而言完美地工作了。 Netflix的多个Python应用程序还使用了Flask,从而为我们提供了简单的内部支持。 我们也研究了Django和Pyramid,最后选择了Flask,后者为我们提供了最大的适应性和易实现性。

Scriptflask包含两个组件:

  1. 实用程序 -这些是我们测试自动化中的实用程序,可重构为python函数并包含更多业务逻辑,从而为我们创建“复杂测试动词”的策略提供了支持
  2. API-这是Flask网络服务器的实现。 它由输入验证,服务发现,自检和运行状况检查组成,并将实用程序的功能作为REST端点公开,并返回格式化为json的数据。

Scriptflask的好处

可扩展性

Scriptflask具有可伸缩性,因为添加起来很容易。 每个应用程序所有者可以添加一个与其应用程序交互的实用程序,并且这样做相对简单。 我们的开发人员花费了一天的时间来获取我们的源代码,在本地部署并为他们实现的新微服务实现REST端点。

这大大减少了测试实施时间。 作为集成团队,我们可以专注于执行测试并以此方式扩大测试范围。

作为Netflix生态系统中的一阶应用程序,我们还利用了能够使用Spinnaker轻松安排部署,扩展和持续集成的优势。

易用性

Scriptflask使实现REST端点的入门变得非常容易-所有日志记录,错误处理,数据编码都是开箱即用的,几乎不需要编写任何自定义代码。 端点的实现非常简单,请求主体是唯一需要实现的组件,其余则是免费的。

我们在先前的测试自动化迭代中遇到的一个重大挑战是跟踪我们作为一个团队实施的实用程序。 这是我们在收集Scriptflask的要求时将OpenAPI规范作为必不可少的功能的原因之一。 OpenAPI实现使Scriptflask的用户更容易执行操作以及识别任何缺少的端点。

可扩充性

我们以前的实现面临的另一个挑战是其他团队不愿意使用我们的测试自动化,因为其中涉及学习曲线。 我们希望通过向他们提供将所有测试用例转换为将执行测试的REST端点的更简便的方法来减轻这种情况,并在响应中返回生成或处理的数据以及任何结果验证。

现在,这使我们能够将高影响力标题(HIT)的多个后端验证测试作为REST端点公开给前端团队。 我们还能够将我们的一个微服务的端到端测试公开为一系列REST端点。

将我们的测试用例作为REST端点公开的另一个优点是它们与语言无关,这使多个使用不同框架的团队可以合并我们的测试用例。

使用Scriptflask的其他优势

降低复杂度

Scriptflask大大降低了我们集成测试的复杂性。 现在,每个测试用例都是一个简单的REST调用序列。 在某些情况下,测试本身就是单个“复杂动词”,可以一步执行。 对于Scriptflask的客户端,使用它与使用任何其他服务REST端点没有什么不同。 对于那些对Scriptflask进行贡献,安装和入门感兴趣的人,我们的集成测试现已成为一个干净的,两步安装,并且对python不太了解的人员可以在十分钟内启动并运行。

这可以帮助新的测试人员迅速加入我们的测试框架,并降低开始为测试工作做出贡献的障碍。 我们已经吸引了来自各个功能团队的开发人员和测试人员来为Scriptflask做出贡献,并引起了关于测试和工具的大量讨论,这些讨论激发了更多创新和创造力。

浏览服务的可靠性/可用性问题

Netflix微服务已部署在多个AWS区域中。 使用Scriptflask,我们能够完成旧系统中从未有过的高效工作-对于双活部署中的所有服务,从一个区域回退到另一个区域。 我们还为可​​靠性团队进行影响服务的混乱演习提供了便利。

使用Scriptflask所获得的优势在于,我们能够对路由做出明智的决定,而测试人员不必学习和掌握其他逻辑。 这有助于使测试人员免于承担应对系统外部波动的责任,因为外部波动可能会使测试变得脆弱/易碎。

测试执行速度

当我们开始移动测试以使用Scriptflask时,我们发现测试执行时间大大减少了。 在一种情况下,我们看到测试执行时间从5分钟减少到56秒。 发生这种情况是因为将复杂的过滤和处理逻辑委托给Scriptflask,在此我们可以优化许多最复杂的测试步骤,从而节省了时间。 速度的提高导致测试集中于断言,断言可以快速,轻松地获取和验证,而不是追逐系统效率低下引起的误报。

尽管我们最初并未计划提高测试执行速度,但从整个练习中受益匪浅。

未来的增强

我们的短期目标是在组织内推广Scriptflask,并使Netflix服务管道的各个方面的测试变得简单直观。 为此,我们将必须:

  • 征募:让其他功能团队参与开发过程,以便他们可以亲眼目睹自己的利益,并产生主人翁感,这将导致采用和参与的良性循环
  • 增强功能:创建工具以自动生成新端点和新服务的支架。 这将进一步缩小入门的障碍,从而帮助机上工程师更快地工作。
  • 扩展:与Spinnaker管道集成将通过使功能团队通过在canary / test部署中运行端到端测试来扩展其测试范围,从而扩展Scriptflask的范围。

除了以Netflix为重点的增强功能外,我们还考虑开放采购Scriptflask的某些方面。

从长远来看,更多的挑战摆在我们面前。 我们一直在探索新的方法来测试和提高添加新功能并加快A / B测试推出的总体速度。 如果这激起了您的兴趣,并且您希望加入我们的使命,我们希望收到您的来信。 激动人心的时刻到来了!