【接口测试】从0不到1的心路历程

news2025/1/19 3:02:28

我是一名做了三年测试的tester,2020年以功能测试工程师的身份入职北京一家医疗培训公司,入职后为了提高测试效率,接触到接口测试,以下是从零到现在 (还有很大完善的空间,所以不能算是1) 的一些心路历程。

做接口测试的动机

于公司业务和团队现状而言,团队中仅我一名测试,随着产品功能日益丰富,导致回归测试任务量越来越大,紧靠人工回归,效率低,质量低,所以自动化测试势在必行。

于个人职业发展路径而言,每天点点点,看似很忙,但除了对业务流程越来越熟练之外,硬技能长进很慢,要想把测试这条路走宽走远,主动求变是必须的,站在功能测试工程师的角度看职业发展方向,无非就是安全测试、性能测试、自动化测试以及管理方向,刚好公司业务所需,所以决定先从自动化测试入手。

起步阶段,选择JMeter

我认为打算做一件事情之前,如果准备过多,往往会阻碍起步的脚步,过犹不及,不如稍作准备就马上抛竿,实践一下鱼塘里有没有口儿。所以我选择了上手比较容易的JMeter,从接口自动化开始突破。当时手握《全栈性能测试修炼宝典 JMeter实战》这本经典工具书,参考网上优秀的实战经验帖,很快就搭建出了一套200条case的脚本,脚本中尽可能的提取公共变量,解决接口依赖问题。

弃用JMeter做接口自动化测试

随着 case 越来越多,发现一旦有接口变更,维护起来的难度极大 (极容易眼花缭乱),有一次因为入参的值多了一个空格,导致我整整找了3个多小时,当发现原因时直接崩溃 (具体是哪个参数值想不起来了,举个例子:正确:${14trainCenterId},错误:${ 14trainCenterId}),就因为在14面前多了一个空格,我在200 多条case,几千参数值中找了整整一下午,至此,决定放弃JMeter。

其实JMeter不适合在团队中做接口自动化测试的另一个重要原因是多人合作编写一个脚本并不是很方便,但介于当时团队中只有我一个人,所以没切实的体会过这个缺点。

虽然弃用JMeter,但在编写接口测试期间,脑子里也形成了一套接口测试case 的编写方法论,比如接口测试case设计需要考虑正常情况 (必填项必填,参数之间的组合,参数值的遍历等等),异常情况 (必填参数参数值为空、为异常值、索性连参数都不写等等),其实接口 case 的设计和业务功能测试 case 设计时的思路差不多,唯一区别可能是手动点点点时一些参数的输入被大前端限制住了,但是接口测试就可以随便传参。

尝试使用Python+unittest+requests

弃用工具那就只好选择编程语言了,当时选择Python其实没那么多高大上的理由,单单是因为看到了那句"人生苦短...",再加上在自动化测试这方面Python的呼声也很高,我自己也倾向做事尽可能的立竿见影,所以没有考虑Java。

要单说仅仅让Python脚本跑起来,也许只需要学一些基础的语法,迟则三五天的事情,再选择一个测试框架,当时选择的是这样的组合:Python+unittest+requests。前期照葫芦画瓢一边学 Python 语法,一边学习测试框架。很快就写出了一套和之前JMeter一样效果的测试脚本(虽然整个项目就仅有两个文件:test_.py 和 run.py,虽然简陋,但是能跑,入门学习是够了的)。至此也算是入了道儿了。

因为我是刚刚起步,团队中也没有这方面的前辈可以指点,所以几乎是摸着石头过河,走了很多弯路 (也许现在走的路也不直),但我每积累一段时间我都会停下来总结思考是不是需要重构,并不会随着思维惯性 瓷蹦蹦 的复制粘贴。截至目前,有三版较大的改动,让我说给你听。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036

初具雏形 - 第一代测试框架

简单来说,第一代主要的事情就是搭建基础框架,使用parameterized实现数据驱动测试。

第一代我的目录结构是这样的:

