2026年软件测试面试题:10道接口题,淘汰90%候选人
面试官不会告诉你,真正的分水岭不在功能测试,而在接口测试。2026年,企业要的不是“点工”,是懂协议、会Mock、能搞定鉴权的接口测试专家。本文拆解10道高频题,每道都配答案和代码,看完直接超越90%的竞争者。
接口测试不是选择题,是生存题。
01 HTTP协议:从状态码到请求方法,面试官在挖什么坑?
问题1:HTTP状态码403和401有什么区别?
面试官想听的不是定义。401是“你是谁?”,403是“知道你是谁,但你没权限”。401触发登录弹窗,403直接拒绝访问。
实战场景:你测试一个支付接口,返回401,说明token过期或未携带;返回403,说明token有效但账户被冻结。前者是认证失败,后者是授权失败。
问题2:GET和POST请求的本质区别是什么?
标准答案说GET安全、幂等、有长度限制,POST不安全、不幂等、无限制。但面试官要听的是:GET请求参数在URL,会被浏览器缓存、历史记录保存、服务器日志记录;POST请求参数在Body,相对隐蔽。
代码对比:
python
# GET请求
import requests
response = requests.get('https://api.example.com/users?id=123')
print(response.url) # 参数明文显示
# POST请求
payload = {'username': 'test', 'password': 'pass123'}
response = requests.post('https://api.example.com/login', data=payload)
print(response.request.body) # 参数在Body中
问题3:如何测试一个HTTPS接口的证书有效性?
2026年,证书问题导致的安全事故占比37%。测试要点:证书过期时间、域名匹配、证书链完整性、是否被吊销。
Python测试代码:
python
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
# 关闭SSL警告(仅测试环境)
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
# 验证证书
response = requests.get('https://example.com', verify='/path/to/cert.pem')
print(response.status_code)
# 测试过期证书
try:
response = requests.get('https://expired.badssl.com', verify=True)
except Exception as e:
print(f'证书过期:{str(e)}')
技术深度,是面试官唯一认可的通行证。
02 RESTful API设计:一个接口规范,暴露你的系统架构能力
问题4:RESTful API中,PUT和PATCH的区别?
PUT是整体替换,PATCH是局部更新。面试官会追问:如果你用PUT更新用户年龄,没传名字字段,名字会被清空吗?答案是:会。PATCH只更新传入字段。
接口设计示例:
text
# PUT - 全量更新
PUT /users/123
Body: {"name": "张三", "age": 25}
# 结果:name变成"张三",age变成25,其他字段不变或清空
# PATCH - 局部更新
PATCH /users/123
Body: {"age": 26}
# 结果:age变成26,name保持不变
问题5:如何设计一个分页接口的参数?
面试官考察的是你对大规模数据处理的认知。标准设计:page(页码)、size(每页数量)、sort(排序字段)、order(排序方向)。
测试用例设计:
- ►边界值:page=1, size=0(返回空数组还是报错?)
- ►异常值:page=-1, size=10000(系统会崩溃吗?)
- ►组合测试:page=1&size=10&sort=createTime&order=desc
问题6:RESTful API版本管理有几种方式?
三种主流方式:
1. URL路径:/v1/users、/v2/users
2. 请求头:Accept: application/vnd.example.v1+json
3. 查询参数:/users?version=1
推荐用URL路径,简单直观,方便测试和文档管理。面试官会问:你遇到过API版本兼容性问题吗?答案:新增字段时,旧版本客户端会忽略;删除字段时,必须发公告并设置过渡期。
接口设计不是写代码,是定规则。
03 Mock服务:没有真实环境,如何把测试跑起来?
问题7:什么时候需要使用Mock服务?
三大场景:
1. 第三方接口未开发完成(如支付、短信)
2. 测试环境不稳定或无法访问
3. 需要模拟异常场景(超时、返回错误码、数据异常)
问题8:如何用Python搭建一个简单的Mock服务?
使用flask库,30行代码搞定:
python
from flask import Flask, jsonify, request
app = Flask(__name__)
# Mock支付接口
@app.route('/api/pay', methods=['POST'])
def mock_pay():
data = request.json
amount = data.get('amount', 0)
# 模拟不同金额返回不同状态
if amount > 10000:
return jsonify({'code': 500, 'message': '金额超限'}), 500
elif amount <= 0:
return jsonify({'code': 400, 'message': '金额无效'}), 400
else:
return jsonify({'code': 200, 'message': '支付成功', 'trade_no': '2026' + str(amount)}), 200
# Mock短信接口(模拟超时)
@app.route('/api/sms', methods=['POST'])
def mock_sms():
import time
time.sleep(10) # 模拟10秒超时
return jsonify({'code': 200, 'message': '短信发送成功'}), 200
if __name__ == '__main__':
app.run(port=9999, debug=True)
问题9:Mock服务如何保证数据和真实环境一致?
核心原则:Mock数据要基于真实接口的返回格式设计。推荐做法:
1. 抓取真实接口的返回数据,保存为JSON模板
2. 用faker库生成随机但符合规则的数据
3. 定期对比Mock数据和真实数据的字段差异
python
from faker import Faker
fake = Faker()
def generate_user():
return {
'id': fake.random_int(min=1000, max=9999),
'name': fake.name(),
'email': fake.email(),
'phone': fake.phone_number(),
'createTime': fake.date_time_this_year().isoformat()
}
Mock不是造假,是可控的真实。
04 鉴权机制:Token、JWT、OAuth2.0,一次说透
问题10:JWT和Token鉴权的区别?测试要点是什么?
JWT(JSON Web Token)包含三部分:Header(头部)、Payload(载荷)、Signature(签名)。Token只是一个随机字符串,需要查数据库验证。
JWT的结构:
text
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6InRlc3QiLCJpYXQiOjE1MTYyMzkwMjJ9.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
测试要点:
1. Token过期测试:生成一个过期Token(设置exp为过去时间),请求接口,预期返回401
2. 签名篡改测试:修改JWT的Payload部分,重新编码但不更新签名,预期返回401
3. 权限越界测试:用普通用户Token请求管理员接口,预期返回403
Python测试代码:
python
import jwt
import time
# 生成过期JWT
expired_token = jwt.encode({
'user_id': 123,
'role': 'admin',
'exp': int(time.time()) - 3600 # 1小时前过期
}, 'secret_key', algorithm='HS256')
# 测试过期Token
headers = {'Authorization': f'Bearer {expired_token}'}
response = requests.get('https://api.example.com/admin/users', headers=headers)
assert response.status_code == 401
# 测试签名篡改
parts = expired_token.split('.')
tampered_payload = jwt.encode({'user_id': 999, 'role': 'superadmin'}, 'wrong_key', algorithm='HS256')
tampered_token = f'{parts[0]}.{tampered_payload.split(".")[1]}.{parts[2]}'
headers = {'Authorization': f'Bearer {tampered_token}'}
response = requests.get('https://api.example.com/admin/users', headers=headers)
assert response.status_code == 401
补充题:OAuth2.0的四种授权模式如何选择?
面试官考察你对业务场景的理解:
- ►授权码模式:最安全,适合有后端的Web应用
- ►隐式模式:简化版,适合纯前端应用(已被淘汰)
- ►密码模式:直接传用户名密码,适合信任的客户端
- ►客户端凭证模式:适合服务间调用
测试重点:授权码的code只能使用一次、state参数防CSRF攻击、refresh_token刷新逻辑。
鉴权测试,防的不是用户,是漏洞。
---
接口测试不是点点点,是协议、架构、安全的三维博弈。2026年,企业要的不是会写用例的人,是能设计Mock、能破解鉴权、能预测系统瓶颈的人。10道题只是入场券,真正的考验在面试官追问的那一刻。