一、接口基本概念
什么是接口
接口:指外部系统与系统之间以及内部各子系统之间的交互点,
包括外部接口、内部接口,内部接口又包括:上层服务与下层服务接口、同级接口。
接口组成的要素
接口访问的地址、请求的方法、参数、返回值
接口访问的地址协议://IP地址或域名:端口号/应用名/功能名
请求的方法 get、post等
参数用户使用接口时,需要向接口提供的数据
返回值接口给用户的反馈结果
接口测试报告包含哪些内容
系统接口概况、测试目的与范围、测试工具与资源、测试记录及结果分析(单场景接口、混合场景结构)、测试结论
测试指标范围包含哪些
被测接口接收请求和返回报文
被测接口返回状态
被测接口对应业务逻辑处理
涉及数据沉淀的处理
复杂场景下多个接口串联交互
接口自动化的测试流程/你们公司是如何做接口测试的?
需求分析
对于产品的需求进行认识和理解,这一块主要了解接口 业务逻辑、业务关联
Api文档分析与评审
主要分析:请求和响应
请求:
请求url是否合理
请求信息头是否明确
请求方法是否合理
请求参数是否必填、含义、参数方式是否明确
响应:
响应状态码
响应数据格式
响应信息头
异常返回信息和错误代码是否合理
测试计划编写
测什么、谁来测、怎么测、风险预测及进度控制
用例设计与评审
根据接口业务、接口信息编写接口用例
与产品、开发一起评审用例
测试环境准备
例如测试工具:Postman、jmeter安装
接口服务的环境(大部分开发进行部署)
执行用例
按照接口用例执行
缺陷管理
记录发现的缺陷,开发完成之后进行回归验证
测试报告
编写本次测试报告,发送给相关人员
没有接口文档怎么做测试用例
如果存在前端界面,通过抓包工具进行抓包,整理出接口相关信息,与开发进行沟通是否存在遗漏
不存在前端界面,有代码能力,直接去查看开发代码实现,获取接口信息
将整理的接口信息,编写出对应的接口测试用例
使用接口测试工具,执行测试用例,例如:Postman或Jmeter
记录测试结果,存在问题及时与开发沟通
提交缺陷,开发修改之后进行回归测试
测试完成提交测试报告
做接口测试项目复盘,主要推动开发对接口文档重要性
怎么区分bug是前端还是后端的bug?
一般我会使用抓包工具进行抓包,获取前端和后端的数据交互过程
查看前端发送的请求数据是否正确(请求url、请求头、请求参数),如果前端参数存在问题,这个可以确定前端肯定存在问题(不能确定后端不存在问题,需要使用正确参数进行验证)
前端请求参数没有问题,查看后端响应的数据是否有问题,如果后端数据存在问题,那就是后端问题
前端参数和后端请求都没有问题,这时候可以考虑前端是否做了数据转换(格式化),大概率是这里面处理出问题(曾经一个数值问题,由于前端在对数值转换处理出问题)
如果有些接口做了鉴权(需要鉴定权限),怎么实现这些接口的自动化测试?
通过token来实现鉴权的,同样先调用完登录接口拿到它返回的这个数据
存储起来(存储在动态环境变量Envdate中),后面再调用其他接口的时候直接带上这个数据过去就可以了。
把token保存在动态环境变量Envdate中(因为token是可以变化的,一般不放到静态环境变量中)
接口产生的垃圾数据如何清理
setUp和tearDown方法清理接口测试产生的垃圾数据
依赖于登录的接口如何处理
登录接口依赖token的,可以先登录后,token存到一个yaml或者json,或者ini的配置文件里
面,后面所有的请求去拿这个数据就可以全局使用了
对于依赖于登录状态的接口测试,我们可以使用 pytest 的 fixture 功能来处理。你可以创建一个名为 login 的 fixture,用于登录并获取登录凭证(比如 token),然后在其他需要登录状态的接口测试中使用该凭证。
import pytest
import requests
@pytest.fixture
def login():
# 登录操作,获取登录凭证
login_url = "https://example.com/login"
data = {
"username": "your_username",
"password": "your_password"
}
response = requests.post(login_url, json=data)
token = response.json()["token"]
yield token
# 登出操作,可选
logout_url = "https://example.com/logout"
headers = {
"Authorization": f"Bearer {token}"
}
requests.post(logout_url, headers=headers)
def test_authenticated_endpoint(login):
# 使用登录凭证发送需要登录状态的接口请求
endpoint_url = "https://example.com/authenticated_endpoint"
headers = {
"Authorization": f"Bearer {login}"
}
response = requests.get(endpoint_url, headers=headers)
# 断言和其他测试逻辑
assert response.status_code == 200
assert response.json()["success"] is True
在上面的示例中,login fixture 用于进行登录操作,并在 yield 语句处返回登录凭证(token)。然后,在 test_authenticated_endpoint 测试用例中,我们使用 login fixture 获取到的凭证来发送需要登录状态的接口请求。
依赖于第三方数据的接口如何进行测试?
通过mock工具模拟第三方返回
Mock测试是指使用虚拟的接口数据来模拟真实的接口数据,以验证接口的正确性和稳定性。
当接口出现异常时候,你是如何分析异常的?
使用工具(fiddler)抓包,查看请求报文和返回报文
web端直接使用浏览器 F12界面的Network,查看请求报文和返回报文
如果是后端问题,查看后端日志
接口测试的步骤?
发送接口请求
测试接口获取返回值
断言:判断实际结果是否符合预期
jmeter做接口测试
测试计划——添加线程组——添加http请求——添加断言-添加查看结果树——运行测试——查看测试报告
post的做接口测试
创建请求——配置请求——发送请求——查看相应结果——添加断言——添加变量——运行集合
python做接口测试
Python+Pytest+requests+excel+Allure
关联是什么?如何设置关联?
正则表达式:使用正则表达式可以从接口响应中提取出所需的值。例如,如果响应中包含一个唯一的标识符,可以使用正则表达式提取出该标识符,并在后续的请求中使用。
JSONPath 或 XPath:如果接口响应是 JSON 或 XML 格式,可以使用 JSONPath 或 XPath 表达式来定位和提取所需的值。这些表达式可以根据特定的路径或条件来提取数据。
自定义函数或方法:如果没有现成的库或工具可用,可以编写自定义的函数或方法来处理关联。这些函数或方法可以根据接口响应的格式和规则进行解析和提取,并返回所需的值供后续使用。
自动化测试怎么校验结果?
断言语句(Assertions):在测试代码中使用断言语句来校验结果是否符合预期。例如,使用 assert 关键字来比较实际结果和预期结果是否相等或满足某些条件。
预期结果对比:将预期结果和实际结果进行对比,检查它们是否一致。这可以通过比较两者的值、类型、长度等方式进行。
校验返回状态码:对于接口测试,校验返回的状态码是一种常见的校验方式。通常,特定的状态码表示了不同的结果,我们可以通过断言状态码是否符合预期来进行校验。
校验日志或输出信息:对于一些需要生成日志或输出信息的系统,可以校验生成的日志或输出信息是否符合预期。可以使用字符串匹配、正则表达式等方式进行校验。
使用数据库查询:对于需要与数据库进行交互的系统,可以通过查询数据库来校验结果。可以执行数据库查询语句,比较查询结果是否符合预期。
你平常做接口测试的过程中发现过哪些 bug?你是如何处理这些bug的?
在接口测试的过程中,我经常会发现以下类型的 bug:
参数错误:接口请求参数的格式错误或缺少必要的参数。
处理方法:检查接口文档和需求,确保请求参数正确,并进行参数校验。
接口返回错误:接口返回的数据与预期结果不符。
处理方法:使用断言语句或预期结果对比来验证接口返回的数据是否符合预期。
接口异常:接口在特定情况下可能会抛出异常,如超时、连接错误等。
处理方法:使用异常处理机制来捕获并处理接口异常,确保测试的稳定性。
安全漏洞:接口存在安全漏洞,如未授权访问、SQL 注入等。
处理方法:通过安全测试和代码审查等手段来发现和修复安全漏洞。
并发问题:在并发请求的情况下,接口可能出现并发冲突或资源竞争的问题。
处理方法:使用并发测试工具或编写并发测试脚本来模拟并发请求,并观察接口的行为和性能。
性能问题:接口在负载较高或大数据量情况下可能出现性能问题,如响应时间过长。
处理方法:进行性能测试和负载测试,找出性能瓶颈并进行优化。
兼容性问题:接口在不同的操作系统、浏览器或设备上可能存在兼容性问题。
处理方法:进行兼容性测试,确保接口在各种环境下都能正常工作。
数据一致性问题:接口在数据处理或存储过程中可能导致数据不一致。
处理方法:通过数据库查询或数据对比等方式验证接口对数据的处理是否正确。
处理这些 bug 的方法包括但不限于:修复代码错误、修改接口配置、重新设计接口逻辑、优化性能、增加异常处理、修复安全漏洞等。同时,及时记录 bug 并与开发团队进行沟通,确保问题得到及时解决。
接口自动化测试怎么造数据?
在接口自动化测试中,我们通常需要准备测试数据来模拟真实的场景,并确保接口在各种情况下的正确性和稳定性。以下是一些常见的方法来生成测试数据:
手动创建数据:您可以手动创建测试数据,根据测试需求和接口参数的要求,编写符合预期的数据集。这种方法适用于简单的测试场景,但在大规模测试或复杂数据结构的情况下可能不够高效。
随机生成数据:使用随机数生成器或随机字符串生成器,可以生成随机的测试数据。例如,您可以生成随机的数字、字符串、日期和时间等。这种方法适用于需要大量数据或需要覆盖各种边界情况的测试。
数据模板:创建数据模板,通过填充模板中的占位符来生成测试数据。这些占位符可以是固定格式的字符串,例如姓名、邮箱地址、电话号码等。通过替换占位符,您可以生成符合预期的测试数据。
数据库查询:如果您的接口与数据库交互,您可以通过查询数据库来获取测试数据。您可以编写SQL查询语句,根据测试需求选择合适的数据,并将其用作接口测试的输入。
第三方数据源:有时候,您可以使用第三方数据源来获取测试数据。例如,您可以使用公共API获取实时的天气数据、股票价格等,并将其用于接口测试。
接口自动化框架搭建
Python+pytest+requests+openpyxl+pymysql+logure+allure+jenkins
分为common层 testcases层 testdatas层 conf层 outPuts层
common层:工具类,读取Excel,存放文件的路径,连接数据库并进行查询,接口请求,存放数据,数据替换,结果断言,装饰器
testcases层:测试案例,conftest.py中夹具共享
testdatas层:管理测试用例数据
conf层:配置文件,存放全局数据和一些容易变动的数据
outPuts层 :日志输出
main.py:案例执行入口(收集用例,执行用例,生成报告)
二、http
API测试中测试的常用协议?
在API测试中,常用的协议有HTTP和HTTPS协议。
HTTP 的请求方法?
HTTP 共有如下7种请求方式,每种都可以发送 Header 和 Body
GET
POST
PUT
DELETE
OPTIONS
HEAD
PATCH
HTTP响应状态码分类
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已被成功接收、理解、接受。
3xx:重定向--要完成请求必须进行更进一步的操作。
4xx:客户端错误--请求有语法错误或请求无法实现。
5xx:服务器端错误--服务器未能实现合法的请求。
post请求四种传送正文的方式有哪些
application/x-www-form-urlencoded:这是默认的传送方式,通常用于表单提交。请求参数会被编码为key1=value1&key2=value2的形式,并以&符号分隔。
multipart/form-data:这种方式适用于上传文件等二进制数据。请求正文会被分割成多个部分,每个部分都有自己的Content-Type。
application/json:这种方式可以传送JSON格式的数据。请求正文是一个JSON对象,可以包含多个属性和值。
text/xml:这种方式可以传送XML格式的数据。请求正文是一个XML文档,可以包含多个节点和属性。
三次握手
第一次握手时,客户端向服务端发送网络包,服务端收到后确认收到信息,主要目的确认客户端发送功能、服务端接收功能是正常的
第二次握手时,服务端向客户端发送网络确认收到报文,客户端接收,主要目的是确认服务端发送功能、接收功能正常、客户端接收功能、发送功能正常,但此时,服务端是不知道客户端的接收功能是否是正常的,因为没有返回信息来告诉它
第三次握手时,客户端发包,服务端接收,主要目的是确认客户端的接收、发送功能正常,服务器自己的发送、接收功能正常
HTTPS的工作原理
HTTPS是一种安全可靠的通信协议,适用于需要保证通信安全的场景,所以很多银行网站或电子邮箱等安全级别较高的服务都会采用HTTPS协议。
客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤:
客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后后利用网站的公钥将会话密钥加密,并传送给网站。
Web服务器利用自己的私钥解密出会话密钥。
Web服务器利用会话密钥加密与客户端之间的通信。
HTTPS的优点和缺点
优点
安全性高:HTTPS使用加密技术,可以保证客户端和服务器之间的通信安全性,防止信息被窃听和篡改。
可信度高:HTTPS使用数字证书,证书由第三方机构颁发,可以保证服务器的身份和信息的真实性,增加了通信的可信度。
SEO优化:搜索引擎更倾向于收录HTTPS网站,因为HTTPS网站更加安全可靠,对SEO优化有一定的帮助。
用户体验好:HTTPS可以提供更好的用户体验,因为HTTPS可以提供更快的网页加载速度和更稳定的连接。
缺点
加密解密过程会增加服务器和客户端的负担,对服务器和客户端的性能有一定的影响。
HTTPS需要使用数字证书,证书的申请和管理需要一定的成本和技术支持。
HTTPS无法防止攻击者在传输前或传输后攻击服务器和客户端,只能保证传输过程的安全性。
HTTPS无法防止攻击者通过其他方式攻击服务器和客户端,比如通过社会工程学攻击获取用户的密码等。
HTTPS和HTTP的区别
安全性:HTTP是明文传输协议,数据在传输过程中不加密,容易被窃听和篡改;而HTTPS是基于HTTP协议之上的加密传输协议,使用SSL/TLS协议进行数据加密和身份认证,可以保证客户端和服务器之间的通信安全性,防止数据被窃听、篡改和伪造。
端口:HTTP默认使用80端口,而HTTPS默认使用443端口。
证书:HTTPS需要使用数字证书进行身份认证,确保客户端和服务器之间的通信安全性,而HTTP不需要。
性能:HTTPS的加密传输会增加一定的通信成本和性能开销,因此相对于HTTP会稍微慢一些。
缓存:HTTP可以使用缓存技术来提高网站的访问速度,而HTTPS的加密传输会影响缓存的使用效果。
SEO:HTTPS相对于HTTP在搜索引擎优化方面更有优势,因为Google等搜索引擎会更倾向于收录HTTPS网站。
POST和GET的区别?
作用:get 获取资源 post 创建资源
请求主体: get 无请求主体 post 有请求主体
幂等性:get 幂等 post 非幂等
缓存: get可以缓存 post 一般不缓存
历史记录和书签: get 可存放 post 不可
安全性 get 低 post 高
TCP和UDP的区别
连接方式:TCP是面向连接的协议,UDP是无连接的协议。在TCP中,建立连接需要经过三次握手,而UDP不需要建立连接,直接发送数据包。
可靠性:TCP是可靠的传输协议,它能够保证数据的可靠传输。它使用确认和重传机制来确保数据的可靠性。而UDP则不保证数据的可靠传输,它不提供确认和重传机制。
数据传输方式:TCP是基于字节流的协议,它将数据看作是一连串的字节流,没有数据报的概念。而UDP是基于数据报的协议,每个数据包都是独立的,具有明确的边界。
传输效率:UDP比TCP传输效率高,因为它没有TCP的确认和重传机制,数据包的发送和接收速度更快。但是UDP的可靠性较差,容易出现数据丢失或乱序的情况。
应用场景:TCP适用于要求可靠传输的应用场景,如文件传输、电子邮件、网页浏览等。而UDP适用于实时性要求较高的应用场景,如视频会议、在线游戏等。
总之,TCP和UDP的选择取决于应用程序的需求和实际情况。如果需要可靠传输和数据的完整性,应该选择TCP;如果需要快速传输和实时性,可以选择UDP。
什么是TCP/IP?
TCP/IP是一组网络通信协议,它是Internet上数据传输的基础。
TCP/IP参考模型:应用层、传输层、互联网层、网络接口层
三、接口测试用例
接口测试如何设计用例
接口测试一般考虑入参形式的变化和接口的业务逻辑 ,一般设计接口测试用例采用等价类、边界值、场景法
![](https://i-blog.csdnimg.cn/blog_migrate/e31ee06595c7eca347f31d04d83ebca9.png)
接口功能测试用例包含哪些内容
用例名称、接口地址、请求方式、前置条件、描述、请求头部、请求参数、状态码、预期返回结果
8. 接口自动化测试中的测试脚本应该包括哪些内容?
接口的请求方法、请求参数、请求头、请求体、响应状态码、响应头、响应体等信息。
9. 接口自动化测试中的断言应该包括哪些内容?
应该包括响应状态码、响应头、响应体等信息,用于验证接口的正确性和稳定性。
10. 接口自动化测试中的数据驱动测试是什么?
答:数据驱动测试指使用不同的测试数据来执行相同的测试用例,以验证接口的正确性和稳定性。
json和字典的区别
1.字典的类型是字典dict,是一种数据结构;json的类型是字符串str,json是一种格式; 接口测试是传参数payload时有时候是传的字符串,应该将payload的类型改为json这点要注意
2. python dict 字符串用单引号,json强制规定双引
3. json值可以是新的键值对(多层嵌套结构),字典的值一般只能是数值、文本(不能嵌套)
4. json键名允许重复,字典不允许
5.结构相似,都是键值对
请简述一下cookie、session以及token的区别
cookie数据存放在客户的浏览器上、session数据放在服务器上、token是接口测试时鉴权码,一般情况下登陆后才可以获取到token,然后在每次请求接口时需要带上token参数,cookie不安全,别人可以分析存在本地的cookie并进行cookie欺骗,考虑到安全应当使用session 可以将登录信息等重要信息存放为session,其他信息可以保存在cookie
做接口自动化测试时,测试数据放哪里?
测试的数据分很多种,不能一概而论,测试数据存放总结:
对于账号密码,这种管全局的参数,可以用命令行参数,单独抽出来,写的配置文件里(如 ini)
对于一些一次性消耗的数据,比如注册,每次注册不一样的数,可以用随机函数生成
对于一个接口有多组测试的参数,可以参数化,数据放yaml,text,json,excel 都可以
对于可以反复使用的数据,比如订单的各种状态需要造数据的情况,可以放到数据库,每次数据始化,用完后再清理
对于邮箱配置的一些参数,可以用 ini 配置文件
对于全部是独立的接口项目,可以用数据驱动方式,用 excel/csv 管理测试的接口数据
对于少量的静态数据,比如一个接口的测试数据,也就 2-3 组,可以写到 py 脚本的开头,十年八年都不会变更的.
什么是数据驱动,常见的数据驱动方式?
数据驱动:是以数据来驱动整个测试用例的执行,也就是测试数据决定测试结果
一般来说,主要有以下几种方式传入数据:
以硬编码的方式写在代码里,简单直观,但代码和数据未分离,不方便以后维护。
从文件读取数据,如csv,excel、txt、xml等格式文件。不用修改测试逻辑,只需要维护测试数据。
直接调用接口获取数据源。
本地封装一些生成数据的方法。
excel中如何设计接口测试的用例?
所有的接口信息维护在一个excel文件中
每个接口,用一个sheet表维护
接口传递请求参数用data列,通过构造json格式的字符串即可解决多个传参的问题,同时提升了用例的可维护性
excel中的数据怎么拿出来?
通过第三方库openpyxl来完成,项目只要引入第三方库,通过它提供的api即可完成对excel的操作。
自己也可以做一些二次封装,封装一个读写excel中用例的方法,使得操作更方便。一行数据就是一个用例。
"""需要安装Python的pandas库,它可以方便地读取和处理Excel文件。
然后可以使用以下代码封装一个读取Excel用例的方法"""
import pandas as pd
def read_excel(filepath, sheetname):
"""
读取Excel文件中的测试用例
:param filepath: Excel文件路径
:param sheetname: Excel文件中的sheet名称
:return: 测试用例列表,每个测试用例为一个字典
"""
# 读取Excel文件
df = pd.read_excel(filepath, sheet_name=sheetname)
# 将Excel文件中的每行数据转换为字典
testcases = df.to_dict(orient='records')
return testcases
"""此方法接收两个参数:Excel文件路径和sheet名称。
它将返回一个测试用例列表,其中每个测试用例都是一个字典,其中包含用例的各个字段。"""
testcases = read_excel('testcases.xlsx', 'Sheet1')
for testcase in testcases:
print(testcase)
"""这将读取名为'testcases.xlsx'的Excel文件中的'Sheet1'表,并打印每个测试用例的字典。"""
UI 测试和 API 测试的区别?
UI测试:主要测试应用程序的用户界面,包括用户交互和用户体验,它模拟用户与应用程序的交互,检查应用程序的响应是否符合预期。
API测试:主要测试应用程序的接口,包括请求和响应数据的格式、协议、参数、错误处理等。它模拟客户端发送请求,检查服务器的响应是否符合预期。
常用HTTP协议调试代理工具有什么?详细说明抓取HTTPS协议的设置过程?
常用HTTP协议调试代理工具:Fiddler、Charles、F12
以fiddler举例说明抓取HTTPS协议的设置过程
下载并安装 Fiddler。下载地址为:https://www.telerik.com/download/fiddler/fiddler4
打开 Fiddler,选择"Tools" -> "Options",进入 Options 窗口。在窗口左侧选中"HTTPS"选项卡,勾选"Capture HTTPS CONNECTs"和"Decrypt HTTPS traffic"两个选项,如下图所示:
在弹出确认窗口中,点击"Yes"按钮。
安装 Fiddler 的根证书。在 Options 窗口中,选中"HTTPS"选项卡,点击"Actions"按钮,选择"Export root certificate to desktop"选项,如下图所示:
导入 Fiddler 的根证书。双击桌面上的 FiddlerRoot.cer 文件,进入证书管理器,并按照提示向系统添加证书。
配置浏览器的代理。在浏览器中打开设置页面,找到网络设置选项,并手动配置代理服务器地址和端口号为 Fiddler 所在电脑的 IP 地址及 Fiddler 的监听端口,默认为 8888。
启动抓取。重启浏览器后访问需要抓取的 HTTPS 网站,Fiddler 将截获请求和响应数据并进行分析。如果成功截获 HTTPS 流量,Fiddler 会在左侧的 Session 列表中显示加密的 HTTPS 流量。
API测试发现的Bug类型是什么?
缺少或重复的功能
无法正常处理错误条件
可靠性
安全
未使用的标志
未实现错误
错误处理不一致
性能
多线程问题
错误不正确