接口自动化概念篇
1.接口测试
接口的概念
接⼝⼀般来说有两种,⼀种是程序内部的接⼝,⼀种是系统对外的接⼝。
程序内部的接口:⽅法与⽅法之间,模块与模块之间的交互,程序内部抛出的接⼝,⽐如贴吧系统,有登录模块、发帖模块等等,那你要发帖就必须先登录,要发帖就得登录,那么这两个模块就得有交互,它就会抛出⼀个接⼝,供内部系统进⾏调⽤。(我编辑一个帖子进行发布publish的时候, 会校验用户的登录状态,自动调用login接口)
系统对外的接口:⽐如你要从别的⽹站或服务器上获取资源或信息,别⼈肯定不会把数据库共享给你,他只能给你提供⼀个他们写好的⽅法来获取数据,你引⽤他提供的接⼝就能使⽤他写好的⽅法,从⽽达到数据共享的⽬的,⽐如说咱们⽤的app、⽹址这些它在进⾏数据处理的时候都是通过接⼝来进⾏调⽤的。(用来把数据分享出去的接口)
接口测试的概念
接⼝测试是测试系统组件间接⼝的⼀种测试。接⼝测试主要⽤于检测外部系统与系统之间以及内部各个⼦系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。
简⽽⾔之,所谓接⼝测试就是通过测试不同情况下的⼊参与之相应的出参信息来判断接⼝是否符合或满⾜相应的功能性、安全性要求。
其实接⼝测试很简单,⽐⼀般的功能测试还简单(⾮官⽅表述,有感⽽发),因为功能测试是从⻚⾯输⼊值,然后通过点击按钮或链接等传值给后端,⽽且功能测试还要测UI、前端交互等功能,但接⼝测试没有⻚⾯,它是通过接⼝规范⽂档上的调⽤地址、请求参数,拼接报⽂,然后发送请求,检查返回结果,所以它只需测⼊参和出参就⾏了,相对来说简单了不少。
接口的组成
接⼝⾄少请求地址, 请求方法, 请求参数(入参和出参),部分接⼝有请求头 header 。
请求头(header): 是服务器以HTTP协议传HTML资料到浏览器前所送出的字符串,在标头与 HTML ⽂件之间尚需空⼀⾏分隔,⼀般存放 cookie 、 token 等信息
header和入参的关系
它们确实都是发送到服务器⾥的参数,但它们是有区别的,header⾥存放的参数⼀般存放的是⼀些校验信息,⽐如cookie,它是为了校验这个请求是否有权限请求服务器,如果有,它才能请求服务器,然后把请求地址连同⼊参⼀起发送到服务器,然后服务器会根据地址和⼊参来返回出参。也就是说,服务器是先接受header信息进⾏判断该请求是否有权限请求,判断有权限后,才会接受请求地址和⼊参的。(先接受header,有权限再接受url和入参)
接口测试的重要性
1. 可以越过前端,去看后端是否做了校验
2. 检查系统处理异常的能力, 以及测试系统的稳定性和安全性
如何进行接口测试
1. get和post请求
get请求:https://gateway.acgo.cn/acgoAccount/openapi/user/detail?uid=36482
get和post是常⻅的请求⽅法。如果是get请求的话,直接在浏览器⾥输⼊就⾏了,只要在浏览器⾥⾯直接能请求到的,都是get请求,如果是post的请求的话,就不⾏了,就得借助⼯具(postman,apifox)来发送。
2. http状态码
每发出⼀个http请求之后,都会有⼀个响应,http本⾝会有⼀个状态码,来标⽰这个请求是否成功,常⻅的状态码有以下⼏种:
• 200 2开头的都表⽰这个请求发送成功,最常⻅的就是200,就代表这个请求是ok的,服务器也返回了。
• 300 3开头的代表重定向,最常⻅的是302,把这个请求重定向到别的地⽅了。
• 400 400代表客⼾端发送的请求有语法错误,401代表访问的⻚⾯没有授权,403表⽰没有权限访问这个⻚⾯,404代表没有这个⻚⾯
• 500 5开头的代表服务器有异常,500代表服务器内部异常,504代表服务器端超时,没返回结果
接⼝测试分两步⾛:通过接⼝设计⽤例 + 结合业务逻辑来设计⽤例
3. 编写接口测试用例
通过性测试(正向)+参数组合+接口安全(接口参数伪造, 水平越权, 垂直越权, 隐私数据安全, 异常验证)
1. 通过性验证:⾸先肯定要保证这个接⼝功能是好使的,也就是正常的通过性测试,按照接⼝⽂档上的参数,正常传⼊,是否可以返回正确的结果。
2. 参数组合:现在有⼀个操作商品的接⼝,有个字段type,传1的时候代表修改商品,商品id、商品名称、价格有⼀个是必传的,type传2的时候是删除商品,商品id是必传的,这样的,就要测参数组合了,type传1的时候,只传商品名称能不能修改成功,id、名称、价格都传的时候能不能修改成功
3. 接口安全:
◦ 绕过验证,⽐如说购买了⼀个商品,它的价格是300元,那我在提交订单时候,我把这个商品的价格改成3元,后端有没有做验证,更狠点,我把钱改成-3,是不是我的余额还要增加?
◦ 绕过⾝份授权,⽐如说修改商品信息接⼝,那必须得是卖家才能修改,那我传⼀个普通⽤⼾,能不能修改成功,我传⼀个其他的卖家能不能修改成功
◦ 参数是否加密,⽐如说我登陆的接⼝,⽤⼾名和密码是不是加密,如果不加密的话,别⼈拦截到你的请求,就能获取到你的信息了,加密规则是否容易破解。
◦ 密码安全规则,密码的复杂程度校验
4. 异常验证:其实也就这三种,必传⾮必传、参数类型、⼊参⻓度。
5. 结合具体的逻辑
根据业务逻辑来设计的话,就是根据⾃⼰系统的业务来设计⽤例,这个每个公司的业务不⼀样,就得具体的看⾃⼰公司的业务了,其实这也和功能测试设计⽤例是⼀样的。
举个例⼦,拿贴吧来说,贴吧的需求是这样的:
1. 登录失败5次,就需要等待15分钟之后再登录
2. 新注册的⽤⼾需要过了实习期才能发帖
3. 删除帖⼦扣除积分
2.接口自动化测试
自动化分类
UI/界面自动化: web界面自动化(selenium..)
接口自动化: 接口(pytest+python...)
学习的主要模块和框架: Python+requests+YAML+JSON Schema+logging+allure+pytest
自动化的重要性: 提高测试质量和效率(做大量重复的工作, 机器执行速度>>手工测试的速度)
接口自动化流程(面试题)
总体流程: 需求分析 -> 选自动化接口 -> 设计自动化测试用例 -> 搭建自动化测试环境 -> 设计自动化框架 -> 编写接口自动化代码 -> 执行用例 -> 生成测试报告
1. 需求分析
◦ 分析请求:明确接⼝的URL、请求⽅法(如get、post、PUT、DELETE等)、请求头、请求参数和请求体等信息。
◦ 分析响应:确定接⼝返回的数据格式、状态码以及可能的错误信息。
2. 挑选自动化接口
◦ 根据项⽬的时间、⼈员安排和接⼝的复杂度,挑选适合⾃动化测试的接⼝。
◦ 优先选择核⼼业务接⼝、频繁使⽤的接⼝以及容易出错的接⼝进⾏⾃动化测试。
时间紧张就保证重要接口, 接口的复杂程度(是否经常变化?经常变化会提高自动化的维护成本),时间够用就进口能的覆盖所有的接口
功能复杂度:优先选择功能复杂、逻辑分⽀多的接⼝进⾏⾃动化测试。例如,涉及多种⽀付⽅式、多种订单状态转换的订单管理接⼝,⼿动测试难以全⾯覆盖所有场景,⾃动化测试可以更⾼效地进⾏测试.
高风险功能:选择对业务影响⼤、⻛险⾼的接⼝进⾏⾃动化测试,确保其稳定性和可靠性。例如,涉及资⾦操作的⽀付接⼝,⼀旦出现问题可能导致严重的经济损失,因此需要进⾏充分的⾃动化测试.
重复性高:对于需要频繁执⾏的测试任务,如回归测试中的接⼝测试,⾃动化测试可以避免重复⼿动测试的繁琐和低效,提⾼测试效率.
假设我们正在开发⼀个在线教育平台,该平台包含以下接⼝:
接口分析
◦ 功能复杂度:
▪ 新增课程接⼝:涉及多个参数(课程名称、课程描述、课程价格等),需要与其他模块(如课程分类模块)交互。
▪ 查询课程接⼝:⽀持多种查询条件(课程名称、课程类型、课程状态等),逻辑复杂。
▪ 课程购买接⼝:涉及⽀付流程、订单⽣成等复杂逻辑。
◦ ⾼⻛险功能:
▪ 登录接⼝:⽤⼾登录是系统的核⼼功能,任何问题都会影响⽤⼾体验。
▪ 新增课程接⼝:课程信息的正确性直接影响平台的运营。
▪ ⽤⼾注册接⼝:⽤⼾注册是系统的基础功能,任何问题都会影响⽤⼾获取服务。
◦ 重复性⾼:
▪ 登录接⼝:⽤⼾每次使⽤系统都需要登录。
▪ 查询课程接⼝:⽤⼾频繁查询课程信息。
▪ ⽤⼾信息查询接⼝:⽤⼾经常查看⾃⼰的信息。
3. 设计自动化测用例
◦ 如果在功能测试阶段已经设计了测试⽤例,可以直接拿来使⽤。
◦ 根据接⼝需求和功能,设计正向测试⽤例(正常场景)和反向测试⽤例(异常场景),包括边界值测试、参数组合测试等
通过性测试(正向)+参数组合+接口安全(接口参数伪造, 水平越权, 垂直越权, 隐私数据安全, 异常验证)
4. 搭建自动化测试环境
◦ 选择合适的编程语⾔(如Python、Java等)和开发环境(如PyCharm、IntelliJ IDEA等)来实现⾃动化测试。
◦ 以Python为例,安装必要的依赖库,如requests⽤于发送HTTP请求,pytest(发送请求)⽤于测试框架。
python + requests
5. 设计自动化执行框架
◦ 设计⼀个框架来执⾏测试⽤例,包括报告⽣成、参数化处理和⽤例执⾏逻辑。
allure(生成测试报告),YAML(参数化处理), pytest(用例执行逻辑)
6. 编写自动化测试代码
◦ 根据设计好的测试⽤例和框架,编写⾃动化测试脚本。
7. 执行测试用例
◦ 使⽤测试框架(如unittest、pytest)来执⾏编写的测试⽤例。
8. 生成测试报告
◦ 测试完成后,⽣成测试报告。可以使⽤⼯具如HtmlTestRunner或Allure来⽣成易于阅读的报告