热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于API自动化测试的思考与改进

 年前搞过一段时间的接口自动化测试,从无到有到落地执行,基于 requests 的封装调用,感兴趣可查看历史文章。【初探API 自动化测试】 为什么不用现有的开源测试工具呢?如 J

 

年前搞过一段时间的接口自动化测试,从无到有到落地执行,基于 requests 的封装调用,感兴趣可查看历史文章。

初探 API 自动化测试

 

为什么不用现有的开源测试工具呢?

如 Jmeter、Postman 等:

    1. 公司从提测到出包有一套完整的自动化流程,使用 Jenkins 可以将自动化测试项目接入到流程内,出包就运行自动化测试,保证后端环境的连通性和可测性;

    2. 现有开源工具不易定制和扩展(a. 个人技术达不到; b. 框架部分功能不支持);

    3. 自己写项目,可以更好的理解代码逻辑和实现原理,对自身成长有很大帮助。

 

基于之前的 API 测试,总结了使用过程中遇到的痛点:

  • 不灵活:编写 unittest 风格的测试用例,需要固定格式,如:必须继承 unittest.TestCase、固定前置后置 setup / teardown 等;

  • 冗余多:

    • 前置:基本一致,都需要调用获取配置数据、公共参数等函数;

    • 断言:逐个字段校验,密密麻麻的 assert 看着头疼,字段变动难以维护;

  • 未加入日志记录功能:之前封装的 request 和断言函数,每次运行完成后仅有 HTML 报告展示,快速定位问题时,一份详细的 log 日志更为高效;

  • 无法进行参数化:比如一条用例,不同的传参,返回不同的结果。就需要增加用例修改下传参,相当于用例写两遍,这是个问题!同时,请求完成后,仅断言预期改变的响应值还是全部值都断言?这又是个问题;

  • 用例失败无重跑机制:需要在用例内强制设置运行次数,对有一定失败率的用例来说,不太友好;

  • 运行模块化用例需要定制 test suite 进行组装。

 

针对以上问题,发现部分问题在 pytest 上都得到了很好的解决:

  • pytest 可以运行 unittest 风格的测试用例,兼容性好,用例编写规则简单,仍然需以 test 开头或结尾;

  • 灵活的 fixture 和 conftest.py 机制,二者结合内完美解决用例文件内前置冗余的问题;

  • 参数化运行用例,@pytest.mark.parametrize 数据驱动;

  • 失败重试机制:@pytest.mark.flaky 不用再强制设置用例运行次数,还可以 通过 @pytest-rerunfailures 设置重跑所有失败用例;

  • 通过 pytest.main() 参数来指定运行的测试用例,可以指定文件、模块、类、函数;

  • 丰富的插件机制和支持 allure 报告,也是亮点。

 

还有其他问题,比如:

1. 日志记录功能:刚开始写用例的时候是没考虑到的,觉得仅有报告展示就足够了。后来遇到紧急需求,需要通过同一个 API 去请求不同书籍的价格,测试完成生成的 HTML 报告,定位问题总得打开浏览器去报告内查找,不如日志 Ctrl + F 来得高效。

解决办法:重新封装 logging、requests、assert ,将请求、断言信息写入 log 文件内,以天为单位保存起来,基本满足需求,如下图所示。

关于 API 自动化测试的思考与改进

 

2. 断言冗余:上面参数化只解决了用例冗余的问题,接口返回值多的情况下,逐个字段校验依然需要大量的 assert,参考了 httprunner yaml 文件写用例的实现方法,创建断言器,通过获取断言器的数据,根据数据进行校验,其实也是相当于做了用例断言的参数化。

关于 API 自动化测试的思考与改进

 

问题解决后,发现还可以继续优化:

  • 使用的是 pytest 框架,既然是框架,就肯定有固定的格式、用例模板,所以每次写 case,还需要手动去创建文件,重复的写入 import pytest 、import allure 、class xxx 等等等巴拉巴拉,那就还有优化的空间,写一个简单的 case 模板,自动去根据 API 名称生成用例文件,架子有了,工作重心就放在用例设计上了,还可以将所有的接口名称根据模块划分好,直接自动化生成全部用例,每条用例里面再根据业务详细修改;

  • 刚才提到的断言参数化,因为这个断言器是固定的数据格式,那断言的时候还是需要手工的去写入到用例文件内,优化优化~ 目前我的实现思路就是:先判断当前用例内是否存在断言器,如果存在断言器,则不创建;如果没有,则发送请求后根据返回值自动生成断言器写入到用例文件内,这次请求的返回值就作为预期保存下来,作为下一次断言的预期,前提是请求成功哈。

另外,研究 httprunner 发现 har2case 这个文件,功能是从 charles 导出 *.har 文件,解析 har 文件后生成一份 yml/json 文件。正好我的项目还有个弊端,当 post 请求含有 data-form 数据时,需要手动写入该表单的数据到用例内,正好这个功能我可以用上,稍微修改了下,从 charles 导出为 *.har 文件,根据 *.har 文件将解析出来的 data-form 数据,自动填入 case,算是得到了解决。其实断言器也可以根据这种方法生成,但是我懒得每个接口都去 charles 导出一遍。

 

最后,自动生成的用例就长这个样子:

关于 API 自动化测试的思考与改进

 

生成的 allure 报告长这个样子:

 

关于 API 自动化测试的思考与改进

 

                                                                         关于 API 自动化测试的思考与改进


推荐阅读
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • PHPMailer邮件类邮件发送功能的使用教学及注意事项
    本文介绍了使用国外开源码PHPMailer邮件类实现邮件发送功能的简单教学,同时提供了一些注意事项。文章涵盖了字符集设置、发送HTML格式邮件、群发邮件以及避免类的重定义等方面的内容。此外,还提供了一些与PHP相关的资源和服务,如传奇手游游戏源码下载、vscode字体调整、数据恢复、Ubuntu实验环境搭建、北京爬虫市场、进阶PHP和SEO人员需注意的内容。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
author-avatar
陈先森的记忆
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有