一、接口自动化测试基础概念
(一)什么是接口测试
接口测试是针对系统各组件之间接口的一种测试,属于功能测试的范畴。它主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点,重点在于检查数据的交换、传递和控制管理过程,以及系统间的相互逻辑依赖关系等。
在实际的软件项目中,我们经常听到的接口测试大多是指 HTTP 或者 HTTPS 协议的接口测试,也就是针对一些 web 服务请求所开展的测试工作。比如一个软件项目可能存在几十个甚至成百上千个接口,测试人员在没有软件界面、没有具体测试场景的情况下,仅依靠接口描述文档,运用软件测试的理论和方法对这些抽象的接口进行测试,查找其功能和安全性方面可能存在的缺陷。
(二)为什么要做接口测试
- 前后端架构分离的需求:现在很多系统采用前后端架构分离的模式,不同端(前端、后端)的工作进度不一样。在这种情况下,针对最初开发出来的接口,以及需要调用其他公司(如银行、支付宝、微信、QQ 等)的接口,就需要进行接口测试及验证数据。而且从安全层面来说,仅依赖前端进行限制已经无法满足系统的安全要求,绕过前端太容易了,所以需要后端同样进行控制,此时从接口层面进行验证就显得尤为重要,像前后端传输、日志打印等信息是否加密传输(特别是涉及用户隐私信息,如身份证、银行卡等)也都需要验证。
- 应对系统复杂性增加:随着软件系统日益复杂,传统靠前端测试的方式已经大大降低了效率。而接口测试是一种能够让测试更早介入的方式,也就是所谓的测试左移。例如传统测试往往需要等前后端都完成才能开展,才能进行自动化代码编写;但如果是接口测试,只要前后端定义好接口,自动化就可以介入编写接口自动化测试代码,手工测试在后端代码完成后就可以介入测试后端逻辑,无需等待前端工作结束。
- 提高测试效率和质量:接口测试相对容易实现自动化持续集成,且相较于 UI 自动化更为稳定。它可以减少人工回归测试的人力成本与时间,缩短测试周期,支持后端快速发版需求。并且,越底层发现 bug,其修复成本越低,接口测试能够在较早阶段发现问题,提前发现业务测试不易测出的缺陷,通过边界值、异常测试等保障接口的健壮性,解决黑盒测试无法测试的一些场景,比如测试 userId 为空或异常值的情况等,还可以检查系统的安全性、稳定性(因为前端传参有时不可信,比如京东购物,前端价格不可能传入 -1 元,但通过接口却可能传入),对提高整个软件系统的质量有着重要意义。
(三)接口测试的流程
接口测试的流程和功能测试流程有相似之处,大致可以按以下环节开展:
- 测试接口文档:开发提供接口文档是接口测试的重要参照依据,其内容至少应涵盖接口说明、调用 url、请求方法(如 GET、POST 等)、请求参数及参数类型、请求参数说明、返回参数说明等。测试人员需要仔细研读接口文档,熟悉业务逻辑以及各接口的相关要求,梳理清楚接口间的关系以及关联接口间的数据交互情况等,为后续编写测试用例做准备。
- 编写测试用例:
-
- 用例设计重点:接口测试用例设计的重点在于功能性的业务逻辑检查和参数检查。功能性方面,要检查接口基础功能是否完成了业务逻辑要求,方法与普通的测试用例设计类似,可把接口当作一个待测模块,分析接口功能需求,利用诸如等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验法、功能图法、场景图法等常规用例方法来设计测试用例。对于参数检查,要覆盖接口的各种输入参数场景,比如检查接口的输入数据格式、数据类型、数据范围等,校验参数边界(传递的参数足够大或者为负、空值时的情况),考虑参数的组合(可选、必选等情况)以及约束条件等;同时还要关注接口的性能情况,看是否会造成性能瓶颈以及能承受的压力范围,另外接口的安全性也是重要考量因素,例如敏感信息加密(输入、输出参数部分加密和全加密)、身份认证、访问控制、SQL 注入、信息泄露(url 不包含敏感信息等)等方面都要涉及。
-
- 用例内容构成:测试用例的内容一般应包括项目(指明是哪个项目的)、模块(该接口所属的功能模块)、用例 id、接口名称、用例标题(概括测试用途)、请求方式(如 GET、POST 等)、请求 url(URL 地址)、请求参数、前置条件(执行当前请求依赖的条件,若不满足则不能正确执行)、结果验证(预期结果)、请求报文(可以根据实际情况选择是否填写)、返回报文(一定要填写,为请求返回的真实结果)、测试结果(通过 / 失败)、测试人员等字段。例如对于一个 “获取用户订单” 的接口,用例中要明确其请求 URL、请求方式为 POST,然后根据业务流程、输入参数、输出返回、性能、安全等多方面去设计具体的测试用例内容。
- 执行测试:在准备好测试用例后,就可以开始执行测试了。执行的方式有多种,既可以使用如 Postman 之类的工具,一个一个进行手工测试;也可以利用如 Jmeter 之类具备自动化功能的工具进行测试,这属于工具自动化测试;还可以自己编写测试脚本,通过脚本自动加载来执行测试,也就是自动化测试方式。在测试过程中,要关注测试结果与预期结果是否相符,对于不符合预期的情况,需要进一步分析是接口本身存在问题还是测试环境、测试用例设计等方面的原因导致的。
- 测试报告提交:完成测试后,需要生成接口测试报告,将测试用例的执行结果、发现的问题以及相应的建议解决方案等内容进行汇总整理,为后续的开发修复以及整体项目质量把控提供参考依据。
二、Python 接口自动化测试相关协议
(一)HTTP 协议详解
HTTP 即 HyperText Transfer Protocol(超文本传输协议),是互联网上应用最为广泛的一种网络协议,所有的 WWW 文件都必须遵守这个标准,其最初的目的是为了提供一种发布和接收 HTML 页面的方法。HTTP 协议在 OSI 模型中属于应用层协议,应用层协议除了 HTTP 还有 FTP、SMTP、DNS、RIP、Telnet 等。它应用于客户端 — 服务端架构上,浏览器或 APP 作为 HTTP 客户端通过 URL 向 HTTP 服务端(即 Web 服务器)发送请求,服务器将超文本传输到本地浏览器。
URL 即 Uniform Resource Locator(统一资源定位符),就如同每家每户的门牌地址一样,每个网页都有一个 Internet 地址(如www.baidu.com)。当在浏览器的地址框中输入一个 URL 或是单击一个超级链接时,URL 就确定了要浏览的地址,浏览器通过超文本传输协议 (HTTP), 将 Web 服务器上站点的网页代码提取出来,并渲染成网页。
HTTP 协议具有以下特点:
- 无连接限制:每次连接只处理一个请求。服务端处理完客户端的请求,并收到客户端的应答后,便断开连接,采用这种方式可以节省传输时间。
- 无状态:是指协议对于事务处理没有记忆能力,如果服务器不需要先前信息,那么它的应答就比较快,但缺少状态意味着如果后续处理需要前面的信息,则必须重传,这样可能导致每次连接传送的数据量增大,此时可以设置缓存。
- 媒体独立:只要客户端和服务端知道如何处理数据内容,任何类型的数据都可以通过 HTTP 发送,客户端以及服务端指定使用适合的 MIME-type 来传输。
HTTP 接口常见的请求方法有 GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE、CONNECT 等。下面来介绍下常见的几种请求方法及其区别和用途:
- GET:用于获取资源信息,即在数据库中做查询操作,不影响数据库本身的数据,比如在百度输入关键词进行查询、查询订单状态等。发起一次 GET 请求时,参数会以 Query String Parameters 的形式进行传递,“?” 后的字符串则为其请求参数,有多个请求参数则以 “&” 作为分隔符,例如https://www.baidu.com/s?wd=pytest&ie=utf-8 。
- POST:用于可能会修改服务器上的资源,即相当于在数据库中做了修改的操作,会影响数据库本身的数据,像用户注册、登录、提交评论、发帖、修改密码等情况常使用 POST 方式。