1. 测试的基本概念
-
定义:通过运行软件系统或组件,验证其是否满足需求,并识别实际结果与预期结果之间的差异。
-
目的:
-
发现缺陷(Bug/Defect)。
-
验证功能是否符合需求规格。
-
评估软件的可靠性、性能、安全性等质量特性。
-
-
测试与调试的区别:
-
测试:发现缺陷的过程(由测试人员或开发人员执行)。
-
调试:定位并修复缺陷的过程(由开发人员执行)。
-
2. 测试原则
-
测试显示缺陷的存在:测试只能证明软件有缺陷,不能证明无缺陷。
-
穷尽测试是不可能的:需通过风险分析确定测试重点。
-
早期测试:测试应尽早介入(如需求阶段开始评审)。
-
缺陷集群性(Pareto原则):80%的缺陷集中在20%的模块中。
-
杀虫剂悖论:重复相同的测试用例会降低发现新缺陷的能力,需定期更新测试用例。
-
测试依赖上下文:不同软件(如金融软件与游戏)需要不同的测试策略。
-
无错误谬误:即使软件无缺陷,也可能不符合用户需求。
3. 测试生命周期
-
需求分析:理解需求文档,明确测试范围。
-
测试计划:制定测试策略、资源分配、进度安排。
-
测试设计:设计测试用例、准备测试数据。
-
测试环境搭建:配置硬件、软件、网络等环境。
-
测试执行:运行测试用例,记录结果。
-
缺陷管理:报告、跟踪和验证缺陷修复。
-
测试报告:总结测试结果,评估软件质量。
4. 测试级别(测试金字塔)
-
单元测试(Unit Testing):验证单个函数或模块(开发者编写,常用框架如JUnit、pytest)。
-
集成测试(Integration Testing):测试模块间的交互(如API测试)。
-
系统测试(System Testing):测试完整的系统功能(包括功能和非功能测试)。
-
验收测试(Acceptance Testing):
-
用户验收测试(UAT):由最终用户验证是否满足需求。
-
Alpha/Beta测试:Alpha在受控环境中,Beta由真实用户公开测试。
-
5. 测试类型
功能测试
-
黑盒测试:基于需求规格,不关注内部代码(如等价类划分、边界值分析)。
-
白盒测试:基于代码逻辑(如语句覆盖、分支覆盖)。
-
灰盒测试:结合黑盒与白盒。
非功能测试
-
性能测试:负载测试、压力测试、并发测试。
-
安全测试:SQL注入、XSS漏洞等。
-
兼容性测试:不同浏览器、操作系统、设备。
-
可用性测试:用户体验(UI/UX)。
-
可靠性测试:长时间运行的稳定性。
6. 测试方法
-
静态测试:不运行代码(如需求评审、代码审查)。
-
动态测试:运行软件进行验证(如功能测试)。
-
手动测试:人工执行测试用例。
-
自动化测试:使用工具(如Selenium、Appium)执行重复性测试。
7. 黑盒测试技术
-
等价类划分:将输入数据分为有效/无效类。
-
边界值分析:测试输入范围的边界(如0-100,测试-1,0,100,101)。
-
决策表测试:组合多个输入条件。
-
状态转换测试:测试系统状态变化(如登录失败次数限制)。
-
用例测试:基于用户场景(如电商下单流程)。
8. 白盒测试技术
-
语句覆盖:每条代码语句至少执行一次。
-
分支覆盖:每个条件分支(如if-else)至少执行一次。
-
路径覆盖:覆盖所有可能的代码路径(复杂度高)。
9. 缺陷管理
-
缺陷生命周期:新建→分配→修复→验证→关闭。
-
严重性(Severity):缺陷对系统的影响(如崩溃、界面错误)。
-
优先级(Priority):修复的紧迫性(由业务需求决定)。
10. 测试工具
-
功能自动化:Selenium(Web)、Appium(移动端)、Cypress。
-
性能测试:JMeter、LoadRunner。
-
安全测试:OWASP ZAP、Burp Suite。
-
持续集成:Jenkins、GitLab CI(集成自动化测试)。
11. 测试趋势
-
AI在测试中的应用:自动生成测试用例、缺陷预测。
-
DevOps中的持续测试:CI/CD管道中嵌入自动化测试。
-
Shift-Left测试:在开发早期进行测试。
核心思想
-
验证(Verification):检查软件是否按设计实现(“做得对不对”)。
-
确认(Validation):检查软件是否满足用户需求(“做的是不是对的”)。