自动生成测试脚本方案浅析

自动生成测试脚本方案浅析html

转载自 www.sohu.com/a/224590187_748431java

自动生成测试脚本方案浅析

原标题:自动生成测试脚本方案浅析python

文:玉婷编程

本文原创,转载请注明做者及出处构想篇json

做为一名接口自动化测试工程师,平常面临最多的工做就是编写接口自动化测试脚本,那么,在 coding 的过程当中最让你以为枯燥和乏味事情有哪些?网络

痛点app

  • 每次拿到新接口,咱们要手动参照文档在脚本中生成一份接口类,参数越多花费时间越多
  • 需求不一样,但健壮性和部分业务用例重复性高
  • 想重构脚本,接口数据和用例这块纯编写的工做量就会让人望而怯步

天天都要花上30%的时间去写那些不太须要思考的脚本,这真不够自动化!框架

解决方案编程语言

  • 解析文档
  • 梳理适合自动生成的脚本
  • 经过工具生成这部分脚本

预期目标工具

解放双手,下降纯手力劳动占比,进而给本身提供更多的时间去思考、理解产品和设计更多“聪明”的用例

实践篇 自动化获取接口信息 分析接口自动化脚本结构和内容

自动化测试脚本结构图

筛选工做量大又有规律可循的脚本

此处规律不宜太过于复杂,可先选逻辑简单的部分,咱们主要选取如下两部分

  • 接口类,工做时间占比30%~50%,特色:结构特定、数据来源于其它平台

接口类结构图

  • 用例部分,工做时间占比30%~50%,特色:重复度高于80%左右、生成逻辑可描述

用例结构图

解析接口文档

接口信息来源于接口文档,目前市场上比较主流的几个接口文档管理工具备Swagger、RAP、WIKI 或者其余普通文档工具。

下面以解析接口文件为目的分析比较下几款工具的区别:

.

分类 Swagger RAP WIKI
描述 用于生成、描述、调用和可视化RESTful风格的Web服务的框架 可视化接口管理工具 可供多人协同创做的超文本系统
格式 json json html
规范 各个参数、返回值的具体结构、类型有统一规范 同swagger 须要本身约定规范
成本 直接嵌入项目中,经过开发时编写注释,自动生成接口文档,成本较低 须要开发按照平台规则手动输入,成本较高 须要按照约定规范,手动输入,成本较高

若是有条件,你们能够根据开发成本和解析接口文件的难易程度来综合考虑,肯定使用哪一个平台管理接口

咱们项目是 Swagger 和 WIKI 混合使用,因为平常测试看 WIKI 居多,所以早期采用 Python 爬虫利器 BeautifulSoup 来解析WIKIhtml页面

  1. from bs4 import BeautifulSoup
  2. soup = BeautifulSoup(html_doc)
  3. title_string = soup.title.string
  4. # 后面继续解析其余须要用到的接口内容

使用下来发现经过wiki来获取接口信息的一些弊端

  1. 彻底靠人工来约束书写规则不靠谱
  2. 对于复杂的嵌套参数,稍有不按照规范来的,就会致使脚本解析错误,很大程度上形成了解析的难度
  3. 在html上准确的定位信息远比在json上难度大,兼容性差

因而,尝试解析Swagger返回的json来得到接口信息为后面生成脚本作准备

  1. {
  2. "swagger": "2.0",
  3. "host": "xxx",
  4. "basePath": "/",
  5. "tags":[
  6. {"name":"xxx-controller","deion":"xxx"},
  7. ...
  8. ],
  9. "paths": {
  10. "<接口地址1>": { ... },
  11. "<接口地址2>": { ... },
  12. ...
  13. },
  14. "definitions": {
  15. "<实体类1>": { ... },
  16. "<实体类2>": { ... },
  17. ...
  18. }
  19. }

使用如下方式拿到json结果后,就能够直接按照处理字典的方式来获取须要的内容。

  1. graph LR
  2. json-->ApiObj

对于swagger.json的解析和代码生成官方也提供了一些可供使用的库swagger-codegen (java),因为编程语言的限制,咱们使用了python本身解析

如今,咱们已拿到生成代码所须要的信息

