一、高频安全漏洞(实操可复现,面试必考)
软件测试中最常遇到的3类安全漏洞,每类都附真实接口复现步骤,拿去就能演示,记熟就能应对面试提问。
1. SQL注入(最经典,危害最大)
核心定义:用户输入的内容被当作SQL语句执行,绕过校验、获取数据甚至破坏系统。
复现步骤(超简单,必会):
-
用户名输入框填:
admin' or 1=1 -- -
密码随便填(比如123)
-
最终请求拼接后,SQL变成:
SELECT * FROM user WHERE username='admin' or 1=1 --' AND password='123'
关键解析:1=1永远成立,--注释掉后面的密码校验,直接登录成功。
危害:直接登录任意账号、查库、删表、窃取敏感数据。
防御方法:MyBatis用#{}(预编译),不要用${};输入做过滤校验。
2. 水平越权(同权限用户的"数据泄露")
核心定义:同权限用户,非法访问其他同权限用户的数据(权限没变,只是看了别人的内容)。
复现步骤(真实接口):
-
你登录自己的账号,userId=1001,正常查询自己的订单:
GET /api/order/list?userId=1001 -
把URL里的userId改成1002,请求变成:
GET /api/order/list?userId=1002 -
若能看到userId=1002的订单,就是水平越权漏洞。
防御方法:后端必须校验,当前登录用户ID == 要查询的用户ID。
3. 垂直越权(普通用户变"管理员")
核心定义:低权限用户(如普通用户),非法访问高权限接口,实现权限等级提升。
复现步骤(真实接口):
-
你是普通用户,无管理员权限
-
直接访问管理员专属接口:
GET /api/admin/user/all(查询所有用户) -
若能看到所有用户列表,就是垂直越权漏洞。
防御方法:接口加权限拦截;基于角色控制(RBAC);判断当前用户是否为管理员。
面试必背精简总结:
-
SQL注入:输入变成SQL执行,可登录、查库、删库
-
水平越权:同权限看别人数据(改ID就行)
-
垂直越权:低权限访问管理员接口
二、经典测试场景:24小时过期功能怎么测试?
这是典型的时间依赖型业务逻辑测试,核心是验证"超过24小时后,数据/功能是否按预期失效",无需真等24小时,教你高效测试方法。
1. 核心测试思路(必做步骤)
-
构造正常数据:创建时间为当前时间,验证功能可正常使用。
-
构造临界数据:23小时59分59秒(仍可用)、24小时整(触发过期)、24小时01分(已失效)。
2. 时间模拟方法(避免无效等待)
| 方法 | 操作方式 | 优点 | 缺点 |
|---|---|---|---|
| 修改系统时间 | 本地/测试环境将系统时间后调24小时+ | 成本低、见效快 | 可能影响其他依赖时间的功能 |
| 数据库直接修改 | 修改数据的创建时间为24小时前 | 精准控制时间点 | 需要数据库操作权限 |
| 接口参数篡改 | 传入24小时前的时间戳 | 适合接口测试 | 仅适用于可干预时间参数的场景 |
| Mock服务 | 固定返回"24小时前"的时间 | 不影响环境 | 需要额外搭建Mock服务 |
3. 核心测试点(必覆盖)
-
正常流程:24小时内功能可用;
-
临界场景:24小时整触发过期,23小时59分59秒仍可用;
-
异常场景:跨天/跨月/跨年的24小时、时区差异;
-
用户体验:过期后有清晰提示,支持重新生成/激活。
三、黑盒测试核心方法(新手必学)
黑盒测试不关注代码内部逻辑,只看输入输出,核心是用最少的用例覆盖最多场景,以下两种方法最常用,结合使用效果最佳。
1. 等价类划分法
核心概念:将输入数据划分为"有效等价类"(符合需求)和"无效等价类"(不符合需求),减少测试用例数量。
示例(6~15位字符输入):
-
有效等价类:6~15位字符(如abc123、test123456789);
-
无效等价类:<6位(a12)、>15位(abcdefghijklmnopq)、含非法字符(!@#、空格)。
2. 边界值分析法
核心概念:作为等价类划分的补充,重点测试输入/输出的边界值(软件缺陷多出现于边界),分为"边界值"(范围端点)和"次边界值"(边界附近临界值)。
示例(有效范围[6,15],闭区间):
-
边界值:6(有效)、15(有效);
-
次边界值:5(无效)、16(无效)。
口诀(必背):等价类抓中间,边界值掐两头。
四、正交表测试(多因素多水平高效测试)
当测试场景有多个输入条件(因素),每个条件有多种取值(水平),全量测试用例太多,用正交表可大幅精简,核心是"均匀覆盖关键组合"。
1. 正交表L₄(2³)解读(最常用)
-
L:正交表;4:4行(4条测试用例);2³:3个因素,每个因素2个水平;
-
核心性质:均衡性(每列不同取值出现次数相同)、正交性(任意两列组合齐全均衡);
-
价值:全量测试需8次,用正交表仅需4次,不遗漏关键组合。
2. 实操示例(注册场景)
5个因素(姓名、邮箱、密码、确认密码、验证码),每个因素2个水平(填写/不填写),全量需32条用例,用正交表可精简为6条核心用例,核心逻辑:覆盖所有因素的关键组合,波浪号(~)表示该因素可任意取值(不影响覆盖)。
五、接口测试示例(博客详情接口)
接口测试是测试核心,以博客详情接口(POST /blog/getBlogDetail?blogId={id})为例,覆盖请求方法、身份认证、请求参数3个核心维度,直接套用即可。
核心测试场景及用例
| 测试类型 | 测试场景 | 操作步骤 | 预期结果 |
|---|---|---|---|
| 请求方法 | 正确GET请求 | 改用GET方式携带blogId请求 | 正常返回数据或提示方法不允许 |
| 身份认证 | 不携带Token | 移除user_token_header请求头 | 返回401,提示缺少认证信息 |
| 请求参数 | blogId为无效值 | 传入blogId=999999(不存在) | 返回失败,提示博客不存在 |
六、常见测试类型全解析
整理了软件测试中最核心的测试类型,明确每种类型的核心目标、方法和场景,避免混淆,面试常考。
1. 功能测试、性能测试、可靠性测试
-
功能测试:核心是"功能能用",验证软件是否实现需求规定的功能,用黑盒测试方法(等价类、边界值等);
-
性能测试:核心是"功能用得快",关注响应时间、吞吐量、并发数、资源占用(CPU/内存);
-
可靠性测试:核心是"功能用得稳",验证软件长时间运行、异常环境下(断电、断网)是否稳定,关注平均无故障时间(MTBF)。
2. 静态测试vs动态测试
| 维度 | 静态测试 | 动态测试 |
|---|---|---|
| 是否运行程序 | 不运行 | 必须运行 |
| 核心手段 | 代码走查、文档评审、工具扫描 | 功能测试、接口测试、压测 |
| 发现问题阶段 | 编码/设计阶段(早期) | 程序运行时 |
一句话记忆:静态看代码/文档找问题,动态跑程序看结果找问题。
3. 白盒测试(结构测试)
核心是"看代码,围绕代码逻辑设计用例",重点覆盖程序内部逻辑路径,常用6种覆盖方法(从弱到强):
-
语句覆盖:每一行可执行代码至少执行一次(最弱);
-
判定覆盖:每个判断语句的真假分支至少执行一次;
-
条件覆盖:每个判断中的独立条件真假至少取一次;
-
判定条件覆盖:同时满足判定覆盖和条件覆盖;
-
条件组合覆盖:每个判断中所有条件的真假组合至少出现一次;
-
路径覆盖:覆盖所有可能的执行路径(最强)。
4. 白盒vs黑盒vs灰盒测试(通俗区分)
-
白盒测试:拆代码,逐行查逻辑(开发人员常用,单元测试);
-
黑盒测试:不看代码,只看输入输出(测试人员常用,系统测试);
-
灰盒测试:介于两者之间,知道部分内部结构,重点测模块间交互(集成测试常用)。
5. 集成测试vs系统测试vs回归测试
-
集成测试:测模块之间的接口和交互(比如登录模块→博客列表模块),开发人员执行,用灰盒测试;
-
系统测试:测整个系统是否符合需求,测试人员执行,用黑盒测试,包含冒烟测试、用例执行测试;
-
回归测试:核心是"改代码后,老功能还能用",比如修复Bug、新增功能后,重新测试原有功能,避免引入新缺陷(常用自动化执行,提高效率)。
6. 验收测试
软件交付前的最后一道关卡,由用户/甲方执行,用黑盒测试,验证软件是否符合真实业务需求(系统测试是测是否符合设计规格,验收测试是"用户说了算")。
7. 手工测试vs自动化测试
两者互补,不是替代关系:
-
自动化测试:适合回归测试、批量场景(一次编写,重复执行),效率高、无疏忽,但技术要求高,无法做发散性测试;
-
手工测试:适合新功能探索、界面易用性测试,灵活自由,能发现脚本覆盖不到的问题,但效率低、成本高。
七、面试/课设补充建议
以上知识点涵盖了软件测试的核心考点和实操场景,如果你需要,可提供可直接演示的漏洞代码(Java/SpringBoot)+修复代码、测试用例模板、Postman集合导出格式,拿去做课设、面试都能用,省去自己整理的时间。
最后提醒:软件测试的核心是"发现缺陷、保障质量",所有测试方法和场景,都围绕"需求"展开,记住核心知识点,结合实操练习,就能快速上手~