如何利用服务虚拟化跨越测试数据障碍?

数据是一个成本问题

软件开发人员和测试人员每天面临的主要挑战之一源于无法获得真实的数据。作为开发人员,很多时候,你是在与下游服务交互,你必须使用该环境中的任何数据,因为为你的场景获取实际可用数据的过程非常耗时。你经常找不到你需要的数据,必须从生产中获取,这就带来了一系列新的挑战。

更复杂的是,个人数据不能从生产中使用,因为这增加了组织被盗、丢失或暴露的风险。以最近雅虎的违规事件为例,有5亿个电子邮件账户被入侵,或者最近LinkedIn的约680亿用户的数据被泄露。这些违规事件发生在安全性较高的生产层面。开发领域使用的生产数据并不罕见,安全性往往较低。以这种方式操作会给组织的品牌声誉带来巨大风险。因此,必须对敏感数据进行擦洗或屏蔽,这是一个耗时的过程,需要数据专业知识。

利用服务虚拟化克服数据成本问题

无论怎样,数据都是一个成本问题,因为它拖累了你的速度。通过使用服务虚拟化,你不仅可以控制依赖应用程序的行为和功能,以达到稳定测试环境的目的,而且你可以完全控制这些依赖的数据源,并提供你当天工作所需的任何数据。此时,规则发生了变化,因为你现在不仅控制了数据,还控制了逻辑。你可以创建按照你希望的方式行事的服务,而不是严格遵守它们的正常行为模式。

在之前的一篇文章中,我讨论了缺陷虚拟化,它有相同的基本原则。但之前我们讨论的是服务逻辑。这篇文章将进行下一步,并讨论数据控制。在我们开始的时候,让我们关注一下当前测试人员和开发人员每天都要面对的数据挑战。

开发者生活中的典型数据日

在应用程序开发初期,由于服务的全部功能尚未实现,因此测试所需的数据通常比较简单。随着开发的不断增加功能,测试的成熟度也会增加,数据的复杂度也会增加。

举个例子,我们用我之前文章中的例子——假设我是一家航空公司,正在开发机票页面的功能。我需要验证用户是否能买到机票,根据航班在未来多远的时间,用户会得到几个响应中的一个,随着时间的临近,这些响应会发生变化。在开发之初,我可以简单的生成一堆复杂的数据,其中有未来3个月的航班,这样我就可以做我目前需要的所有测试。但当然问题是,我只是点燃了一颗定时炸弹的引线。3个月后,这些美丽的数据就会过期,而我有可能已经忘记了它。突然间,我所有的测试都会开始失败,而时间恰恰不对,因为即将发布,我根本没有时间重新生成数据......听起来很熟悉?

锻造一条可持续发展之路

通过在开发过程的早期引入服务虚拟化,你可以为提供这些数据挑战的解决方案打下基础。一个虚拟服务的数据可以来自许多地方,但在一开始,简单的虚拟服务从固定数据开始。你创建这些“固定资产”mock来解决what-if场景测试阶段的问题,并使事情非常简单。这里的想法是,“我只需要一个服务,它将用这个特定的有效载荷进行响应”。

随着虚拟服务的成熟,有必要将数据和服务分开,这样如果你想在模拟中添加逻辑,你实际上不必打开虚拟服务来操作数据。事实上,成熟的用户创建虚拟服务的方式是让数据源处理大部分的逻辑。然后,他们可以将数据源交给测试人员或测试数据管理团队来插入这个服务未来可能需要的任何数据。向服务添加新功能就像向数据源添加一行一样简单。这使得虚拟化的工作可以共享,一个虚拟服务可以容纳多个团队。虚拟服务成为活的有机体,可以根据需要成长和改变。

这些数据从哪里来?

一旦开发创建了最初的简单服务,就到了测试团队接手的时候了。测试团队会有更复杂的数据需求。这些数据从哪里来?通常情况下,你从记录和回放中获得这些数据。这通常是创建虚拟服务时的第一步。你记录了应用程序和依赖的后端系统之间的事务,并使用这个记录来创建你的虚拟服务。这允许你创建一个非常可用的基线数据源,可以在任何需要的时候进行扩展。在我的航空公司的例子中,这将允许我们获得现实的航班数量和目的地。数据将拥有所有必要的复杂性,包括多航段和国际航班。数据源的相关性处理了所有复杂的请求/响应关系,由于对“真实”数据的后续变化可以简单地重新记录并合并到现有的虚拟服务中,因此获取新的数据变得微不足道。

我们记录的数据并不是来自于生产,这可以保护我们在低级环境中不被数据泄露。这些数据面临的挑战是,由于它不是来自生产,所以它不那么完整或最新。这时,数据的生成和操作就成为服务虚拟化的一个强大功能。

不存在的数据可以用简单的生成数据来补充,来完成我们所需要的数据。在我的航空公司的例子中,回复中的航班日期可以一直是今天的日期,偏移3个月。通过使用数据生成,这个任务变得微不足道。

我们可以通过提供动态数据来管理任何“非定义的”请求/响应关系,继续按摩和操作数据。这些是静态数据集中永远不可能存在的关系类型。在航空公司的例子中,假设当向下游组件发出请求时,它提供了用户的当前位置,这将在响应中作为出发地使用。由于我们的测试用例会不断变化,所以一个真实的服务必须维护所有的当前位置,这样才能在响应中提供这些位置。通过使用虚拟服务,你不需要维护所有的位置,你可以简单地动态返回用户的当前位置作为出发城市。

最后,使用负数据可以静态提供,也可以插入到数据源中,以方便负数据或异常测试。例如,在我的航空公司例子中,这将是插入一个随机取消或延迟的航班,以验证用户在出发去机场之前得到通知。

原文地址:https://www.cnblogs.com/dhorde/p/14356150.html