第二篇 基础问答(下)
6. 依赖第三方的接口如何处理?
这个需要自己去搭建一个mock服务,模拟接口返回数据,也就是我们常说的挡板服务。可以使用的工具有很多,比如在线版的 easy mock,java优秀的接口mock工具moco,或者利用web开发的框架比如flask、django等等自己写一个小的接口服务,部署上就可以。
有了mock服务,让开发人员把对应的地址替换掉即可。如果不方便替换可以使用抓包工具或者burpsuite截获请求,修改地址或相应参数,再发送出去就可以了。
关于mock的服务还会衍生出一个很常见的话题:如果我们的接口需要真实支付(比如对接支付宝的相关接口),如何测试?也就是说你每测试一次支付接口都需要真实地支付。
其实这个问题很简单,我能想到的解决方式主要有以下几个:
- mock掉第三方的支付接口,返回固定数据即可
- 一分一分的付或者付完退款(真实测试团队就是这么做的)
- 看看能不能获取第三方支付接口的沙箱环境,那样就好办了。关于什么是沙箱,你应该谷歌一下。
7. 对于接口测试中产生的垃圾数据如何处理?对于不可逆操作,比如删除订单,如何保证数据可用性?
这个问题考察的是你,能否在接口测试过程中动态的去处理测试数据。具体来说就是:在需要测试数据的时候,能够自动生成。在测试完毕后,能清除测试过程产生的垃圾数据(尤其对于生成环境)。
接口的请求数据,很多都是需要依赖前面一个状态的
比如工作流这种,流向不同的人状态不一样,操作权限不一样,测试的时候,每种状态都要测到,就需要自己会造数据了。
平常手工测试造数据,直接在数据库改字段状态。那么自动化也是一样,造数据可以用python连数据库做增删改查的操作。如果没有数据库的直接操作权限,可以间接的调用其他接口(比如下单接口)生成数据。在自动化测试中测试用例前置操作,setUp做数据准备。
对于垃圾数据的处理,和上面说到的生成数据的方式一样,调用相关接口(比如删除订单接口)或直接链接数据库进行数据删除。在自动化测试中使用后置操作,tearDown做数据清理。对于非生产环境,如果不想造成数据污染也可以切换影子数据库或者使用mock服务,不真实生成数据。
8. 说一说你对于参数化和数据驱动的理解?
这个问题牵扯到自动化测试中很重要的两个概念:参数化和数据驱动。其实在我看来他们两个是一回事--测试脚本与数据的分离。举个例子:你的登录脚本原本固定写了一组测试数据:用户名、密码。每次改数据还要改脚本,我要把数据和脚本分离出来,那就把用户名、密码提取到外面,最好放在一个外部文件中,这个就叫参数化。
对于性能测试来说,我想保证每个虚拟用户都使用不同的用户名和密码登录,这样更加贴近真实的业务场景。对于自动化测试来说,我想测试多种数据组合--比如各种类型的用户名、密码。不管是哪种场景,都要有多组数据,但登录操作流程固定不变。这个就叫数据驱动。
对于一般开发语言的单元测试框架都有数据驱动的功能,比如Python的ddt模块,TestNG的DataProvider注解。
9. 你的接口自动化,测试数据如何存放?
测试数据到底该怎么放,这个是面试官最喜欢问的一个题了,似乎仁者见仁智者见智,没有标准的答案,有的人说放excel,也有的说放.py脚本,也有的说放ini配置文件,
还有放到json,yaml文件,txt文件,甚至有的放数据库,五花八门,一百个做自动化的小伙伴有100个放的地方。
这里总结下测试的数据到底该怎么放?
首先测试的数据是分很多种的,有登录的账户数据,也有注册的账户数据,还有接口的参数,还有邮箱配置的数据等等等等,所以这个题不能一概而论给答死了。要不然就是给自己挖坑。
以下两个大忌不能回答:
测试的数据是不能写死到代码里面的,这个是原则问题,也是写代码的大忌(你要是回答写在代码里面,估计就是回去等通知了)
测试数据放到.py的开头,这种其实很方便,对于少量的,固定不变的数据其实是可以放的,但是面试时候,千万不能这样说,面试官喜欢高大上的方法
测试数据存放总结:
1.对于账号密码,这种管全局的参数,可以用命令行参数,单独抽出来,写的配置文件里(如ini)
2.对于一些一次性消耗的数据,比如注册,每次注册不一样的数,可以用随机函数生成
3.对于一个接口有多组测试的参数,可以参数化,数据放yaml,text,json,excel都可以
4.对于可以反复使用的数据,比如订单的各种状态需要造数据的情况,可以放到数据库,每次数据初始化,用完后再清理
5.对于邮箱配置的一些参数,可以用ini配置文件
6.对于全部是独立的接口项目,可以用数据驱动方式,用excel/csv管理测试的接口数据
7.对于少量的静态数据,比如一个接口的测试数据,也就2-3组,可以写到py脚本的开头,十年八年都不会变更的
10. 说一说你所知道的接口安全测试?
安全这个问题,所有的团队都很看重。接口的安全测试主要有以下几个方面:
- 接口对于请求参数篡改的预防
引入签名、参数MD5加密等
- 关于接口身份认证存在的漏洞
cookie仿冒、session劫持、平行和垂直越权
- 完善接口的防刷机制
比如暴力破解短信验证码、找回密码功能的枚举破解安全问题
- 竞争条件—利用线程并发漏洞
超过限制下单、同时申请多笔退款
- 注入类攻击
sql注入、sqlmap 接口注入检查
关于安全,能说的还有很多。但是能在上面列举的点中,挑出两三个解释清楚就很好了。