是什么使测试自动化成功?

暂无读者喜欢。
Can government agencies be innovative?

Opensource.com

软件开发中一个重要但经常被低估的部分是测试。顾名思义,测试是具有挑战性的。如果错误很容易被发现,它们一开始就不会存在。测试人员必须跳出固有思维模式,才能找到其他人错过的错误。在许多情况下,理解应用程序的业务领域对于有效的测试至关重要,详细了解应用程序本身也是如此。

在开源项目中,质量通常由贡献者和协调架构师负责。单元、组件和服务的测试通常可以有效地完成并实现良好的自动化。这使得项目即使在收到许多贡献的情况下也能向前发展。范围和深度足够的全面自动化测试有助于保持产品的稳定性。

虽然一些开源项目是通过积累分散人员的贡献而发展起来的,但面向 DevOps 的项目可能会遵循包含同步开发和发布的 Scrum 或看板方法。这个过程也严重依赖于测试的全面性和它们的无缝自动化。每当出现新版本(可能小到一个源文件的检入)时,测试应该能够验证系统没有崩溃。同时,这些测试本身也不应该崩溃,对于基于 UI 的测试来说,这并非易事。

Mike Cohn 在他的书《敏捷软件开发实践》中提出的测试金字塔,将 UI 定位为测试中最小的部分。大多数测试应侧重于单元和服务或组件级别。这使得更好地设计测试变得更容易,并且在单元或组件/服务级别的自动化往往更容易且更稳定。

我同意这是一个好的策略。然而,根据我在各种项目中观察到的情况,UI 测试仍然是一个重要的组成部分。例如,在 Web 世界中,Ajax 和 AngularJS 等技术的可用性使得设计人员能够创建有趣且高度交互的用户体验,其中应用程序的许多部分在测试中结合在一起。UI 右 Web 应用程序的最终示例是单页应用程序,其中应用程序的所有或大部分功能都在单个页面中呈现给用户。UI 的复杂性可以与更传统的客户端-服务器应用程序相媲美。

因此,我喜欢在图片顶部留出更多空间,使其看起来像这样

即使对于 UI 自动化,技术方面也可能非常简单。有简单的开源工具,如 Selenium,以及更全面的商业工具,如我们自己的 TestArchitect,它们可以负责与 UI 交互,模拟用户对被测应用程序的行为。通过 UI 进行的测试通常也与非 UI 操作混合在一起,例如服务调用、命令行命令和 SQL 查询。

UI 测试的问题在于维护。UI 设计或 UI 行为的微小更改可能会导致大量与之交互的自动化测试失效。常见原因是找不到界面元素或 UI 响应操作的意外等待时间。然后,UI 自动化因错误的原因而被避免:无法使其良好地工作。

让我描述一些您可以采取的步骤来缓解这些问题。成功自动化的良好基础是测试设计。您如何设计测试对它们的自动化有很大的影响。换句话说,成功的测试自动化与其说是技术挑战,不如说是测试设计挑战。在我看来,一个好的测试设计中有两个主要层面结合在一起

  • 测试的总体结构
  • 单个测试用例的设计

对于测试的结构,我们遵循模块化方法,这与应用程序的设计方法类似。测试用例被组织在测试模块中。将它们想象成书中的章节。我们有一些关于如何做到这一点的详细模板,但至少您应该尝试区分业务测试和交互测试。业务测试着眼于业务对象和业务流程,隐藏任何 UI(或 API)导航细节。交互测试着眼于用户或其他系统是否可以与被测应用程序交互,因此关注 UI 细节。关键目标是避免混合交互测试和业务测试,因为交互测试的详细级别会使它们难以理解和维护。

一旦确定了测试模块,就可以在方便的时候进行开发。通常,业务测试可以尽早开发,因为它们更多地依赖于业务规则和事务,而不是应用程序如何实现它们。当团队定义 UI 和 API 时,可以创建交互测试。

另一个有效步骤是使用领域语言方法,如行为驱动开发 (BDD) 或操作(关键字)。在 BDD 中,场景以接近自然语言的格式编写。“操作”是预定义的操作和检查,用于描述测试中要采取的步骤。在我们的基于操作的测试 (ABT) 方法中,它们以电子表格格式编写,使其比用编程语言编写的测试更易于阅读和维护。由于我注意到操作比句子更具体且更易于管理,因此我创建了一个工具,可以在这两种格式之间灵活地来回转换,结合两者的优点。您可以在我为 Techwell Insights 撰写的文章中阅读更多关于 BDD 和操作的信息。

这张图片概述了测试如何在 ABT 中组织,包括测试模块和其中的操作。请注意交互测试和业务测试之间的差异。自动化完全专注于自动化操作。

定义自动化成功的另一个主要因素被称为可测试性。您的应用程序应将促进测试作为一项关键功能。敏捷团队尤其适合实现这一点,因为产品负责人、开发人员、质量保证人员和自动化工程师进行合作。但是,开源项目不一定有这样的团队,产品所有权将不得不定义可测试性。

有关可测试性的更多信息,请查看我为 TechWell Insights 撰写的这篇文章。那里描述的可测试性的主要方面是

  • 应用程序的总体设计(具有清晰的组件、层、服务等)
  • 具体功能(如 API 挂钩或“就绪”属性以帮助计时,UI 元素的清晰且唯一的标识属性,以及在数据和事件甚至显示之前对其进行白盒访问)

自动化可能具有挑战性,尤其是通过 UI。但是,不能避免自动化,也不应该因为困难而避免自动化。项目的所有参与者之间的合作可以带来稳定、可维护且实现起来不低效的良好结果。

Hans Buwalda
Hans Buwalda 自高中时代起就一直从事信息技术工作。在他的职业生涯中,Hans 积累了作为开发人员、经理和首席顾问为全球公司和组织服务的经验。他是测试和自动化关键字方法的先驱,现在该方法已在整个行业中广泛使用。

1 条评论

如果错误很容易被发现,它们一开始就不会存在。
这不是常见情况。软件中存在大量易于发现的错误。例如,只需告诉编译器报告他们归类为可疑的内容,并尝试使用不同制造商的编译器进行构建以运行不同的诊断程序,就可以挖掘出很多内容。

是的,有一部分错误很难找到。但我们不要忘记,还有一部分错误很容易通过编译器、静态分析和模糊测试滥用找到。

如果没有进行任何形式的测试,您可以相当肯定该项目将充满错误。

跳出固有思维模式也部分体现在实施模糊测试,向代码中投入随机内容并查看其行为或崩溃方式。

项目应从基础知识开始,然后扩展测试套件以检测更多内容。

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.