其中有4个目录和2个文件,需要解释的可能是public下的custom_tools,我将一些通用方法写在这个文件里,例如获取指定个数个字符串的random_str方法、对参数进行 md5 加密的 to_md5 方法等。

至于public下的tearDown_methods文件,我当时为了清理测试数据,定义了一些数据删除的方法,举个场景:接口A生成产品、接口B通过商品id编辑商品、接口C通过商品id删除商品。在这个版本中我就把接口C写到了tearDown_methods文件中,然后再在正式的测试脚本文件中定义 teardown 方法调用删除接口(此时可能就有小伙伴质疑了,你这不是脱裤子放屁么,哈哈,我刚开始的时候还认为这种写法很高端,但在不久之后我就意识到了这个问题,所以在后面的版本就改正了)。

正文-test_tanqiang.py的编写思路是这样的:

为了解决接口依赖的问题(例如上面举的例子:接口A生成产品、接口B通过商品id编辑商品、接口C通过商品id删除商品)我在测试文件的前部分初始化了多个全局变量 (例如 id_product = -1),然后在新增接口中,新增成功后获取产品 id,并赋值给id_product,然后在编辑和删除接口中就能使用这个值。文件结构大致如下:

第一版使用parameterized装饰器做了数据驱动测试,完整的一条case如下:

另外,我将不同环境和不同端的HOST写到了config文件中。

这个版本也能实现生成测试报告,并发送电子邮件的功能,想的是为日后持续集成做铺垫。

第一版的成果和反思:在这种模式下,我一共写了70多个接口的case,实践证明使用Python做接口自动化测试确实比 JMeter 灵活得多,可实践后也发现如下问题:

  • 没必要将测试数据清理的方法单独写在一个文件中,可以直接写在测试类下,因为删除接口也是接口测试的范畴。

  • 数据驱动测试时,将测试数据罗列在测试方法上方,如果接口入参过多,那么在阅读及后期维护上很不方便 (因为得数索引位置)。

  • 数据驱动测试时,如果其中一条 case 断言失败,也不知道具体是其中哪条数据出的问题。

  • 测试case的执行顺序不可控。

效率至上 - 第二代测试框架

根据第一代的经验和问题,重构框架,详细如下:

变动1:弃用数据驱动模式,因为做接口自动化测试的初衷就是为了做回归测试(保障原有功能不受影响),而不是通过接口自动化测试发现新的问题。再加上团队中就我一名测试,我的时间重点还是在保障功能测试上。根据以往接口受影响的经验来看,接口如果受影响更多情况会直接500,而不会是type传1接口正常,type接传2接口异常。所以在第二版中,我仅选择每个接口的正常入参,并将测试数据直接写进了测试脚本里。

变动2:通过文件、类、测试方法的名称来控制用例的执行顺序。

变动3:移除public下的teardown_method.py文件,将数据清理接口写进test_xxx文件中的测试类下。

变动4:丰富接口断言。接口自动化测试重中之重就是断言设计,所以本次改版丰富了断言类型。


(有可能有的小伙伴会发出疑问:问什么都断言了响应的 code,还有必要断言响应的msg吗?我的思考是:如果你所处的团队接口开发比较规范的话其实code和msg断言其中一个就可以了,但我目前的团队并不是很规范,例如有的接口成功的响应是{'code':'2000','msg':'操作成功'},有的接口成功的响应是{'code':'0','msg':'成功'},基于此,我对code和msg都做了断言。)

变动5:接口依赖时采用 “错误先行” 编程思想。(可能有小伙伴会发出笑声,寻思为什么还有这种写法:

self.assertEqual(1, 2, '省份 id 获取失败,所以无法进行新建培训中心操作'),后来我也发现了这个问题,所以在下个版本中改为 “raise KeyError('省份 id 获取失败,所以无法进行新建培训中心操作')”)

第二版的成果和反思:在这个模式下我共集成了150个接口的自动化case。不过在实践中又发现了新的问题:如果某条 case 报错,那么报错后我并不能清楚的知道测试时的请求体的具体内容,以及响应体的具体内容。这会让我在排查以及跟开发反馈时很困难(运行完乌压压一片红,具体错在哪不是很明了)。

