核心知识点一览
| 序号 | 知识点 | 一句话概括 |
|---|---|---|
| 1 | 测试用例设计 | 用有限用例覆盖最多场景 |
| 2 | 等价类划分 | 输入数据分区间,一个代表一类 |
| 3 | 边界值分析 | 多数Bug藏在边界上 |
| 4 | 黑盒vs白盒 | 功能验证 vs 代码逻辑验证 |
| 5 | 缺陷生命周期 | 从提交到关闭的完整流程 |
| 6 | 自动化测试框架 | 用代码代替手动点击 |
| 7 | 性能测试指标 | 响应时间、吞吐量、并发用户数 |
| 8 | 接口测试 | 直接验证服务端逻辑 |
| 9 | 测试环境搭建 | 隔离、可控、可复现 |
| 10 | 测试报告撰写 | 用数据说话,而非主观感受 |
---

核心问题:如何用最少的用例发现最多的Bug?
是什么:测试用例(Test Case)是一组输入、执行条件和预期结果的集合,用于验证软件功能是否按预期工作。
为什么重要:无计划的测试就像在迷宫里乱撞——你可能永远走不到出口。一份好的测试用例集,能保证即使换了测试人员,也能覆盖核心功能。
怎么做:
- ►先列出所有功能点(比如登录:输入用户名、密码、点击登录按钮)
- ►对每个功能点应用等价类划分和边界值分析(见第2、3点)
- ►每个用例包含:编号、模块、前置条件、测试步骤、输入数据、预期结果、实际结果、状态
真实案例:测试一个登录功能
- ►用例1:输入正确用户名和密码 → 登录成功,跳转首页
- ►用例2:输入正确用户名,错误密码 → 提示“密码错误”
- ►用例3:输入空用户名 → 提示“用户名不能为空”
- ►用例4:用户名包含特殊字符 → 根据需求判断是否允许
---
核心问题:当输入数据范围很大时,怎么选测试数据?
是什么:把输入数据分成若干个“等价类”,每个等价类中的任意一个数据,对测试结果的影响是一样的。你只需要从每个类中选一个代表来测试。
为什么有效:假设一个输入框接受1-100的整数,你不需要测1,2,3,...,100。只需测一个有效值(如50)和一个无效值(如0或101)就够了。这大幅减少了测试用例数量。
怎么做:
1. 确定输入条件(如:年龄字段,范围18-60)
2. 划分有效等价类:18-60(一个类)
3. 划分无效等价类:<18、>60、非数字、空值(四个类)
4. 从每个类中选一个值测试
示例:
| 等价类 | 代表值 | 预期结果 |
|---|---|---|
| 有效(18-60) | 30 | 通过 |
| 无效(<18) | 15 | 提示“年龄不符合要求” |
| 无效(>60) | 65 | 提示“年龄不符合要求” |
| 无效(非数字) | "abc" | 提示“请输入数字” |
---
核心问题:为什么Bug大多出现在边界上?
是什么:边界值分析(Boundary Value Analysis)专门针对输入条件的边界值进行测试。比如范围是1-100,边界就是1和100,以及它们相邻的值:0、1、2、99、100、101。
为什么有效:程序员写代码时,常犯的错误就是“多了一个”或“少了一个”,比如 if (age >= 18) 写成了 if (age > 18),导致刚好18岁的人被拒绝。
怎么做:
- ►对每个边界,测试:边界值、边界值-1、边界值+1
- ►组合等价类和边界值:先划分等价类,再对每个等价类的边界做边界值测试
示例:测试一个密码长度6-20位
- ►边界值:6位、20位
- ►边界值-1:5位、19位
- ►边界值+1:7位、21位
- ►共6个测试数据,覆盖了所有边界情况
---
核心问题:测试时到底要不要懂代码?
黑盒测试:
- ►不看代码,只看功能
- ►输入什么 → 输出什么
- ►适合:功能测试、验收测试、系统测试
- ►工具:Selenium、Postman、JMeter
白盒测试:
- ►看代码,验证逻辑正确性
- ►覆盖语句、分支、路径、条件
- ►适合:单元测试、代码审查
- ►工具:JUnit、PyTest、SonarQube
什么时候用哪个?
- ►测试一个登录按钮 → 黑盒:点一下看能不能登录
- ►测试一个排序算法 → 白盒:检查代码中循环和条件分支是否正确
- ►实际项目中,两者结合使用:白盒保证代码质量,黑盒保证用户能正常使用
---
核心问题:发现Bug后,接下来会发生什么?
标准流程:
1. 提交:测试人员记录Bug(标题、步骤、截图、环境、严重级别)
2. 确认:测试经理或开发负责人确认是否是Bug
3. 分配:分配给对应开发人员
4. 修复:开发修复代码
5. 验证:测试人员在新版本上验证是否修复
6. 关闭:验证通过,关闭Bug
常见状态:
- ►NEW(新提交)
- ►ASSIGNED(已分配)
- ►FIXED(已修复)
- ►VERIFIED(已验证)
- ►CLOSED(已关闭)
- ►REOPENED(重新打开,验证未通过时)
一个小技巧:提交Bug时,附上清晰的截图和日志,能大幅缩短开发定位问题的时间。
---
核心问题:手动测试太慢,怎么用代码代替?
是什么:自动化测试框架是一套工具和规则的集合,让你能编写脚本自动执行测试用例,并生成报告。
为什么需要:
- ►回归测试:每次发版都要跑一遍,手动跑太慢
- ►重复性高:同样的操作,每天跑几十遍
- ►稳定性:代码执行不会疲劳,不会漏步骤
常用框架:
- ►Web UI:Selenium(Python/Java)+ WebDriver
- ►移动端:Appium(支持iOS和Android)
- ►接口:Requests(Python)+ pytest
- ►性能:JMeter、Locust
一个简单的Selenium示例(Python):
打开浏览器
driver = webdriver.Chrome()
driver.get("https://example.com/login")
输入用户名和密码
driver.find_element(By.ID, "username").send_keys("test_user")
driver.find_element(By.ID, "password").send_keys("test_pass")
点击登录
driver.find_element(By.ID, "login_btn").click()
验证登录成功
assert "Dashboard" in driver.title
关闭浏览器
driver.quit()
**踩坑指南**:
- 元素定位:优先用ID,其次用CSS Selector,最后用XPath
- 等待:显式等待(WebDriverWait)比隐式等待更可靠
- 数据隔离:测试数据不要和生产环境共用
---
<div style="margin:24px 0;border:1px solid #E3F2FD;border-radius:8px;background:#FAFAFA;overflow:hidden;"><div style="display:flex;align-items:center;gap:12px;padding:12px 20px;background:linear-gradient(135deg,#E3F2FD,#BBDEFB);"><span style="width:36px;height:36px;background:#2196F3;color:#fff;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-weight:bold;font-size:16px;flex-shrink:0;">7. </span><span style="font-size:17px;font-weight:700;color:#1565C0;">性能测试指标</span></div><div style="padding:16px 20px;"><p><strong>核心问题:系统到底能扛多少人同时用?</strong></p>
<p><strong>关键指标</strong>:</p>
<p>1. <strong>响应时间</strong>:用户发请求到收到响应的时间。通常要求:<200ms(优秀)、<500ms(良好)、<1s(可接受)</p>
<p>2. <strong>吞吐量</strong>:单位时间内系统处理的请求数。单位:TPS(每秒事务数)或QPS(每秒查询数)</p>
<p>3. <strong>并发用户数</strong>:同一时刻系统能同时处理的活跃用户数</p>
<p>4. <strong>错误率</strong>:失败请求占总请求的百分比。通常要求<1%</p>
<p>5. <strong>资源利用率</strong>:CPU、内存、磁盘、网络的使用情况</p>
<p><strong>怎么测</strong>:</p>
<ul style="list-style:none;padding-left:0;margin:12px 0;">
<li style="position:relative;padding:4px 0 4px 24px;line-height:1.8;"><span style="color:#2196F3;font-weight:bold;position:absolute;left:4px;">►</span>工具:JMeter、LoadRunner、Gatling</li>
<li style="position:relative;padding:4px 0 4px 24px;line-height:1.8;"><span style="color:#2196F3;font-weight:bold;position:absolute;left:4px;">►</span>过程:制定场景 → 录制脚本 → 参数化 → 设置并发 → 运行监控 → 分析报告</li>
</ul>
<p><strong>一个JMeter示例(概念)</strong>:</p>
<ul style="list-style:none;padding-left:0;margin:12px 0;">
<li style="position:relative;padding:4px 0 4px 24px;line-height:1.8;"><span style="color:#2196F3;font-weight:bold;position:absolute;left:4px;">►</span>线程组:设置100个并发用户</li>
<li style="position:relative;padding:4px 0 4px 24px;line-height:1.8;"><span style="color:#2196F3;font-weight:bold;position:absolute;left:4px;">►</span>HTTP请求:配置目标URL和参数</li>
<li style="position:relative;padding:4px 0 4px 24px;line-height:1.8;"><span style="color:#2196F3;font-weight:bold;position:absolute;left:4px;">►</span>监听器:聚合报告、响应时间图</li>
<li style="position:relative;padding:4px 0 4px 24px;line-height:1.8;"><span style="color:#2196F3;font-weight:bold;position:absolute;left:4px;">►</span>运行10分钟,观察TPS和错误率</li>
</ul>
<p><strong>常见问题</strong>:</p>
<ul style="list-style:none;padding-left:0;margin:12px 0;">
<li style="position:relative;padding:4px 0 4px 24px;line-height:1.8;"><span style="color:#2196F3;font-weight:bold;position:absolute;left:4px;">►</span>响应时间慢 → 检查数据库查询、缓存、代码逻辑</li>
<li style="position:relative;padding:4px 0 4px 24px;line-height:1.8;"><span style="color:#2196F3;font-weight:bold;position:absolute;left:4px;">►</span>错误率高 → 检查服务器连接池、内存溢出、超时设置</li>
</ul>
<p>---</p></div></div>
<div style="margin:24px 0;border:1px solid #E3F2FD;border-radius:8px;background:#FAFAFA;overflow:hidden;"><div style="display:flex;align-items:center;gap:12px;padding:12px 20px;background:linear-gradient(135deg,#E3F2FD,#BBDEFB);"><span style="width:36px;height:36px;background:#2196F3;color:#fff;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-weight:bold;font-size:16px;flex-shrink:0;">8. </span><span style="font-size:17px;font-weight:700;color:#1565C0;">接口测试</span></div><div style="padding:16px 20px;"><p><strong>核心问题:UI还没做好,能先测后端逻辑吗?</strong></p>
<p><strong>是什么</strong>:直接对API(应用编程接口)进行测试,不经过UI。比如测试一个“获取用户信息”的接口,直接发送HTTP请求,验证返回的JSON数据是否正确。</p>
<p><strong>为什么重要</strong>:</p>
<ul style="list-style:none;padding-left:0;margin:12px 0;">
<li style="position:relative;padding:4px 0 4px 24px;line-height:1.8;"><span style="color:#2196F3;font-weight:bold;position:absolute;left:4px;">►</span>前置:UI开发完之前就能测,大幅提前测试时间</li>
<li style="position:relative;padding:4px 0 4px 24px;line-height:1.8;"><span style="color:#2196F3;font-weight:bold;position:absolute;left:4px;">►</span>稳定:接口比UI稳定,UI变了接口可能不变</li>
<li style="position:relative;padding:4px 0 4px 24px;line-height:1.8;"><span style="color:#2196F3;font-weight:bold;position:absolute;left:4px;">►</span>效率:一次接口测试能覆盖多个UI测试场景</li>
</ul>
<p><strong>怎么做</strong>:</p>
<ul style="list-style:none;padding-left:0;margin:12px 0;">
<li style="position:relative;padding:4px 0 4px 24px;line-height:1.8;"><span style="color:#2196F3;font-weight:bold;position:absolute;left:4px;">►</span>工具:Postman(手动)、Requests(Python代码)、pytest(自动化)</li>
<li style="position:relative;padding:4px 0 4px 24px;line-height:1.8;"><span style="color:#2196F3;font-weight:bold;position:absolute;left:4px;">►</span>验证点:状态码、返回数据格式、业务逻辑正确性、异常处理</li>
</ul>
<p><strong>Python + Requests 示例</strong>:</p></div></div>
# 测试登录接口
url = "https://api.example.com/login"
payload = {"username": "test", "password": "test123"}
headers = {"Content-Type": "application/json"}
response = requests.post(url, data=json.dumps(payload), headers=headers)
# 验证状态码
assert response.status_code == 200
# 验证返回数据
data = response.json()
assert data["code"] == 0
assert "token" in data接口测试清单:
- ►正常参数 → 返回正确结果
- ►缺少参数 → 返回错误提示
- ►参数格式错误 → 返回错误
- ►超大数据 → 验证处理能力
- ►空数据 → 验证异常处理
---
核心问题:为什么测试环境总是不够用?
是什么:测试环境是独立于生产环境的、用于执行测试的软件和硬件环境。它应该尽可能模拟生产环境,但又完全隔离。
为什么重要:在错误的环境里测试,等于没测。比如你在Windows上测了,但用户都用Mac,那发现的问题可能和用户实际遇到的问题不一样。
怎么做:
1. 环境隔离:测试环境、预发布环境、生产环境必须分开
2. 数据独立:测试数据不能影响生产数据,反之亦然
3. 版本一致:测试环境使用的软件版本(如数据库、中间件)要和生产环境一致
4. 可复现:每次测试前,环境要能恢复到初始状态
常见架构:
- ►单机环境:开发机直接跑,适合小项目
- ►Docker环境:用容器隔离,快速搭建和销毁
- ►云环境:阿里云、腾讯云、AWS,按需创建
一个Docker环境示例(概念):
启动一个MySQL容器
docker run -d --name test-mysql -e MYSQL_ROOT_PASSWORD=root mysql:8.0
启动一个Redis容器
docker run -d --name test-redis redis:7.0
启动被测应用(假设是Spring Boot)
docker run -d --name app --link test-mysql:mysql --link test-redis:redis myapp:latest