软件开发中一个重要但经常被低估的部分是测试。顾名思义,测试是具有挑战性的。如果错误很容易被发现,它们一开始就不会存在。测试人员必须跳出固有思维模式,才能找到其他人错过的错误。在许多情况下,理解应用程序的业务领域对于有效的测试至关重要,详细了解应用程序本身也是如此。
在开源项目中,质量通常由贡献者和协调架构师负责。单元、组件和服务的测试通常可以有效地完成并实现良好的自动化。这使得项目即使在收到许多贡献的情况下也能向前发展。范围和深度足够的全面自动化测试有助于保持产品的稳定性。
虽然一些开源项目是通过积累分散人员的贡献而发展起来的,但面向 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。但是,不能避免自动化,也不应该因为困难而避免自动化。项目的所有参与者之间的合作可以带来稳定、可维护且实现起来不低效的良好结果。
1 条评论