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.

127 lines
12 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.

# 18元数据模型小Job模型构建大蓝图
你好,我是柳胜。
上一讲我们分析了传统自动化测试设计态和运行态存在的鸿沟并且提出了一个更科学的Job模型的设想。如下图所示这个模型包含七个核心属性其实也是后续在设计自动化测试案例时我们需要考虑的七个方面也是后续开发中要去实现的Interface接口
模型属性我们上一讲开了个头重点讲了Dependency和TestDataDependency描述业务关联性、阻断错误、缩短执行时间TestData可以实现一份代码多组数据运行提升自动化测试的ROI。
今天咱们继续分析剩下的模型属性勾勒整个Job模型的全貌这样你就能进一步掌握自动化测试设计建模的利器了。
![图片](https://static001.geekbang.org/resource/image/b7/59/b7b0596e823yya466ff87373b205e359.jpg?wh=1920x1310)
## 模型属性
自动化测试有一个令人头疼的问题——不稳定,经常失败,有没有办法通过设计攻克这个难题呢?
自动化测试Job像开发的微服务一样都是独立的运行单元我们可以通过给每个Job增加一个**TestConfig**它的数据表达类型是HashMap每一条记录代表一个配置我们通过修改配置来控制Job的运行。结合实践**有三个关键配置,可以增强自动化测试的健壮性和诊断性,分别是:日志级别、超时时间以及重试次数**。
Log是诊断程序运行问题最有力的工具自动化测试也不例外通过定义不同的log级别和相应输出信息把它应用在不同环境下可以形成一个自动化测试诊断策略。比如Log level 如果是debug级别抓取环境信息、屏幕截图、运行时堆栈用于在自动化测试开发阶段做调试。Error级别记录出错trace和调用Job链状态用在自动化测试生产运行环境。
我建议你在设计自动化测试Job的时候一定要在TestConfig里加上**Log\_Level**用来提醒测试开发人员在自动化开发中实现相应的Log信息的收集、分类和输出机制。
我们再看看超时问题在自动化测试运行中经常会因为各种奇怪的原因导致运行不能返回单元测试中阻塞调用不能返回API测试中Http response超时UI测试中页面刷不出来。
通常在技术层上不会无限等待也有TimeOut的限制比如http request的默认超时是120秒我们这里关注的Timeout是执行整个Job的时间最大限值从而保证自动化测试可以满足快速反馈的目标。
所以我们应该在TestConfig里有一个Job的超时配置**TimeOut**: 3min, 提醒自动化测试开发人员去做相应的代码实现。
定义了超时处理机制后我们再来看看Retry重试这是开发人员提高代码运行健壮性的常用手段其实对于提高自动化测试的健壮性也很关键。
咱们在UI测试里经常遇到一些状况比如在低环境里环境不稳定有的页面刷一次出不来第二次就没问题了。手工测试时测试人员通常会自己多刷两次把功能测试完这种不稳定性的问题只要在生产环境里不重现即可。
那自动化程序怎么处理这种状况呢?我们可以加入一个**Retry\_Number**的配置项它的value是N。是什么意思呢Job运行1次不成功还可以尝试最多N-1次直到成功或在N次失败后才返回失败状态。
在**TestConfig**中定义Log\_Level、 TimeOut、 Retry\_Number这些配置项实际上是我们针对自动化测试的运行不稳定问题而设计的解决方案。TestConfig本身是一个HashMap当然也可以加入其它你认为有用的配置项。至于怎么实现那是代码阶段要去做的事情。
说完TestConfig后别忘了我们还需要一个属性**Document**来存放Job的描述信息。它的数据表达类型是一个对象Document里可以存放Job的名字、测试执行步骤、测试环境信息等等。
到这里我们的Job模型六边形最终更新成了下面的样子。
![图片](https://static001.geekbang.org/resource/image/e6/f7/e6de0d6d56ea556f8584de2353e51ff7.jpg?wh=1920x1310 "自动化测试Job七属性模型")
讲到这里你可能又有一个疑问不对啊之前学自动化测试都是在学框架最重要的框架是不是忘了放进自动化测试Job模型里
这正是我要强调的在自动化测试Job模型里我们关注的是设计是如何满足测试需求和提高自动化的效益。而工具或框架它是Job实现层面所关注的内容。
我们用Selenium也好QTP也好它们可以帮助我们实现设计意图但不能喧宾夺主倒逼我们按照它们的结构来设计否则我们永远是一个工具使用者而不能成为一个有设计思维的自动化测试人员。
这就相当于软件开发中先定义了微服务实现业务接口至于每个微服务选择哪种语言作为编程语言选GO还是Java这要交给开发人员根据经验和喜好权衡。
所以说在Job模型里七大属性是设计面的而框架是Job实现面的。为了更好地理解我们把刚才的六边形架构展成UML类关系图就会看到框架在垂直下方。
![](https://static001.geekbang.org/resource/image/83/4c/8388717b5b84d648073c0ff32ab1204c.jpg?wh=4435x2260 "Job模型UML对象关系图")
## 模型层级
听到这里你也许对Job模型有一点点明白了但困惑也不少。以前接触的都是TestSuite和TestCase这些概念这个Job模型到底说的是啥是一个TestCase还是一个大场景
我们暂且忘记TestSuite和TestCase你先想一下软件设计是怎么做的一个系统的行为设计是为了解决一个大问题把这个大问题分解成若干个小问题对应着系统分解成服务依次递归下钻一直到单元级别。大问题与小问题同构系统与服务同构这叫自顶向下的设计。
讲到这是不是顿时开悟了Job模型描述的是一个同构的测试任务它既可以是一个小小的测试案例也可以是一个大大的测试需求。这小和大之间是通过组合编排来完成的。
Job之间到底是如何组合的一生二二生三三生万物这描述的是一个树形关系软件架构如此自动化测试Job也一样。
一个Job的定义是由父节点完成Job的实现由它的子Job们完成。我们可以类比开发的Interface、abstract class和final class理解根节点和子节点的用处。
![图片](https://static001.geekbang.org/resource/image/c6/86/c6686eb4eaa6aeebb6237dbcf9912186.jpg?wh=1920x951 "Job模型层级图")
图中的根Job是我们运行的自动化测试的任务对应着interface。我们需要按照Job模型设计它的Input、Output、TestData、TestConfig等信息叶子Job这是已经实例化可运行的Job相当于final class也就是说一定有代码来负责这个Job的执行在根Job与叶子Job之间的Job相当于abstract class起到功能和接口划分的作用。
我们最终是要跑Job的在Job跑起来的时候会通过这个树形链接传递一些信息我们定义以下四条规则。
1.一个Job的运行实际上是运行其所有的子Job并且Input和Output上也等价。也就是说Job1 = Job11+Job12。 Job11+Job22是实现了Job1的定义。
2.Job的运行结果是其子Job们运行结果的与运算。这个很好理解Job11和Job12全部成功才能设定Job1成功有一个失败Job1就会失败。
3.子Job默认继承父Job的属性除非自定义了属性去覆盖父Job上的同名属性。像TestConfig比如父Job上已经定义了log级别为error那么对其下子Job也适用除非在子Job里定义不同的log级别。
4.一个Job的Depdency只能指向和它同一层次的Job。Job113可以一来Job112但是不能依赖Job12。
这个层次模型可以用自顶向下来去设计也可以自底向上去组合。所以根Job是相对的不是绝对的它完全可以和另外的Job组合在一起生成一个更大的Job。
比如IT Ops开发的产品部署监控自动化Job对他们来说是终极任务但是也可以和QA团队的测试自动化Job组合在一起进行环境信息对接形成一个部署测试一体自动化的Job这就是我们常用的Pipeline。Pipeline本身就是一个有Input和Output的JobPipeline之间可以再对接组合成更多的场景。
## Job模型设计的四大优势
到这里我们已经把Job模型讲完了。明确了这个模型的设计之后我们不妨进一步思考一下Job模型是怎么帮助我们做好自动化测试的呢我们可以从这四个方面来理解。
**第一,高可复用的自动化测试模块化设计。**像软件设计逐层分解系统、子系统、服务和模块一样自动化测试可以自顶向下分解一个大的任务到中任务再到小任务直到可执行的代码级别也可以自底向上聚合成新的测试场景比如API测试可以和UI测试聚合生成跨端测试。
**第二,低成本的扩展和重构。**Job任务的定义是基于自动化测试的需求并不预先依赖于某个工具框架的实现我们重构Job也更轻松了。更改一个Job里的实现代码甚至更换工具从QTP切到Selenium只要保持对外的Input和Output不变那这就属于内部的事不会影响到其他关联Job。这就叫高内聚低耦合。
**第三,动态的生成执行计划。**在Job执行的时候根据我们定义的运行规则就可以把树形图展成可执行的有向无环图获得关键路径、关键Job从而动态确定最优执行计划。
**第四,有助于后续的度量和改进。**有了统一模型来做案例设计和自动化测试实现我们就可以获得准确的度量数据了比如自动化测试覆盖率、自动化测试ROI等等可以持续驱动自动化测试效益的提升。
## 课程小结
我们通过两讲一起推导建立了微测试Job模型。我这里再总结一下Job模型包括属性和层级两个方面。
七个属性其实是回答了自动化测试里七个可以提高ROI的关键问题
* Input&Output测试Job的输入和输出是什么
* DAO测试Job应该用什么格式怎么持久化自动化测试报告、日志、抓图等等。
* Depdedncy测试Job的前置条件是什么由谁来提供
* TestData测试Job的测试数据是什么结构需要多少组
* TestConfig测试Job的运行时需不需要通过配置来调节比如健壮性、诊断性、环境信息等等。
* Document测试Job的其它信息。
我准备了图解,方便你记忆:
![图片](https://static001.geekbang.org/resource/image/f2/e3/f2481327e3d0dea9cdfcyy80fyy3a9e3.png?wh=1792x1142)
当你想清楚了这七大属性就相当于Job的接口已经确定了。
但刚开始做自动化测试设计的时候,也是先想到一个大概要完成的任务,不可能一下子就到脚本实现的级别。就像软件设计,也是先有概要设计,再做详细设计。
微测试Job怎么赋能自动化测试开发人员做设计呢那就是Job的层级能力Job下面可以有子Job一层层做细化直到叶子节点Job是可开发的自动化测试案例至于怎么实现那是自动化测试开发阶段需要考虑的事情。
你可能会问这个Job模型真的好用么可以用来做设计么后面的课程里我还会用几个实例为你演示一下怎么用Job模型来完成自动化测试的设计敬请期待。
## 练习题
请用测试微Job七要素模型描述一下你目前正在使用的测试案例。注意不要代入工具和框架。
欢迎你在留言区跟我交流讨论,也推荐你把这一讲分享给更多朋友。