提升接口测试结果的可信度、持久化接口测试前中后过程中的信息 - 第三代测试框架

我加入这家公司正是团队刚刚起步的时候,所以那时迭代很快,每天都很忙,转眼入职两年了,产品预期的功能都已上线,我们公司主打的本就不是软件,IT部是职能部门,所以一旦该有的功能都有了之后也不会有太多大动作的更新(懂得都懂)。这个时候我就有时间再重新思考下当前的测试脚本了。

最近在反复的读《测试架构师修炼之道第2版》这本书(强烈推荐给大家),书中系统的教授了如何设计测试用例,从其中教授的多参数组合测试方法中得到启发,大致意思就是比如一个接口有3个必填参数(参数A(可取值:1,2,3,4,5)、参数B(0,1)、参数 C(0,1,2)),相互之间没有关联关系,据此可生成5条case:

基于此,我又再次想到了数据驱动测试,这次想把测试数据源放在excel中,可能有的小伙伴就会吐槽这种excel模式的数据驱动测试,会觉得在测试前先去整理excel很麻烦。我本次的策略是,不手动在excel中数着格子填写测试数据,而是编写一个生成测试数据的方法,让其自动生成测试数据。整体思维脑图大致如下:


(整体思路)


(测试前编写生成测试数据的方法(需要根据每个接口编写各自的测试数据生成方法))


(将测试运行过程中的 response 的相关信息写入到excel(这个方法可公用))


(测试结束后,如果所有断言都通过,则将excel中对应的 case_id 置成绿色(这个方法可公用))


(在testcase中调取响应的方法)


(测试运行结束后,excel 中的结果)

第三版除此之外的变动主要还有:

1.将原测试脚本中的全局变量全部移到了config文件中,使得测试脚本文件更加整洁;

2.将原测试 case 中不必要的 self.去掉了,只有在断言的时候才加 (self.assertEqual()),例如之前会这么写:self.url = "XXX" self.data = {'id':1} ,现在改成:url = "XXX",data = {'id':1},理论可度娘 “在类方法中添加 self 和不加 self 的区别”,反正我实践结果是加与不加都不影响测试结果,那自然不加(能少写就少写,~.=)。

第三版的成果和反思:目前使用这个版本刚刚写了23个接口的case,虽然看似在写正式脚本前还要先编写一个生成测试数据的方法很麻烦,但实操发现并没有想的那么麻烦,而且这个投入产出比我认为还是很高的。也许以这个模式写的接口数量还不够多,等在沉淀沉淀一定还会发现其他新的问题。

我们的成长不就是不断的发现问题,不断地解决问题,再发现新的问题么,嘿嘿。

罗里吧嗦写了一大推,更多的是对自己在接口测试这方面从开始到现在的一个总结,就像开头说的,因为目前团队中在测试方面能相互沟通的伙伴几乎没有,所以一直都是自己摸着石头过河,走了很多弯路,现在走的路也可能不是直的,我真的真的真的真的很渴望沟通,希望各位佬儿哥佬儿姐能够不吝赐教,将发现的问题或者建议留言给我,如果能添加微信对我指点一二那简直太哇塞了(VX:GXY1162031010)。

其实重构到当前版本仍然有很多问题没有想通该怎么解决,大家帮我盘盘呗

问题1:接口依赖怎么做数据驱动测试?

场景描述:创建产品的接口 A,调用成功之后会提取新建产品的 id,并保存为全局变量(例如:id = -1,接口 A 调用成功后置为新值,例如 id = 100),编辑产品的接口 B,在编写接口 B 生成测试数据的函数中,期望能够读取到 id 的最新值 100,实操后发现是原值-1。这个问题的原因我也知道个大概,因为运行测试前先加载所有的 ddt,然后才会运行 testcase,所以读不到在测试运行中赋予 id 的新值100。有佬儿哥指点,可以把 id = -1 写成 id = [-1],这样ddt就可以在测试运行中读到新值,我测试后确实可以,但又有佬儿哥建议接口依赖不能做数据驱动测试,所以目前还在不断试错、尝试。

