65.9K
CodeProject 正在变化。 阅读更多。
Home

什么是持续测试

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (1投票)

2018 年 5 月 8 日

CPOL

9分钟阅读

viewsIcon

16110

本文将讨论持续测试对于我们组织成功以及我们更快地开发、测试和交付更优质软件的能力的重要性。

持续测试开发者?等等,什么...

我们已经谈论了很长时间关于持续测试的“涅槃”。我记得...

去年我听了一个关于海军陆战队员训练项目中的学生如何期望每天早上自己铺床的故事。起初这似乎是一项显而易见的任务,但仔细想想,我们多久做一次呢?也许只是推迟一下,或者干脆不做,考虑到你晚上还要回来?每天养成一个小习惯,实现第一个成功——整理好床铺,这样你就可以带着“今天已经取得了一次成功”的想法去处理其他任务了!这与测试概念有什么关系呢?

在软件开发领域,QA/QE 测试人员很容易说“让开发人员完成代码交付,然后我们再进行测试”。然而,我们从许多正在进行 DevOps 之旅的客户那里了解到,QA/测试是“瓶颈”,占用了他们 SDLC 的大量周期。有大量关于“左移”能带来多少节约的研究课题——这意味着在 SDLC 的各种时间点进行测试会带来巨大的好处。在各种时间点进行的测试等同于持续测试(CT)的概念,CT 是整个 SDLC 周期中需要完成的不可或缺的一部分,而不是等到最后才进行。

因此,显而易见的结论是,尽管持续集成(CI)和持续交付(CD)似乎加速了软件发布,但持续测试(CT)是一个不可或缺的部分,它将帮助保证您产品的质量!

我全心全意地相信,随着越来越多的组织通过采用敏捷和 DevOps 等新流程进入更短的开发/测试周期,我们每个人都必须采用更好、更优化的开发和测试实践,例如持续测试。在我们深入探讨之前,让我从头开始。

什么是持续测试?

您可能没有意识到的是,持续测试的概念已经存在了将近 15 年,最初发表在一篇题为《Reducing Wasted Development Time via Continuous Testing》的论文中,该论文于 2003 年在国际软件可靠性工程研讨会上发表。这个概念非常简单,就是利用空闲的 CPU 资源在后台持续运行测试,从而在编辑源代码时“快速反馈测试失败”。

近期 SD Times 文章《Continuous testing enabled the promise of Agile》中提出了一个更更新、更实用的持续测试定义。我特别喜欢这篇文章是因为它对这个术语给出了一个简化的看法,即“在代码开发过程中持续自动进行的测试”。

为什么更多人没有做持续测试?

我想知道为什么更多人没有进行持续测试,我能想到的最好的原因是因为测试的限制、环境、问题,任何阻碍我们的测试同事进行测试,或者说阻碍他们继续开发的事情。

一份 2017 年的《Computing Research》报告显示,“63% 的软件开发公司在开发周期的测试/QA 阶段出现了延误”。在敏捷和 DevOps 的理想世界里,不应该存在这样的瓶颈,因为理论上,测试应该持续进行,而不是在周期结束时进行。您不觉得吗?

那么,为什么测试不能持续进行呢?

嗯,可能是因为您想测试的组件尚未可用,或者您需要依赖其他团队完成工作后才能开始测试。我们无法测试的另一个原因是,我们可能缺乏合适的测试环境(大型机、第三方、性能或其他),甚至缺乏内部或第三方 API 的连接性,这些都会限制我们持续测试的能力。第三种可能性是缺乏测试数据,使您无法快速、持续地进行测试。(考虑到 GDPR,这只会变得更糟,您不觉得吗?)

引入服务虚拟化以实现持续测试

我们已经从事服务虚拟化工作超过 10 年(自从收购 ITKO 的解决方案以来已经超过 6 年),并相信只有通过使用服务虚拟化,组织才能实现持续测试。

在我继续之前,让我解释一下什么是服务虚拟化,以及它与您可能更熟悉的模拟(mocking)和存根(stubbing)有何不同。服务虚拟化是一种捕获和模拟依赖系统行为、数据和性能特征的做法,本质上是创建这些依赖系统的“虚拟副本”。这些虚拟副本的行为“就像真实的一样”,并且可以独立于实际的实时系统使用,以便继续工作,甚至持续测试。

虚拟服务的试金石是,使用该服务的系统无法区分它不是真实的系统,而存根和模拟由于缺乏服务使用者所需的健壮性而在此测试中失败。

服务虚拟化采用了一种更现代的方法来处理传统的模拟和存根实践。使用服务虚拟化的应用程序开发人员和质量工程师可以享受到具有动态和强大功能的底层服务,这些服务与“真实”的底层系统足够相似,但又不受真实硬件和软件的复杂性和约束的影响。这些虚拟服务允许消费者在编写和消费服务时并行地“左移”,或者消除线性项目依赖,从而在软件开发生命周期中实现更早的交付。

