# 前言
一直以来都有人问我,有没有面试题的总结。面试题积累了很多,但没有时间去汇总。这次拿出时间整理一下接口测试相关的面试题,并给出详细参考答案!!!
# 第一篇 基础问答(上)
### 1. 你测试的接口是如何添加验证点的?
接口测试的验证点,也就是接口的断言,通过接口断言,可以实现脚本对程序运行结果的自动验证,输出成功或失败的状态,省去人为判断的过程。对于接口的验证点,我们可以根据任务紧急度和测试目的,粒度上由粗到细,从以下几个角度去依次添加。
1) 验证接口响应状态码为200。
这是接口测试的最基本要求,响应状态码200代表了该接口能接收请求,能返回响应。如果测试任务比较重,时间比较紧,应该首先针对每个接口,先增加响应状态码的验证点。
2) 验证响应的完整内容是否等于预期。
当接口响应正文比较短,响应正文内容固定时,可以验证响应内容是否精确地等于预期的内容。但当响应内容较长,格式复杂,或内容不固定时,不适用。
3) 验证响应报文是否包含关键信息。当响应内容较长时,可以判断响应内容中是否包含一些关键信息,例如,返回全国省自治区直辖市的接口,如果调用时构造的数据是正确的,则响应内容中一定会包含关键信息“北京”,如果以错误的数据调用,应该不包含此关键信息,可以以此作为验证接口功能的验证点。
4) 验证响应报文关键字段是否存在。当响应正文为XML格式或JSON格式时,可以通过XPATH或JSONPATH表达式,指定其中的某个节点,判断它是否存在。
5) 验证响应报文关键字段,值是否正确。除了可以验证字段是否存在,如果值是固定的或有确定规则的,还可以验证其值是否正确。若值固定可以验证相等,如果不固定可以考虑用正则表达式匹配。
6) 查询数据库 或 调用其余接口查询。当要验证的信息在当前测试接口的响应内容中不存在时,可以调用其他接口来验证。例如,一个增加用户信息的接口,要验证信息确实增加成功了,可以再调用查询用户信息接口来确认用户信息添加成功。当然,在获取数据库查询权限的情况下,也可以直接查询数据库来验证。
7) 以上说的都是功能方面的验证,另外从性能角度,还可以验证接口的响应时间,看是否在一个合理的范围内。
以上验证点,在不同测试工具,如Postman、JMeter中,都提供了相应实现,实现方式大同小异,如果用代码实现,则需要通过Python的方式获取到相应内容,再用Python的assert语句或Unittest框架下的assert系列方法判断。
### 2. 对于加密接口,你如何进行测试?
随着互联网技术的发展,服务安全性和数据安全性变的越来越重要,提供接口服务的系统往往会应用各种加密技术,保证接口被安全调用。
想要调用这些加密接口,首先要了解常见的加密规则。
摘要算法
所谓摘要算法,就是对文本内容生成一个特定长度摘要字符串。在文本内容相同的情况下,摘要必然相等。但仅凭借摘要是无法推算回原始内容的。作用就是以检验原始明文是否被篡改。
在接口中,摘要的存在自然就是防止请求正文在传输过程中被人篡改。
摘要内容一般存放于 参数列表中或者头信息中比如 cookie中 一起被发送给服务端。服务端先验证摘要,再执行逻辑。
对称加密算法,通俗的说就是在加密解密过程中,都使用同一把钥匙。
数据加密:在对称加密算法中,数据发送方将明文 (原始数据) 和 加密密钥一起经过加密处理,生成复杂的密文进行发送。
数据解密:数据接收方收到密文后,使用加密的密钥及相同算法的逆算法对加密的密文进行解密,将使其恢复成可读明文
非对称加密算法,有两个密钥,一个称为公开密钥 (publickey),另一个称为 私有密钥 (private key),加密和解密使用的是两个不同的密钥,所以这种算法称为非对称加密算法。
如果使用公钥对数据进行加密,只有用对应的私钥才能进行解密。
如果使用 私钥对数据进行加密,只有用对应的公钥才能进行解密。
我们经常使用的SSL连接方式就是基于非对称加密进行的
根据上述常见的加密算法,测试人员在测试不同的加密接口时,可采用以下的方法。
摘要算法(MD5.SHA1):调用接口时,要搞清楚,对正文中的哪些参数生成摘要,这些参数的排列规则时什么。
对称加密算法(AES,DES):调用接口时,先从开发那里获取对称密钥,基于对称密钥可以加密请求数据,以及解密响应报文。
非对称加密算法(RSA):调用接口时之前,先从开发获取服务器公钥和私钥,也要知道当前用户的公钥和私钥信息。以便完成接口的数据加密和解密。
### 3. 请列举出你所知道的Http(s)接口的身份认证方式,并大致说明一下各自的优缺点。
面试官视角分析:
这道题目的在于考察你对接口测试的熟悉程度,
但是并没有挑选比较常规的知识点。比如get/post请求的区别,
如何添加断言等等。
挑选了一个看似不常用实际很重要的知识点:Http身份认证方式。
解题分析:
首先我们要弄清楚普通的Http协议为什么要加入身份认证呢?
因为Http协议是无状态性的,你的每一次请求都是相对独立的,
服务器需要知道你的用户身份再决定你可以访问什么样的资源。
* 基本认证 HTTP Basic Authentication
这种方式最简单,当请求某个资源时,服务器返回401。再次请求参数中需要携带用户名和密码,准确来说是用户名和密码组合后经过base64转码的一个字符串。优点是简单,缺点也很明显:base64很容易解码,就代表请求被截取后用户名密码就会泄露。对于服务端来说,每次都需要验证用户名和密码很不方便。
* 单独的APIKey认证
这种方式可以说是方法1的延伸。既然用户名和密码比较麻烦,那么请求时就在头信息中存储一个用户密钥用于验证身份,服务端有单独的区域存储密钥。缺点是当请求被截获后,密钥也会被盗用。而且长时间使用同一密钥更加的不安全。因为单一的密钥不安全,很多开发人员就在头信息(大部分是在Cookie中)添加多个字段,比如sessionid、uid、token。服务端通过验证多个参数,确定用户身份,如果session设置了一段时间后失效的机制,安全性就有了基本保障。
* OAuth2.0
这种认证方式你可以理解为移动APP中的方式2。当用户首次访问是需要提供用户名、密码。服务端返回一个code。携带这个code请求认证服务器,认证服务器会返回给你一个会过期的密钥,存储在客户端本地。你全程都在和认证服务器沟通,从而保证了主服务端的安全性。
* 数字签名认证
前几种方式,当请求被截取后用户身份的相关字段都可以被获取到。
如果在请求正文中添加一个参数sign,这个参数是头信息中的密钥加上请求体参数在某种算法的作用上生成的一个MD5字符串。第一MD5是很难破解回原始值的,第二攻击者很难推算请求体参数和密钥的组合算法。
总的来说,服务器如果验证了密钥和MD5字符串全部正确,就说明身份正确且参数在传入过程中没有被篡改。
现在很多技术团队都选择Http/Restful接口类型,这种方式的好处是轻量且开发快捷,但安全性方面需要加入补充提升。
如果你在公司测试这类接口,就要注意接口的安全性尤其是用户身份认证的机制。
通过这种半开放性的问题,面试官可以大体掌握你在API测试方面的实际经验积累。
### 4. 多个 API 连续调用时,前后两个 API 之间如何进行参数传递
接口测试中的上下游依赖,是一个很常见的问题。解决这类问题的思路也比较简单。既然A接口的响应a,是B接口的请求参数b的值,那么动态获取a就可以了。
但是获取的方式不止一种,我们常见的接口测试工具Postman、Jmeter都使用了全局变量这个概念。也就是说A接口运行完毕后,我们将小a的值提取出来(比如Postman中的Test脚本,Jmeter中的提取器)。提取出来之后,一般会放在全局的环境变量中。这样一来,其余接口就可以获取到这个值了。如果这个变量不想放在全局中共享,也可以只提供给当前测试套件使用。
第二种方式在我们自己开发的接口测试框架中比较常用。我们假如测试接口B,那么有的用例很可能就不止要发一个请求。比如需要获取关联接口A的数据,那么用例中就应该存在多个步骤,每个步骤中可能需要调用不一样的接口获取数据。这个就有点像咱们经常所有的场景测试。这么做的好处就是数据实时获取,不受其他用例的干扰,当然是不是需要这样做就是你要考虑的问题了。
### 5.你在实施接口自动化测试的过程中,如果某些接口第一次调用长时间没有返回,如何保证流程顺利进行又可以记录错误信息?
面试官视角分析
这道面试题关注的是一个接口自动化测试实施过程中很常见的场景。当某个接口返回超时,原因可能是多方面的,比如网络问题。重新请求该接口可能就不会报错了。
参考答案
1.如果一个接口长时间没有返回,会影响整体测试的执行时间。python的requests类库中,请求的默认超时时间为30秒。如果一个接口发生错误,它有10个相关测试用例,总共就要耗时5分钟。所以我们要为每个接口设置一个超时时间,比如3秒。一个接口超过3秒还没有返回,就可以定位为异常。
2.那么一个接口一次调用超时了,就一定是异常吗?在失败后我们要重试几次(一般为3次),如果执行了三次还是超时,就可以认为是一个异常。很多单元测试框架都可以添加用例失败重跑机质,如果你使用的框架没有该功能,也可以使用while循环实现用例的重复执行。
3.当一个接口用例,最终重试了三次依然失败或超时,我们就需要将该问题记录到系统日志中并最终显示在测试报告中。但是该用例执行完毕后,还要保证剩下的用例继续执行。如果在不使用单元测试框架的情况下,我们就需要捕获接口调用超时或错误的异常,以保证测试任务不会中断。
总结一下,要保证每个接口用例执行不会时间过长,不会单次失败就误报,又能成功记录错误信息,保证测试任务不中断。我们需要做到三点:设置超时、添加失败重跑机质、记录错误日志,有必要时要捕获异常对象。
在自动化实施过程中,除了要保证正常流程之外,还要对异常场景做合理的处置。设置超时时间、失败重试、捕获异常情况的发生,这三个技巧在接口自动化测试中是实用的。