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.

139 lines
11 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.

# 093KU法则为一个订餐系统设计全栈测试方案
你好,我是柳胜。
上一讲我们找出了FoodCome订餐系统各截面的测试需求今天我们就根据这些需求完成测试设计给这个订餐系统设计一个全栈的测试方案。我们前面讲到的很多思路和原则都能在今天的课程里得以应用。
这个测试方案非常关键,它能回答自动化测试设计中的四大基本问题:做不做自动化?在哪里做、怎么做、怎么运行。这四个基本问题梳理清楚了,自动化测试项目就相当于有了骨架。
## FoodCome的订餐需求
我们先列出前几讲提炼的测试需求,每项需求都过一遍上面的问题清单。让我们头脑中的测试方案,形成一个文档化的列表。
结合FoodCome订餐系统的例子我们把测试需求整理如下
![图片](https://static001.geekbang.org/resource/image/63/6f/63508b5588b2d7ed2bd06ef5d4efd46f.jpg?wh=1920x657 "测试需求表1.0")
订餐系统还有很多其他的测试需求,比如兼容性、安全性等等,因为本专栏的关注点是自动化测试,我在这里就不再列出来了。
## 做不做自动化测试?
有了文档化的测试需求列表后,我们在设计自动化测试方案时,需要先想清楚,这些需求做不做自动化测试?
**测试四象限法则**能帮我们有效完成这个思考过程。这个测试四象限是布雷·麦瑞克提出来的方法模型根据需求的性质和等级2个维度对测试需求进行分类。
一个维度是**测试需求的性质**,是技术性还是业务性的?通俗来说就是,如果这个需求越靠近程序员的思维,比如算法、接口、事务等等,它的技术性就越强;而越靠近用户的思维,比如工作流,场景等等,就是业务性越强。
另一个维度是**测试需求的等级**,也就是需求属于关键性的还是精益性的?你可以这样理解,关键性的需求指的是,对于用户显式而重要的需求。比方说,一个系统必须能下单,才能成为订餐系统。而精益性的需求指的是用户隐式的需求,没有直接表达出来,但也可能很重要,比如性能、可靠性等等。
明白了性质和等级这2个维度后我们现在用这两个维度把测试需求列表过一遍把它们填到象限里。
![图片](https://static001.geekbang.org/resource/image/33/e0/33a6ee6dc3056306eb7a9ec27d6f04e0.jpg?wh=1920x1430 "测试四象限")
先看算法、接口、分布式事务测试它们技术性强、也是关键需求放在了第一象限WebUI测试业务性强且属于关键需求放在了第二象限易用性测试放在第三象限性能和可靠性放在第四象限。
针对每个象限,测试四象限法建议自动化测试实施策略如下:
* 第一象限里的测试需求是100%全部自动化;
* 第二象限里的测试需求是自动化+手工;
* 第三象限里的测试需求是手工测试;
* 第四象限里的测试需求是通过工具和框架来执行追求0代码。
四象限的策略你不必死记硬背因为这些只是表象底层逻辑还是ROI学会了分析思路你自己也可以推导结论。
举例来说第一象限里的算法和接口测试因为它们验证的是关键功能所以回归测试高自动化测试收益就大。而技术性强意味着这类测试不会因业务变化受太大影响所以开发、维护的成本就低。因此第一象限的测试需求可以100%自动化。至于其他象限的情况你可以自己试着推演一下同样符合ROI的规律。
到这里通过四象限法则我们已经有了一个自动化测试Yes or No的决定。更新一下表格加入自动化测试Yes or No一列。
![图片](https://static001.geekbang.org/resource/image/32/71/322a2848b6ed0fef4991f5f1c4694871.jpg?wh=1920x992 "测试需求表2.0")
这张表是我们自动化测试方案迈出的第一步。现在,我们就能根据测试需求的性质和类型,判断它的测试方式是自动化测试还是手工测试了。
## 在哪个层面做自动化测试?
确定了测试方式我们还要进一步考虑这些测试需求的自动化测试是应该在哪个层面实现呢在单元测试、接口测试还是UI自动化测试
在专栏的[第二讲](https://time.geekbang.org/column/article/497405)里我们学习过3KU测试矩阵和3KU测试金字塔那就可以把它们应用到FoodCome的自动化测试设计了。
排除掉前面表格里提到的手工测试项我们把其余内容填入到3KU测试矩阵里。
![图片](https://static001.geekbang.org/resource/image/c7/55/c71a9cf6753e805b3133e4be46285d55.jpg?wh=1860x678 "3KU测试矩阵")
按照自动化测试寻求最大ROI实施层面原则我们把上面的表格转换成ROI自动化测试金字塔。
![图片](https://static001.geekbang.org/resource/image/9c/10/9ce694440dc1802fe7cd68c96e26b110.jpg?wh=1920x1074 "ROI自动化测试金字塔")
在ROI自动化测试金字塔里我们又确定了两个信息。
第一各个需求自动化测试实现的截面单元测试截面上测试算法和分布式事务接口测试层面来验证技术契约、服务接口和分布式事务UI层面做用户下订单自动化测试和部分业务契约的验证。
第二各部分自动化测试规模的配比按照金字塔形状单元测试案例最多接口测试居中UI自动化测试案例最少。
现在,我们再次更新表格,把在哪一层做自动化,还有工作量分配的比例加进去。
![图片](https://static001.geekbang.org/resource/image/1a/4b/1a057d7fca983dd42707207115e0444b.jpg?wh=1920x837 "测试需求表3.0")
好,到这里,这个表格里,我们针对每个测试需求,已经做出了自动化测试方案,包括做不做自动化测试,在什么层面做自动化测试,做多少自动化测试。
下面,我们继续完善,把这个方案想周全。
## 用什么工具做自动化测试?
选择对了工具和框架,会让自动化测试事半功倍。这个“选对”的意思,就是工具必须适合你的项目、你的团队。
在[第三讲](https://time.geekbang.org/column/article/498458)“怎么选型自动化测试工具和框架”中我已经和你分享了怎么选择工具的方法和原则。在工作量大的单元测试和接口测试要选择成熟和支持模块化开发的工具比如JUnit和Restassure在工作量较小的UI测试工具的稳定性最重要其次追求效率。
在这里我直接给结果具体列出了FoodCome各个自动化测试技术和工具你可以想想为什么选取它们。
![](https://static001.geekbang.org/resource/image/00/fa/009d1455457c47ac454409217a92c0fa.jpg?wh=4131x1947 "测试需求表4.0")
## 怎么运行自动化测试?
在自动化测试方案里,除了做不做自动化测试,以及在哪个层面做。我们还要考虑清楚另外一个事,就是自动化测试开发出来后,它们在什么时候运行。
在第一模块里我们讲ROI的时候经常提到一个自动化测试的收益其重要因子之一就是它的运行次数。所以设计ROI高的自动化测试的运行场景是很关键的而软件部署管线Deployment Pipeline就是重要的自动化测试运行场景之一。
那Deployment Pipleline是怎么设计的呢先从概念说起在2010年Jez Humble 出版了《持续交付》一书,这里提出了部署管线的概念:
> “部署管线是代码从开发人员的个人电脑到生产环境的自动化过程”。
为什么会叫管线呢?因为部署管线由一系列测试的阶段组成,每个阶段首尾相接,这就形成了一条流水线一样的管道。
部署管线通常是这样的:
![图片](https://static001.geekbang.org/resource/image/f8/ea/f86f5a0da0c071b2a183b96ed36f1aea.jpg?wh=1920x604)
我们把FoodCome的自动化测试任务填充到部署管线的各个阶段里去如下图所示
![图片](https://static001.geekbang.org/resource/image/d1/d4/d1yy204a9c8d3d6682e19545a5434dd4.jpg?wh=1920x850)
沿着部署管线发布的方向也就是从左向右自动化测试的运行速度由快变慢而ROI也是由高到低。**越靠近代码活动越频繁ROI就越高**,而每一个关卡都会有失败的,最后能成功到达可部署生产环境的会是很少一部分,十次代码变更能有二次到生产环境。
所以后面测试阶段得到运行的次数比较少相应ROI也比较低。
这样的规律对我们工作有啥帮助呢?其实不难想到,我们要尽量把自动化测试放在管线的开始端,只要它具备条件,而且够快,这也是我们在[第六讲](https://time.geekbang.org/column/article/501526)里提到的自动化测试左移实践。
## 小结
今天我们给FoodCome订餐系统整理了一套全栈自动化测试方案。这个方案里要回答自动化测试项目的四个问题这些问题也是测试设计最基本的问题。那就是给定一个测试需求我们做不做自动化具体在哪里做、怎么做、怎么运行。
1.要不要自动化这里我们用到了测试需求2维度4象限法帮助我们分析每个需求的性质和等级遵循最佳实践来确定它们需不需要自动化。
2.在哪个层面做自动化分配多少工作量这里我们用到了第一模块学到的3KU测试矩阵和3KU测试金字塔从ROI的角度来回答这些问题。
3.用什么工具做自动化每一个层面我们都要使用工具来帮助我们做自动化。在这里工具不选择最好的但要根据团队和项目情况选择最合适的、ROI产出最大的工具。
4.自动化测试怎么运行应该物尽其用我们投入工作量最大的单元测试和接口测试它们应该在交付管线Pipeline里运行次数最频繁这样才能收获好的ROI。
![图片](https://static001.geekbang.org/resource/image/59/37/5993b6d561f18f16ee6eb24f8d691437.jpg?wh=1920x1080)
回答了这些基本问题后,我们自动化测试方案的骨架也就建立起来了。在实践中,你还可以结合团队的人手、项目的时间等等因素,来填充方案的血肉,比如设定任务的优先级等等。
接下来的课程里,我们还会进入到每一个测试点,看看怎么实现,敬请期待。
## 思考题
结合你的工作实践想一想,要怎么回答自动化测试设计中这四大问题?
欢迎你在留言区跟我交流也推荐你把这一讲分享给更多同事、朋友说不定就能帮Ta搞定下一次的测试方案设计。