RJSJ 16: 软件测试

测试背景

验证(Validation): 在开发过程结束后评估系统或组件以确定其是否满足规定要求

关注是否构建正确的产品

确认(Verification):评估系统或组件以确定给定开发阶段的产品是否满足该阶段开始时的条件

关注是否正确地构建了产品

为什么要测试

  1. 提升质量– 找错误(faults)

  2. 度量质量

    1. 证明没有错误? (可能吗?)
    2. 确认软件是否已做好准备可以被发布
    3. 确认下一步测哪里
  3. 学习/了解软件的手段之一

Testing shows the presence, not the absence of bugs.

谁去写测试用例

  • 开发者去测
  • 独立的测试人员
  • “用户”——灰度更新
  • 有领域知识的人

什么时候写测试用例

![截屏2025-05-18 11.01.58](截屏2025-05-18 11.01.58.png)

测试用例

  • 有意义的名称
  • 前置条件、流程
  • 期望结果

什么事测试用例

用已知的输入(测试输入/数据)运行被测软件,检查运行结果(基于测试预言)

测试结果:通过(pass)或失败(fail)

  • 测试用例可以对错误(faults)起到文档作用

  • 测试用例可以对被测代码起到文档作用

测试自动化

  • 测试用例是可自动执行的代码/脚本

  • 产业界项目里经常测试代码比产品代码体量更大

  • 测试代码可能比较无趣(并非可能)

    • 构造一些(复杂)的数据值
    • 运行一个或多个函数
    • 检查运行结果

测试用例的类型

  • 开发者测试/ 非开发者测试
  • 单元测试/ 集成测试/ 系统测试 / ……
  • 自动测试用例(Automated tests)/ 手动测试用例(Manual tests)
  • 功能测试 / 性能测试/ 负载测试 / 安全测试

单元测试

测试输入+测试断言

![截屏2025-05-18 11.05.27](截屏2025-05-18 11.05.27.png)

作为规约的测试用例

  • 测试用例展示如何使用系统
  • 测试用例需要可读性强
    • 需要注释/命名来描述其目
    • 保持简短,删除重复或冗余的测试用例

单元测试:度量质量

  • 覆盖率:所有的程序部分都测到了吗?
    • 语句
    • 分支
    • 基本块
  • 断言:程序做对的事情?
  • 只是高覆盖率或大量断言并不是高质量的测试用例。只有两者兼有才是!

黑盒 v.s. 白盒

黑盒(基于规约)

  • 等价类划分
  • 边界值分析

白盒(基于代码)

  • 代码覆盖

黑盒测试

  • 规范软件的行为

  • 应当明确、一致、清晰、简单……

    • 例:“高中生和初中生请举手”
  • JavaDoc 用于规范 Java 中的类和方法

    • JavaDoc 从代码中的注释开始
    • 自动生成网页便于浏览

黑盒测试:等价类划分

将输入域划分为不同组,组内情形等价

  1. 同一个类中的输入应当在程序中表现出相似行为
  2. 应当划分为有效等价类与无效等价类

确保检验每个类中的中间值

eg(等价类划分):某城市的电话号码由三部分组成。这三部分的名称和内容的合法情况是:

  1. 地区码:空白或三位数字
  2. 前缀:非’0’和’1’开头的三位数字
  3. 后缀:四位数字

程序检测输入的数据是否合法,如何划分等价类?

地区码 空白、三位数字 非数字存在,少于3位,多于3位
前缀 非’0’和’1’开头的三位数字 有非数字、0开头的数字、1开头的数字、少于3位数字、多余3位数字
后缀 四位数字 有非数字、少于4位数字、多余4位数字
  • 选取位于等价类边界的值进行测试
    • 错误往往出现在边界值上,而非区间中心
  • 设计越过边界的等价类以检测健壮性

eg:

  • 任何对象:空指针
  • 字符串:空串
  • 集合:
    • 空集
    • 恰含一个元素
    • 集合满(或差一个元素满)

黑盒测试编写指南

  • 根据需求书写测试用例
  • 测试用例应当对于需求可追踪
  • 测试用例应当可重复,使得不同的运行得到相同的结果
    • 输入应当明确
    • 期望结果明确:通过/失败

什么时候写黑盒测试用例?

TODO

白盒测试

给定系统内部细节,完整检测内部运行情况

检测所有代码片段(PIE模型)

  • 测试代码中的逻辑路径
    • 方法:覆盖所有语句
    • 指令:
    • 分支:覆盖所有分支
    • 条件:覆盖所有条件/条件组合
    • 循环:覆盖“循环”的所有等价类
      • 不执行循环 (0 passes)
      • 执行一遍循环 (1 pass)
      • 执行两遍循环 (2 passes)
      • 执行n遍循环 (n passes, n > 2)
  • 仍根据需求决定期望行为
  • 数量巨大 – 工作量大、时间长

白盒测试用例编写指南

  • 评估白盒测试用例的指标
    • 代码覆盖率:指令覆盖、分支覆盖等
  • 测试用例生成需要覆盖没有被覆盖的代码状态,如语句、分支等
  • 等价类划分/边界值分析任然适用
  • 通常在黑盒测试后进行

什么时候写白盒测试

TODO

代码覆盖工具

程序插装(instruments)

运行测试用例,生成数据库

辅助工具检测数据库,报告测试用例覆盖率

数据驱动测试

带参数单元测试用例

1
2
3
4
5
6
#include <boost/test/unit_test.hpp>
#include <vector>
BOOST_DATA_TEST_CASE(my_test_case, std::vector<int>{1, 2, 3}, data)
{
	BOOST_TEST(data > 0);
}

测试用例泛化

TODO

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy
发表了41篇文章 · 总计29.72k字