问题2:针对查询接口,怎么做断言?

场景描述:新增一个产品,新增成功后拿到产品 id = 100,然后对查询产品接口 C 做断言,我目前的断言策略是 “self.assertIsNotNone(response.json()['data'])”(捂脸),我尝试过断言查询结果的第一条数据的 id 是否等于100,可是这种断言很不稳定,如果有多人在使用,那么列表中的第一条数据很有可能就不是你刚刚添加的数据。所以目前还没想到合适的断言方法。

问题3:在第三版的testcase中,在获取到响应后,都会固定的调用 TD.data_write() 方法,且传参内容很多,并且即使是不同的testcase,在这一步时,传入的参数都是一样的。有没有什么优化方法,可以避免每个testcase都写这么多重复的内容?

END

绵薄之力

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于想进阶【自动化测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。希望对大家有所帮助…… 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/427974.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

李宏毅教程系列——增强学习

目录 0. 强化学习wiki 1. 介绍 2. Exploration vs Exploitation 探索与开发 3. 各类最优化方法 3.1 Brute force猛兽蛮力法(暴力搜索) 3.2 Value function estimation(价值函数估计) 3.2.1 Monte Carlo methods 蒙特卡洛方…

linux安装南大通用数据库

linux安装南大通用数据库1、操作系统、数据库2、下载链接3、安装文档4、安装前准备4.1、以root用户创建 gbasedbt 组和用户4.2、创建 GBase 8s 数据库安装目录4.3、上传并解压安装包5、安装5.1、执行安装程序5.2、回车继续 直到接受许可条款5.3、输入安装目录绝对路径5.4、选择…

腾讯音乐笔试0414

介绍一 Triplet Loss的原理, 其中的样本分为哪几类?可以用于哪些场景? Triplet Loss是一种用于训练神经网络的损失函数,主要用于学习映射函数,将样本映射到低维空间中,使得同一类别的样本距离尽可能近,不同类别的样…

开发钉钉和企业微信微应用

钉钉应用开发流程: 1、登录钉钉后台管理 -- 应用管理 -- 工作台 -- 自建应用 2、上传内部应用logo和名字。注意需要添加可访问域名的配置。 3、配置首页可访问地址:打包到线上的路径(注意配置正式环境和本地环境) 4、在所在公司…

早有尔闻 | 低碳赋能,创新发展

01 2023中国管理科学大会 发布创新奖榜单 海尔位列第一 4月15日,2023中国管理科学大会暨第八届“管理科学奖”颁奖典礼在北京举行。大会发布了第八届中国管理科学学会“管理科学奖”获奖名单,海尔集团“基于用户端低碳升级的智慧能源管理体系建设”项…

[CVE漏洞复现系列]CVE2017_0147:永恒之蓝

Hi~ o( ̄▽ ̄)ブ 文章目录前言一、永恒之蓝是什么?1.SMB协议介绍。二、准备工作1.Windows7 and kali linux2.テストを開始总结前言 这是新的系列,我能力有限有的漏洞实现不了,我尽力吧 🥨🥨&…

Deep Glow(AE辉光特效插件)中文版安装教程

deepglow比AE自带的辉光效果好很多,基于GPU运算,同时控制调节发光效果,有了这款插件,我们就可以非常轻松的模拟出非常真实非常漂亮的物理发光特效,支持各种参数的自定义,喜欢的欢迎下载使用。 安装教程 1…

营收、净利创新高,股价却“跌跌不休”,紫光国微怎么了?

‍数据智能产业创新服务媒体——聚焦数智 改变商业要问当前科技圈处于“风口浪尖”的,除了ChatGPT就应该是半导体了。近日,紫光国微发布2022年年报,实现营收和净利双创新高。作为一家在集成电路设计领域深耕二十余年的企业,紫光国…

快速精简软件,如何让软件缩小到原来的5%大小,从删除文件入手,到修改C++引用库,合规解决存储问题

