自动化即服务 - 介绍Scriptflask

作者:Fazal AllanabandaVilas Veeraraghavan

       原文链接:https://medium.com/netflix-techblog/automation-as-a-service-introducing-scriptflask-17a8e4ad954b

介绍

不到一年前,我们分享了我们的测试成果,以及在全球测试高影响力标题(HIT)时面临的挑战。所有这些同时确保Netflix的创新步伐并没有减缓。从那时起,我们对自动化进行了重大改进。所以在这篇文章中,我们想谈谈自去年以来的演变。

我们团队的重点仍然是为全球HIT(发布前后)提供测试覆盖,并确保在测试推出之前彻底验证任何A / B测试逻辑。我们使用手动和自动测试的混合实现这些目标。

在我们之前的文章中,我们讨论了构建一组通用的实用程序 - shell / python脚本,它们可以与netflix服务生态系统中的每个微服务进行通信 - 这为我们提供了一种简单的方法来获取数据并对数据的任何部分进行数据断言服务管道。然而,我们开始以比我们预期更快的速度达到模型的极限。在下一节中,我们将讨论我们面临的一些障碍以及我们如何制定解决方案来克服这一障碍。

可扩展性

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

  1. 熟悉微服务并为其创建脚本所需的加速时间非常重要:每次我们为新服务创建实用程序时,我们都必须花时间了解该服务中最常请求的项目是什么,服务是什么架构允许我们访问以及如何在暴露的数据中请求修改以获得我们想要测试的内容。所需的努力没有扩展。
  2. 随着时间的推移维护这些脚本变得昂贵:由于负责这些服务的每个团队的速度各不相同,我们有责任与他们一起行进,确保立即解决破坏问题,并且我们的利益相关者不会受到影响。再一次,凭借我们现有的团队章程和组合,这是一项耗资巨大的工作(包括资源和时间)。

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

可用性

作为一个集成测试团队,我们的重点不仅在于创建新的测试,还在于让其他团队能够轻松运行相同的测试,因此整个产品组织可以从最初的努力中受益。

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

但是使用shell / python脚本,需要从代码库中下载以进行试用,调试通常需要我们组中的团队成员,并且每个微服务返回的数据格式也不相同,这使得解析成为一项重要任务对于谁使用脚本。

我们已经看到其他团队使用我们的工具已经带来了显着的好处。例如,在最近努力产生大拇指评级的过程中,从事该项目的QA团队在部署之前使用了我们的许多实用程序来运行功能测试。为所有设备类型提供登陆页面的MAP团队也可以使用我们的测试实用程序来运行集成测试。因此,集中式API将极大地使所有测试团队受益。

可扩展性

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

测试设置大约在2015年

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

我们的目标是创建更高阶的“复杂测试动词”,这将使许多这样的动词同时被调用。这实际上意味着上面的所有测试步骤(简单的动词)都可以通过更高阶的复杂动词进行封装,该动词一步完成所有操作,如下所示:

  • 断言(复杂动词) - 复杂动词=“新成员的登陆页面的第3行(标题的目标对象)包含标题”

使用自动化即服务进行测试设置

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

介绍Scriptflask

Scriptflask标志

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

 

我们是怎么来到这里的?

我们的基础设施过去看起来像这样:

Scriptflask之前的基础设施设置

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

  1. 将实用程序发布为可供其他团队选取的库
  2. 将实用程序公开为REST端点

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

 

 

为什么使用Scriptflask?

我们使用Flask Web服务器来展示我们的python脚本。

我们的主要要求是REST API,因此我们没有兴趣构建UI,或者对数据库有任何用处,Flask非常适合我们。Flafl还被Netflix的多个Python应用程序使用,为我们提供了简单的内部支持。我们也看了Django和Pyramid,最终选择了Flask--它为我们提供了最具适应性和易于实现的功能。

Scriptflask由两部分组成:

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

使用Scriptflask进行基础设施设置

 

 

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管道集成将扩展Scriptflask的范围,使功能团队通过运行端到端测试作为金丝雀/测试部署的一部分来扩展其测试覆盖范围。

除了Netflix专注的增强功能外,我们还在考虑开源Scriptflask的某些方面。

猜你喜欢

转载自blog.csdn.net/ccc7574/article/details/83147314
今日推荐