作者:Thuc Nguyen 翻译:陈晓鹏
https://www.logigear.com/blog/test-methods/keyword-driven-testing-the-best-practices-you-cant-afford-to-miss/
00
引言
关键字驱动测试(KDT)是一种久经沙场的测试方法,用于加速测试自动化开发,并从长远来看降低扩展成本。
本文将向您介绍一些最佳实践,这些实践来自于我们20多年来帮助客户成功构建和维护他们的关键字驱动测试框架的经验。
为了获得关键字驱动测试的全部回报,您应该1)将测试组织成具有清晰测试目标的自包含测试模块,2)将业务级测试与交互级测试分开,3)构建一个强壮的关键字库。
关键字驱动测试是一种被广泛采用的方法,您可以将这些最佳实践应用到许多测试自动化工具中,包括Robot Framework、Unified Functional test、TestArchitect、TestComplete、Ranorex等。
01
为什么是关键字驱动测试
为什么关键字驱动测试如此重要?这只是因为它具有经济意义。我们已经观察到许多测试团队使用KDT成功地转换了他们的测试项目。与早期的方法相比,这种方法确实提高了他们团队的敏捷性,并从长远来看为他们节省了大量资金。
02
早期的测试自动化方法
在UI测试自动化的早期,测试工程师通过简单地将用测试用例步骤转成一种编程语言来实现自动化测试。因此,测试脚本的增长与测试用例的数量成正比。一个测试用例对应一个(通常更长的)测试脚本。结果,测试开发成本随着自动化测试用例数量的增加而失去控制。
此外,由于测试自动化框架经常不完善,所以没有太多的代码重用。如果有人需要自动化一个新的UI测试,他们必须从头开始编写它的各个部分。因此,测试开发速度受到影响。即使在许多sprint之后,自动化工程师从特性完成代码的那一刻开始仍然需要努力交付软件特性的自动化测试。
03
关键字驱动测试的业务案例
现在关键字驱动测试的时代到来了。
使用KDT,您仍然需要编写测试用例。但是由于关键字在测试用例中的高可重用性,代码行数已经显著减少。下面的图表显示了与早期的测试自动化方法相比,从长远来看KDT可以减少多少资金。
我们自己的统计数据也显示,应用KDT的测试团队提高了他们的测试开发速度,从每年每个测试人员开发大约80个自动化测试用例提升到300个。以如此惊人的速度,这些团队能够缩小开发和测试之间的差距。因此,它们的自动化覆盖率跃升至近80%。
尽管KDT是一种被广泛采用的方法,但并非所有测试人员都以正确的方式实现KDT,无论他们与之斗争了多长时间。因此,我非常荣幸地在下面写下可能帮助您获得KDT全部回报的最佳实践。
三个关键字驱动测试的最佳实践你不能错过。这些最佳实践对于刚刚开始KDT旅程的测试团队非常有用,同时也为经验丰富的团队提供了一个新的视角:
将测试组织成具有明确测试目标的自包含测试模块
将业务级测试与交互级测试分开
构建一个健壮的关键字库
下面让我们深入了解每个最佳实践。
04
#1 将测试组织成具有明确测试目标的自包含测试模块
成功自动化的关键是测试设计——这与将自动化纯粹视为技术挑战的普遍信念形成鲜明对比。聪明的测试团队应该从一开始就对测试设计进行充分的投资。
高级测试设计
测试设计的过程从分析测试需求开始。测试团队应该将测试需求分解成多个测试目标。然后,共享相同测试目标的测试用例应该被分组到不同的自包含测试模块中。
下面的项目结构说明了如何将测试用例分组到测试模块中。这样组织您的测试项目被证明是优越的,因为它增加了KDT框架的可维护性和可管理性。
在选择KDT测试工具时,确保它允许您以这种方式组织测试。测试目标应该清楚地记录下来,并与测试模块和测试用例链接起来。如果该工具还将这些测试项作为对象存储在数据库中,这样您就可以创建关于测试开发进度的定制报告,并使项目的健康状况对所有涉众可见,那么这将是一个加分项。
如果您没有从一开始就涵盖所有的测试需求,请不要担心。有了这个高级测试设计,您就已经有了一个坚实的基础。稍后,如果有新的测试想法出现或者出现新的测试需求,您可以返回并添加更多的测试用例和测试模块。重新排序或移动测试用例来改进测试模块的质量也不是问题。
低级的测试设计
在测试模块中,常见的做法是将测试用例“链接”在一起。测试用例可以使用前一个测试用例留下的状态。这种链接技术帮助您创建一个连续的测试流。它还可以节省测试准备和测试清理的时间。例如,您不必为每个测试用例重新加载测试数据或登录系统。
另一方面,您应该保持测试模块彼此独立,以满足“自包含的”标准。如果测试模块相互依赖,您将不能在冒烟或回归测试套件中自由地重新安排它们的顺序。因为你意外地增加了一层复杂性,使你的工作更加困难。
05
#2 将业务级测试与交互级测试分开
业务流分析
为了增加测试覆盖率,我们通常建议我们的客户开始使用一种称为“业务流”技术的方法来分析测试需求。在尝试测试软件系统时,请找出业务流是什么,以及哪些业务对象涉及到这些业务流。
业务对象是被测试系统保存有关数据的项。例如,汽车销售系统中的客户和汽车都是业务对象。但是不要忘记概念对象,如订单、发票、应收账款等。
经过多个步骤的大多数系统事件涉及多个业务对象。结果,数据库中那些业务对象的数据得到了更新。我们将其中的每个流程称为业务流。
例如,互联网用户打开浏览器,导航到电子商务页面,搜索产品,添加一些个人信息,下订单,用信用卡支付,然后检查订单状态。您应该将整个“故事”捕获为业务流。或者有些人会将其描述为一次用户旅行。
使用业务组织测试
基于业务流分析,您可以按业务对象和业务流对测试用例进行分组。使用下面的模板作为构建测试项目的起点。
您可能注意到,在每个业务对象下,我们进一步将测试用例分为两种类型:业务级和交互级。
业务级测试:这些测试主要关注在业务对象上执行的业务操作。我们通常使用缩写CRUD(创建、读取、更新和删除)来描述业务对象的生命周期。但是,除了这些基本操作之外,您可能还希望对业务对象执行其他操作,如复制、移动、分类、枚举、转换、序列化、导入、导出等。测试这些操作也是业务级测试的一部分。
交互级测试:这些测试集中于UI交互,例如验证“Check Out”按钮是否存在,系统是否正确验证“Email”文本字段,或者用户是否能够使用键盘快捷键(热键),等等。尽管它们听起来很基本,但这些测试对于确定测试失败的根本原因是必要的。
下面的图片说明了业务级测试和交互级测试之间的对比。
交互级测试
业务级测试
在设计测试时,尝试将业务级和交互级测试分开,并将它们放在不同的桶中。我们已经看到太多的测试团队在半夜收到一个充满错误和失败检查的测试报告时惊慌失措,仅仅是因为他们将交互级和业务级检查点混合在一个冗长的测试流中。
06
#3 构建一个健壮的关键字库
测试开发活动的核心当然是关于编写实际测试脚本。在编写测试时,有时我们要查找的关键字并不存在。在这种情况下,有一个简单的解决方法——编写一个新的。
构建新的关键词本身就是一种艺术。下面我收集了一些经验教训,以帮助您为KDT项目构建一个健壮的关键字库。
不要重复
在创建一个新的关键字之前,确认在关键字库中绝对没有类似的关键字存在。创建重复的关键字是一个大错误,它会反过来以技术债务的形式咬你。
为了避免重复,建立命名约定并说服您的团队坚持它。例如,如果您命名第一个关键字“check account balance”,不要命名第二个关键字“verify car exists”。虽然“check”和“verify”在语义上是相同的,但是让这两个词到处出现会造成不必要的麻烦。
从工具的角度来看,选择一个具有自动完成功能的测试工具,它可以搜索整个关键字库(包括内置的和用户脚本的关键字),并在键入时建议最佳关键字匹配。这样的功能对于更快地找到您需要的关键字以及避免创建重复关键字非常有用。
例如,当你在一个测试用例中输入一个关键字名称时,下图显示了一个自动完成菜单(截图来自TestArchitect IDE)。
如果自动完成菜单包含有用的信息,比如关键字的描述和所需的参数,这也是一个额外的好处。选择关键字后,自动完成函数还应该自动填充所需的字段,如参数名称和参数默认值。这个函数确实节省了您的时间并加速了您的测试开发。
原子关键字
当你确实必须创建一个全新的关键字,为你的关键字选择一个明确的关键字名称和描述性参数。最重要的是,每个关键字应该只有一个明确的功能。如果一个关键字不能进一步分解成更小的关键字,我们称这个关键字为“原子”。
另一方面,如果一个关键字执行多个不相关的功能,你很快就会发现自己违反了上面的枯燥规则:复制一个关键字来根据你的喜好创造一个新的关键字,因为原来的关键字只能满足你70%的需求。如果出现这种情况,花一点时间将大关键字分割成两个或更多的“原子”关键字。
原子关键字提供了更高的可重用性。而可重用性是提高测试开发速度的关键成功因素。一旦您完成构建“原子”关键字的坚实基础,稍后构建复杂的业务级关键字就会变得更容易(请参阅下面的部分)。
一开始就要考虑可伸缩性
对于较大的项目,我们经常建议我们的客户将关键字库分为三个层次,即“低级”、“中级”和“高级”关键字。拥有不同的抽象级别是扩展KDT项目的关键。
高级关键字是面向业务的关键字,如“创建客户”或“租车”。它们隐藏了UI交互细节,比如要经过哪些屏幕以及要单击哪些按钮。
低级关键字与应用程序的GUI(甚至CLI或API)相关。这些低级关键字用于创建交互级测试(在最佳实践#2中描述)。
中级关键字处理导航详细信息和数据条目,这些信息可以在高级关键字之间共享,以便于维护。例如,“输入税务表格”关键字可以组合多个中级关键字,如“输入个人信息”,“输入受养人”,“输入编制人员信息”等。
如果可能的话,选择一个测试自动化工具,它允许您将低级关键字组合成中级和高级关键字,而不需要太多的编码。下图显示了两个低级关键字。
您可以将这两个低级关键字(“检查树项”和“检查列表项存在”)组合成一个高级关键字,名为“项目中的检查任务”。然后将这两个关键字调用替换为测试用例中的一个关键字调用,即“check task in project”。
高级关键字可以提高可重用性。此外,业务领域专家甚至IT和运维专家都可以很好地理解它们。因此,它们经常被用来作为团队内外不同角色之间有效的沟通工具。
由于您现在有许多抽象级别,测试模块中使用的关键字的精确抽象级别应该符合该模块的范围。特别是,低级关键字如“点击”和“进入”应该在交互级测试模块中使用。
另一方面,“输入客户”和“检查账户余额”等高级关键字更适合业务级测试模块和端到端验收测试。
低级关键字应该是平台无关的
您的测试自动化工具应该抽象出被测平台的技术细节。例如,维护一个关键字的独立平台版本是很累人的,比如“windows上的点击按钮”,“macOS上的点击按钮”,“使用Selenium点击按钮”,“Android上的点击按钮”,“iOS上的点击按钮”等等。
因此,理想的工具应该提供与平台无关的低级关键字。这些关键字不应该依赖于特定的应用程序或平台。关键字如“点击”,“选择菜单项”或“发送http请求”应该顺利运行在尽可能多的应用程序和平台。
健壮的关键字库是KDT项目成功的最重要因素。你可以期待深思熟虑的关键字设计的投资回报率高达10倍。如果在KDT中只有一件事是您必须知道的,那就是构建一个健壮的关键字库的艺术。
07
结论
关键字驱动测试功能强大。然而,实现一个有效的KDT框架绝非易事。设计和实现一个框架需要广泛的系统思维、设计思维和技术熟练度。这也是一个不断改进的迭代过程。
如果您坚持我在上面列出的三个最佳实践,那么使用KDT进行测试自动化将会像预期的那样成为一个愉快的旅程。
往期精彩文章:
自动化测试:如何构建Selenium框架
自动化测试的这几个坑,你掉进去过吗?
您应该遵循的15个UI测试自动化最佳实践(上)
您应该遵循的15个UI测试自动化最佳实践(下)
你需要了解的自动化测试框架知识
浅谈测试自动化
关于作者