Hi~大家好,今天制作一个简单的精简软件的教学~ 事先说明下,精简软件并不违反任何规定,尤其是开源软件,这里也仅讨论开源软件的修改,根据几乎所有开源软件的开源规则,精简软件,本质也就是修改软件…

如何通过python实现一个web自动化测试框架?

要实现一个web自动化测试框架,可以使用Python中的Selenium库,它是最流行的Web应用程序测试框架之一。以下是一个基本的PythonSelenium测试框架的示例: 如果你想学习更详细的web自动化测试教程,我这边给你推荐一个详细的视频教程 …

第二章 webpack基础用法

webpack核心概念之entry Entry用来指定webpack打包的入口,下图中webpack找到入口文件后,会将该文件所有的代码和非代码依赖都梳理出来,最终遍历完依赖树后生成打包后的静态资源。 单入口:entry是一个字符串 module.exports{ entry…

HCIP之MPLS

目录 MPLS MPLS --- 多协议标签交换 包交换 标签交换 包交换的变更 MPLS主要应用于三大领域 ​编辑 MPLS和包交换一样,其过程也可以分为控制层面和数据层面 标签交换过程(数据层流量) 标签解读 静态搭建LSP 创建路由条件 配置MPL…

arduino自用简单图形化编程仿真

傻瓜式编程真的很适合初学者 这边就不提fritzing和proteus的pcb设计了 就推荐几个简单的 1、linkboy 官方网址:http://linkboy.com.cn/index.html 也有官方教程点我 使用方法:官网下载软件 优点:元器库特别丰富,还具备语音识别、…

新网站多久被google收录?谷歌当天收录网站靠谱吗?

新网站多久被google收录? 答案是:24小时内。 为什么你做的外贸网站在Google搜索引擎一直不收录或者收录很慢。 其实有一个很关键的原因,那就是谷歌爬虫到底有没有到你网站的页面上去抓取数据。 很大可能是没有,当然你可以通过…

ctfshow web入门 nodejs 334-341(更新中)

前言 说实在也没啥好说的,希望大家要有勇气,向难题挑战,别像我一样自始至终都是一个菜狗,哎。 这里在刚开始的,我就有一个问题就是我发现刚开始使用的是require来导入模块,但是到了后面发现大部分使用的都是…

5G网络优化工程师入职企业,都有什么不同呢?

通信行业内的网络优化工程师后期入职主要是在设备商、运营商,运营商的合作单位。 熟悉通信行业的同学肯定了解这个行业最基本的可以分为运营商和设备商,运营商在国内就是移动、联通、电信,广电四家,这四家目前不管是薪资、职业发展…

自动语音识别模型whisper安装和初探

whisper介绍 whisper是OpenAI 最近发布的语音识别模型。OpenAI 通过从网络上收集了 68 万小时的多语言(98 种语言)和多任务(multitask)监督数据对 Whisper 进行了训练,whisper可以执行多语言语音识别、语音翻译和语言…

swing-扩展徽章组件JEBadge

前言 因为工作原因,好久没有写swing组件了,最近准备优化一个功能,希望有类似徽章的功能。 徽章在平时的app和h5 页面上经常常见 ,那么在swing中如何实现一个徽章功能呢。 技术分析 为什么不选择绘制方式,却选择JLayeredPane &a…

《程序员面试金典(第6版)》面试题 08.14. 布尔运算(动态规划,分治,递归,难度hard++)

题目描述 给定一个布尔表达式和一个期望的布尔结果 result,布尔表达式由 0 (false)、1 (true)、& (AND)、 | (OR) 和 ^ (XOR) 符号组成。实现一个函数,算出有几种可使该表达式得出 result 值的括号方法。 示例 1: 输入: s “1^0|0|1”, result 0 …

STM32 LCD-ADC-DMA实验

目录 1.1 STM32 DMA简介 1.2 STM32 DMA的操作 1.DMA的初始化 2. 初始化代码 3. 主函数代码 本文将向大家介绍 STM32 的 DMA。(如有错误,欢迎批评指正) 在本章中,我们将利用 STM32 的 DMA 来实现ADC1通道1内数据传送,并在 TFTLCD 模块上显…