You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

146 lines
13 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 03工具选择什么工具框架值得用
你好,我是柳胜。
工具选型评选会你应该不陌生无论你是作为评审者还是方案建议人。不过常常出现的场景就是方案建议人讲了一通新工具A如何优秀强大从问题分析到方案解决一应俱全。但参会专家并不是全都熟悉这个新工具就会问出一堆类似“为什么你不用工具B”的问题。
结果也可想而知懂A的不懂B懂B的不懂C懂C的不懂A最后评审会咋决策只好陷入一个依靠个人影响力来决策的模式。要破除这种死循环就要找到一个量化模型。在我看来量化数据才是团队有效交流的手段也是团队达成共识的基础。
有了这样的模型,好处多多。评审阶段,可以更科学地预估某个工具的能力和风险;工具投入使用后,模型依旧能帮你持续观测,检验这个工具是否带来了预期价值。
今天我会带你一起推演出这个模型。学会推演方法,远比套用“模型”更重要。
## 自动化测试案例的成本
在开始量化评估之前我们先回顾一下前面学过的ROI模型。
![图片](https://static001.geekbang.org/resource/image/cd/00/cd34280bc70b3633e696a7ba16f9e300.jpg?wh=1920x868)
通过这个模型,我们得到一个重要结论:**一个自动化测试案例的开发工作量,在给定条件下,什么经验的工程师用什么工具,需要多长时间完成,这是可以估算的定值。但维护工作量包含了多种可变因素,是自动化测试项目的风险所在。**
今天我们聚焦公式里的分母也就是开发成本d和维护成本m。
先说开发成本。在软件开发中估算开发规模的传统方法有功能点和代码行前沿的方法也有用AST抽象语法树。那如何估算开发一个自动化案例需要多大工作量呢
首先我们要看一下自动化测试案例是如何产生的目前在业界主要有5种方式。
### 方法一:录制和回放方法
第一代的自动化测试工具大多基于录制回放像最早的WinRunner就是录制桌面UI应用的。目前代表工具就是Selenium IDE。
要生成测试代码很简单开启浏览器Selenium的插件打开测试的网页比如http://www.baidu.com输入关键字“极客时间”点击搜索就会自动生成测试脚本了如下图。
![图片](https://static001.geekbang.org/resource/image/ae/39/aec0fcf088f853f9a1b684476052bc39.jpg?wh=1920x1364 "自动生成测试脚本演示")
通过录制产生自动化脚本的这种方法优点是速度快、零编码对测试人员技术要求低。缺点是规模一旦扩大维护工作量几乎无法承受比如和CICD集成、自定制报告、多环境支持等等。
### 方法二:关键字驱动
不过,录制回放产生的脚本,还是面向过程的一个个函数,还需要测试人员有一定代码基础,才能扩展和维护这些函数。
那么,有没有办法,让没有代码经验的人也能编辑、维护脚本呢?关键字驱动方式应运而生了,它增加了页面控件对象的概念,调用对象的方法就是操作对象运行,在这种机制下,对象、对象的行为、输入的数据和描述信息,这些内容都能用一个表格的形式呈现。业务人员只需要编辑表格,就能修改运行逻辑了,这就叫做**关键字驱动**。
下面是一张关键字驱动表格,编程就是编辑表格里的关键字和对象。关键字是一组预定义好的指令,编辑完表格后,框架会驱动这个表格,执行设定好的命令,来完成自动化测试。
![](https://static001.geekbang.org/resource/image/4b/9c/4bbfd55d324e056f7e78d064526a509c.jpg?wh=3552x932 "关键字驱动表格示例")
相比录制回放关键字驱动框架的优势在于降低了测试开发人员的技术要求。而且测试开发人员对代码还有了更多的逻辑控制能力比如增加循环结构、wait time、log输出只要框架提供足够丰富的关键字就行。
但你也不难看出,编辑表格的人和维护关键字仓库的人,并不是同一拨人。前者是对业务了解的测试人员,后者是技术能力强的开发人员,这样开发维护起来会增加难度。
### 方法三:模块库开发
随着软件技术的发展,自动化测试人员的技术水平也在提高,要解决的问题也更加复杂。比如自动化测试的代码怎么能够有效地复用,有没有好的扩展能力等等。这个扩展能力是二维的,分为水平功能扩展和垂直层级扩展。
水平功能扩展指的是测试功能增多,自动化测试代码就借鉴了软件的模块设计思维,一个应用的测试场景可以切分成多个功能模块。比如订餐的流程可以分成登录模块、下单模块、快递模块,模块之间通过调用关系连接起来,组成测试场景。
![图片](https://static001.geekbang.org/resource/image/4c/60/4cd575d922bca8d498574d76b1824a60.jpg?wh=1920x396 "订餐流程模块示意图")
而在技术层面上又可以垂直切分出功能案例库和通用库。比如页面的组件可以形成复用库、page对象、button对象、link对象等等把和开发技术耦合的技术层封装在复用库里而和测试相关的业务功能实现在功能案例库里。
![图片](https://static001.geekbang.org/resource/image/74/01/74b3b5bc5f60fd5bc37c58c73bfb1501.jpg?wh=1920x811 "订餐流程垂直切分示意图")
这样的设计,遵循了高内聚低耦合的软件设计思想,未来自动化测试规模扩展时也很方便。比方说增加一个支付功能,就可以把支付页面的对象写到复用库里,新创建一个支付测试案例,前面和下单模块衔接,后面和快递模块对接,就能跑起来了。
![图片](https://static001.geekbang.org/resource/image/0e/96/0ed618bbb3ae23123c4a449eae470196.jpg?wh=1920x592 "模块扩展示意图")
模块库开发的优点是可扩展、可复用,困难是需要架构工作和代码工作,对自动化测试开发人员的代码能力要求也比较高,接近开发工程师。
### 方法四BDD混合框架
还有一种方法是BDD混合框架。BDD全称是Behavior Drive Development行为驱动开发它通过Gherkin语法定义测试场景。
Gherkin语法包含一套类自然语言的关键字when、given、thengiven描述条件when描述行为then描述结果。这样一个场景的3要素上下文、动作和结果就说明白了。
所以Gherkin语法描述出来的测试场景能够同时被非技术和技术人员理解。客户、需求人员、开发人员和测试人员从BDD案例各取所需需求人员得到用户手册开发人员得到Use Case测试人员得到测试案例。这些都有BDD框架支持生成代码比如Cucumber。
![图片](https://static001.geekbang.org/resource/image/6b/64/6bf0e210588aeae67b9a59a2714c1064.jpg?wh=1920x1051 "BDD方法示意图")
BDD和关键字驱动框架的优缺点基本一样不同的是BDD不局限于测试框架能够和软件流程集成在一起也有相应的开发IDE插件比如Eclipse plugin。
### 方法五更高ROI的探索自动化前沿技术
最后,我要说一下目前比较火,听起来也很酷的自动化前沿技术。
AI测试曾被寄予厚望我们期待由它发展出一套自动化测试全栈解决方案可以自动生成测试案例和代码而且维护工作量为零。不能说这些全都是镜花水月我相信目前AI只在一小部分测试领域里落地比如图像识别的Applitools可以用作图片验证游戏领域里的监督学习用来行为克隆等等。
我也曾看过一些AI根据规则自动生成测试案例的演示但演示只是演示它演示的方案需要的很多条件现实还不具备比如基于非常理想的数据模型等等。所以我认为AI“落地”的定义是它的形式是产品而不是个人业余的项目或者一段开源代码。
相比AI测试我更看好另外一种自动化生成测试的思路就是基于规则化或可以模式化的业务场景把案例的生成和代码生成一并自动化形成一种可以量化的案例发现方案。我会在第5讲带你了解这个思路如何实现。
记住,**测试工作是要能证明软件功能的成败,其方法论基石是确定论,而不是未知论**。说得通俗一点,测试是在编网,虽然网会漏鱼,但我很确信只要投入人手和时间,就能把网编到什么程度,网住什么鱼。 而不是今天我捉到一条鱼明天不知道鱼在哪里。这是我不认为AI能完全替代手工测试工作的原因。
好,业界已知的生成自动化测试方法,我们做了归类了解,接下来再分析不同类型的自动化测试开发成本和维护成本。
我给这个表格起一个名字,叫做**案例DM分析表**。D代表DevelopmentM代表Mantainence。
![](https://static001.geekbang.org/resource/image/9d/40/9d9a670b5db7b775b9990a4cae48fb40.jpg?wh=4000x2490 "案例DM分析表")
## 工具的成本
前面探讨的给定了类型工具的情况下,案例的开发、维护成本如何衡量。但别忘了,成本计算时,还有个不小的成本:工具和框架的成本。这个在选型阶段没有考虑的话,会给后面埋下很多隐患,带来不少让人头疼的问题,比如下面这些。
1.当你的团队开始上手案例开发时发现框架只支持JavaScriptPerl但你的团队都是熟悉Python和Java。在这种情况下是培训已有团队还是招聘新的人才还是弃用方案而选择新的框架
2.当你需要升级框架时,高版本对低版本的兼容性。它有可能让你的原有测试案例不能工作,最糟糕的是,会出现一些奇奇怪怪的问题,每一个问题的诊断过程是一场对你毅力和耐心的考验。
3.当你的案例在运行的时候遇到一个框架抛出来的exception网上搜不到解决方案去社区论坛提问也没人响应自己去看源代码又陷入浩若烟海的context中去那种无力感蔓延开来直让你怀疑人生。
4.当你的案例规模扩展新的API案例需要调用PATCH原语但你已使用了一年的API框架不支持PATCH更悲催的是你发现这个API框架已经停止更新凋零的社区、隐身的支持人员、破败的代码都是对你的毒打。
进坑容易出坑难。我见证过一个自动化测试团队选型工具草率导致在2年内更换了4个工具。每次换工具都会重写一遍自动化测试案例人收获了教训离开公司另谋高就但公司浪费了2年的时间和资源之后还要换一拨人乐此不疲地重复这样的故事。
可以说选型合适的框架是自动化测试架构设计中一个重要的选择它通过开发成本和维护成本两个因子影响自动化测试ROIROI低于1的时候这个项目就要over了。
那什么是ROI好的框架呢
首先,框架要**满足我们的测试需求**。比如UI框架能有对象识别能力API框架能有http原语封装对xml和Json的支持单元测试框架能有mock能力。
其次,框架应该有**广泛的同行用户、持续的更新、成熟的社区和积极的客户响应**这些也能帮我们降低维护框架的成本获得更好的ROI。
把这些因素量化,就能得到一个工具四维成熟度表,你可以把它作为原始模型,用到你的工作里。
![](https://static001.geekbang.org/resource/image/28/fd/28d25d4a9a860947983ed3b853ab2bfd.jpg?wh=3563x2011 "工具四维成熟度表")
## 小结
今天这一讲我们从开发成本和维护成本的角度系统梳理了工具和框架的优劣势。根据脚本的生成方式的不同可以划分出录制回放工具、关键字驱动工具、模块库开发工具、BDD混合工具和AI工具针对自动化的不同类型和规模脚本的开发和维护成本也会发生变化。
框架本身也会有维护成本,这里我们优先选择成熟主流的框架,会降低维护的成本。这里“成熟主流”,我们使用用户的数量、更新的频率、社区成熟度、开发语言与团队的适配度四个指标来对比度量。
我并没有给出一个精准计算工具框架ROI的公式而是给出几个维度来帮你厘清工具和框架的选择思路。
记住,这里有两大原则:
1.按照团队的**技术能力、项目的预期长短、将来扩展的规模大小**选择ROI最大的工具和框架
2.当工具和框架带来的ROI无法升高时就考虑按照原则1 **重新评估**选择ROI更好的工具和框架。
所以工具和框架的评估不是一劳永逸而是在整个自动化测试生命周期内实时观测如果有变要及时止损让ROI持续提升。
## 思考题
在工作中你的团队非常熟悉Python所以选择某个支持Python框架。基于这样的原因做选择是不是遵循ROI原则这样的选择会带来什么样的好处和坏处
欢迎你在留言区跟我交流互动,也推荐你把这一讲分享给更多同事和朋友,说不定就能帮他通过下一次的工具选型评审会。