软件测试¶
先核对当年安排
公开教师主页可以证明南京大学存在软件测试相关教学,但不足以证明当前课程固定为某学分、某学期、某培养性质,也不能证明 MC/DC、Fuzzing 或某个工具是固定考试/实验要求。选课与考核信息应以所在年级培养方案、教务系统和当年课程平台为准。
课程边界¶
软件测试通过选择输入、执行程序和检查结果来发现缺陷并评估质量。它可以提高对目标行为的信心,但有限测试通常不能证明程序不存在缺陷。静态分析、形式化验证和动态测试可以互补,不能简单表述为“一种负责证明、另一种负责运行”。
通用知识地图¶
- 测试层次:单元、集成、系统和验收测试;各层的隔离边界与测试替身。
- 黑盒方法:等价类、边界值、判定表、状态转换和组合测试。
- 白盒方法:控制流图、语句/分支/条件覆盖、路径与数据流覆盖。
- MC/DC:检查各基本条件能否独立影响判定结果;是否纳入课程及要求到何种深度需看当年大纲。
- 变异测试:通过变异算子评估测试集发现人为缺陷的能力,并注意等价变异体问题。
- 自动化缺陷发现:模糊测试、符号执行、约束求解和属性测试等方法。
- 测试质量:可重复性、确定性、可诊断性、覆盖率含义及其局限。
实践方式¶
以下工具只用于说明常见技术组合,不代表南京大学当前教学班的指定实验:
- JUnit、pytest 等可用于单元测试;JaCoCo、coverage.py 等可用于覆盖率观测。
- AFL++、libFuzzer 等可用于覆盖引导的模糊测试。
- KLEE 等工具可用于理解符号执行与路径约束。
开始实验前应先确认课程指定语言、依赖版本、目标程序、允许的库和报告格式。覆盖率是观察手段,不应把某个未经课程文件证实的百分比写成统一达标线。
学习方法¶
- 从需求或性质出发定义测试预言(Oracle),再选择输入,而不是先追求覆盖率数字。
- 为失败用例保留最小复现、环境、随机种子和日志,使结果可复查。
- 解释未覆盖代码、不可达路径和等价变异体,避免把指标等同于质量结论。
- 对 Fuzzing 或符号执行实验,记录语料构造、约束、资源预算和崩溃去重方法。
参考资料¶
- 方春荣教师主页:可核对其软件测试相关教学与研究信息;具体开课安排仍看当年系统。
- Paul Ammann、Jeff Offutt:《Introduction to Software Testing》:通用测试理论参考。
- The Fuzzing Book:可执行的模糊测试与自动化测试教材,不替代校内实验规范。