通过服务虚拟化,开发和测试团队可以克服许多约束障碍,包括我之前提到的三个。

  • 缺失的组件——通过服务虚拟化创建其他服务、组件或系统的副本的能力,有时甚至是真实事物的更好版本,您就可以在需要时拥有所需的一切,以便继续开发或测试工作,而无需依赖他人工作。
  • 不可用的测试环境——所以,等待测试环境、系统或访问权限的借口不再有效。通过服务虚拟化,您可以将待开发/测试的系统与所有后端系统隔离开来,从而使其摆脱对任何受限或不可用测试环境或系统的访问。
  • 缺乏测试数据——在使用服务虚拟化时,设置、运行和刷新测试数据不再是问题,因为您几乎不需要单独的数据集,因为您拥有具有与真实事物相同的特征甚至数据配置文件的虚拟服务。因此,无需管理测试数据样本,并像保护生命一样保护它们,以免有人在不知情的情况下拿走您的样本并修改、更改或删除它们。

现在您已经了解了服务虚拟化在帮助您克服这些以及许多其他开发或测试约束方面的强大功能,是什么阻止您持续测试呢?

CA Technologies 提供的两种免费开始使用服务虚拟化的方法(不脸红的推广)

您不使用服务虚拟化的借口不可能是因为您负担不起该解决方案……因为我有一个很棒(而且免费)的提议给您。这是我对 CA Technologies 为开发者/测试人员社区提供的两个免费工具进行的不脸红的推广。

CA Service Virtualization Community Edition——这是一个独立的、免费的服务虚拟化工具,它针对 HTTP/HTTPS Web 服务和常见的协议(如 SOAP、REST、JSON 和 XML)进行了优化。

借助 Community Edition,您可以通过调用 REST API 和基于 SOAP 的 Web 服务来创建和保存事务。您还可以使用实时流量记录、API 设计、请求/响应对或网络捕获来创建虚拟服务。

CodeProject 对该产品有更深入的评测,如果您想了解更多产品详情,请点击此处。要获取您的免费 CA Service Virtualization Community Edition 副本,请访问我们的产品页面

CodeSV——这是我们创建的另一个免费 Java 库,它是一种轻量级的方式,让开发者可以在自己的 JAVA IDE 中定义和使用虚拟服务。

CodeSV 允许您在单元测试代码中创建和运行 HTTP 虚拟服务定义,并将虚拟服务集成到您的 CI/CD 流程中。

CodeProject 也对 CodeSV 进行了深入研究,如果您喜欢,请点击此处。该工具可从 www.codesv.io 免费下载。

这是 CodeSV 的使用示例。

首先,要设置 CodeSV,您可以从一系列选项中选择——Maven、Gradle 或手动设置。我们的CodeSV GitHub 页面上的快速入门指南将指导您完成这些步骤。在这种情况下,假设我正在使用 IntelliJ IDEA 并选择创建一个 Gradle 项目作为第一步。项目创建完成后,只需 2 个简单步骤即可开始——

  1. 将 Maven 存储库添加到我们的 build.gradle 文件中
  2. 添加 CodeSV 依赖定义

下一步是通过创建一个类来编写单元测试

在继续之前,我们需要确保 `Test` 类已配置为与 CodeSV 一起使用

  1. 添加几条导入语句
  2. 在 `Test` 类中添加一个 `VirtualServerRule` 类成员

现在,我们可以编写我们的第一个单元测试了。我们将模拟调用一个仍在建设中的服务的示例。让我们创建一个测试,它将向一个不存在的端点发送一个请求。该服务将位于以下 URL,如下所示——

现在,让我们创建一个调用我们刚刚定义的不存在端点的测试。在测试中,创建一个 URL 对象来打开一个 HTTP 连接

然后,我们将设置请求方法——这里是 `Get` 方法。为了方便起见,我们将打印响应代码

现在,让我们设置响应体。关闭读取器并打印响应。

现在,让我们运行测试以确保它失败。由于我们还没有虚拟化我们的服务,我们正在调用一个不存在的实体。您将看到结果是未知主机异常。

为了解决这个问题,我们将使用 CodeSV 来虚拟化并返回有意义的响应。所以,让我们在我们的自定义端点上创建一个虚拟服务。该服务将虚拟化一个发送到我们自定义 URL 的 Get 请求。我们希望它返回 200 的响应代码,并带有“Success”的字符串体。

现在,让我们再次运行测试。这次测试将通过。正如预期的那样,虚拟化的 Get 请求被发送到自定义 URL,并返回了我们刚刚定义的响应。响应代码为 200,正文包含“Success”字符串。

等等——还有更多!关于如何虚拟化 `forGet(String url)`、`forPost(String url)`、请求-响应对导出、对 HTTPS 等的支持的示例,请参阅 http://codesv.io/index.php/how-to-videos/

现在您已经阅读了这篇文章,我希望您同意我的观点,即持续测试对于我们组织成功以及我们更快地开发、测试和交付更优质软件的能力至关重要。我希望您对服务虚拟化及其如何帮助持续测试有了更多的了解。我想听听您的意见(Koustubh.Warty@ca.com),让我在您试用过 CA Service Virtualization Community EditionCodeSV 后,告诉我您的想法。

© . All rights reserved.