自动生成代码 代码生成工具

  1. class CodeGeneratorBackend():
  2. def begin(self, tab="t"):
  3. self.code = []
  4. self.tab = tab
  5. self.level = 0
  6. def end(self):
  7. # return string.join(self.code, "")
  8. return "".join(self.code)
  9. def write(self, string):
  10. self.code.append(self.tab * self.level + string)
  11. def indent(self):
  12. self.level = self.level + 1
  13. def dedent(self):
  14. if self.level == 0:
  15. raise SyntaxError("internal error in code generator")
  16. self.level = self.level - 1
  17. """调用方法,开始生成代码"""
  18. c = CodeGeneratorBackend()
  19. c.begin(tab=" ") # 定义缩进方式
  20. c.write("def function(self):n")
  21. c.indent() # 缩进
  22. # 方法体
  23. c.dedent() # 回退上一次缩进

接口类部分脚本生成规则

因为咱们接口属因而存储在类结构中,所以根据当前脚本的API Object接口进行遍历替换便可

接口用例部分代码生成规则

特殊值用例

给每一个参数生成为0、None、空字符串这样特殊值的用例

定位参数类型

经过接口参数给出的类型,生成符合该类型的值,和一些不符合参数类型的值(健壮性),赋值后生成用例,以下代码示例

定位特定关键词参数

  • 遇到page相关参数可生成分页用例,具体分页测试用例细节就不赘述
  • 遇到相似starttime,endtime参数,可生成两个时间参数和当前时间先后比较的用例,两个时间参数先后比较的用例

该生成规则须要和开发约定一些基本原则,另外也须要咱们在平常测试中多概括总结,找出那些有固定规律的用例,想办法定位生成这类用例

定位接口类型

  • 查询类接口:可生单参数查询、组合参数查询、全参数查询等用例
  • 更新类接口:可生成单条更新每一个参数,组合更新,全量更新等用例

自动生成测试脚本工具介绍 框架流程图

工具扩展性

  • 用例生成规则可扩展,从框架图中能够看到,用例规则这快自成独立模版,可单独维护,便于后续新规则的加入
  • 代码模版可扩展,不一样团队对于代码规范、基础模版的样式都不同,可自定义生成模版的样式,增长了工具的灵活性
  • 支持多种数据类型转换,后续可扩展生成API对象、参数字典或其余数据模式

成果和后续行动 效率提高

以一个优惠券需求为例,大约新增/更新了10个接口(约150个参数请求参数,100个返回参数),包含增删改查几种类型,编写加调试脚本在使用工具先后所花费时间对比,以下:

类型 工做量描述 不使用工具 使用工具 效率提高
接口类 约250个参数 2日/人 1小时内 94%
健壮性用例 约1000条用例 2日/人 1日/人 50%
平均 --- --- --- 74%

从上例能够看出使用脚本后的效率提升了近一半,而从设计到编写完初版工具仅花费了2~3个工做日,仍是很是值得一作的。

聚焦测试

  • 脚本编写工做量的减小,会增长产品测试思考的时间,完善用例,检查覆盖面等

统一规范

  • 统一了接口类输写规范,便于团队内部维护和理解脚本
  • 统一基本用例生成思路,规避测试工程师在设计基本用例设计时有所遗漏;统一用例输出格式,便于他人理解和维护用例

重构利器

  • 若是有计划作脚本重构,使用工具后能够成倍的节省编写接口信息和用例部分脚本的时间

后续迭代优化点

  • 目前用例的生成思路大多还局限在单参数上,多参数的生成思路还较少,后续会经过头脑风暴等形式来扩展更多的用例的生成思路
  • 经过实际调用接口,获取结果,提升自动生成用例指望结果的准确性,继而节省更多对部分指望结果作调整的时间投入

最后想说的是,这个小工具的设计思路远比实现更重要,不管使哪一种语言或库均可以实现解析文件和代码的生成,重要得是按照怎样的思路去生成脚本,在这部分上后续咱们也有不少须要摸索的地方。

手把手教你开发一个 Webpack Loader

Android.Arch.Paging: 分页加载的新选项

React Native 网络层分析

如何实现VM框架中的数据绑定

探索自动化测试的高效执行返回搜狐,查看更多

相关文章
相关标签/搜索