课程作业

slide

测试一个真实的软件系统

  1. 选择一个 real-world software 作为待测软件 (Software Under Test, SUT)

  2. 挑选合适的一种或多种测试技术
    • 可以采用任何测试方法 (本门课程介绍的测试方法可作为一个比较好的出发点)
    • 从各种渠道搜集资料做一些研究 (that is, do some re-search),进一步了解拟采用的测试方法。在这一过程中,思考以下一些问题:
      • 你打算对 SUT 的哪个部分/方面进行测试?
      • 拟采用的测试方法是否适合解决相关问题?
      • 如何使用这种方法?相关的测试工具有哪些?
      • 实际应用这些测试方法时会面临什么挑战?
  3. 实施具体的测试
    • 结合已有的测试框架和测试工具,编写测试代码/脚本,尽可能实现自动化测试 (当然,测试的自动化程度取决于具体的 SUT 和测试方法)。在这一过程中,你需要尝试解决软件测试的两大关键问题:
      • 测试输入数据如何生成?
      • 测试预期输出结果如何判定?
      • 没思路时可以问问 ChatGPT,但不要被误导 😜
    • 收集和分析测试数据,量化测试结果 (例如,统计某种覆盖率)。在这一过程中,我们鼓励你:
      • 将找到的 bug 汇报给软件开发者 (例如,在 GitHub 提交一个 issue)
      • 和某种 baseline 方法进行对比 (例如,已有的测试用例集、随机测试等)
  4. 精心准备 slides 并在课堂上口头汇报
    • 对待测软件和测试方法进行简要介绍
    • 对测试过程进行介绍,例如:
      • 测试执行环境的设置
      • 测试输入数据设计方法
      • 测试预期输出判定方法
      • 测试执行的具体步骤等
    • 对测试结果进行介绍,例如:
      • 测试结果如何
      • 有哪些有意思的发现
      • 测试是否有效、测试有效和无效的可能原因有哪些
      • 有哪些地方可以进一步改进
      • 对你未来可能的软件开发有何启示等
    • 每人 15 分钟左右,计划在第 11~16 周之内随堂完成 (无需提前预约,当天课前说明即可)

候选待测软件

这里给出了几类我们推荐的待测软件,你可以根据个人兴趣从中进行挑选。当然,你也可以选择其它类型的待测软件,但需要说明你的选择足够符合 real-world 的要求 (而不是一个简单的 toy program)。

1. Library

我们开发的大部分应用程序都依赖很多基础的 library,这些 library 中不可避免地会存在很多问题和隐患 (有些时候代码执行结果不对并不是你的问题)

2. REST API

当现代软件开发向面向服务和微服务方向发展时,企业 Web 系统通常会以 REST API 向外提供服务

  • 例如,GitHubAzureWeatherStack高德地图腾讯云 等。此外 apis.guru 收集了 2000 多个 REST API,包括 weather, airport, hotel, book, cloud 等多种应用场景
  • 问题是相似的,即如何确定当个 API 每个参数的取值、以及如何确定不同 API 的执行顺序
  • 但 REST API 通常有相对结构化的 OpenAPI 文档,REST 本身建议遵循的设计风格可以提供帮助

3. Mobile App

以 Event-Driven 方式开发的 GUI 应用软件

  • 各大 App Store 中下载的各类 App,或者 F-Droid 等开源 Android App 库
  • 可以借助各种已有的 Driver 来向待测 App 发送各种事件
    • 如何测试到尽可能多的页面 (触发尽可能多的行为)?
    • 页面中出现的输入框中应该填什么?
    • 除了功能正确性外,还可以考虑性能 (速度、资源消耗等)、兼容性、可访问性等方面的测试

4. Compiler & Solver

编译器和求解器作为一类重要的基础软件,当然也要进行测试

  • 例如,gccllvmZ3 ProverChoco-solver
  • 此时的测试输入将包括一个程序、或者一个约束表达式
    • 这样的测试输入如何构造 (同时如何确保是一个合法的输入)?
    • 又如何判断测试输出结果是否正确 (Differential Testing 是一种常见的策略)?

5. AI Software

图像分类、机器翻译、智能问答等 AI 软件当然也是软件,同样也需要测试

  • 例如,Multi-Label ClassifierGoogle Translation APIGoogle Vision APIChatGPT
  • 但软件的形式和本质开始产生变化
    • 测试覆盖标准如何定义 (对代码行进行覆盖好像意义不大)?
    • 测试输入如何构造 (如何生成一个「随机」的图片)?
    • 测试输出如何判断 (软件测试的老问题)?
  • 如何将已有的测试方法迁移到 AI 软件的测试、以及如何设计更合理的测试策略?

6. Game

谁不爱玩游戏呢?而且测试领域有个专门的术语叫 Play Test

  • 测试过程看起来和玩游戏没什么区别
  • 但这里面有什么关键的测试问题、又如何解决 (这才是重点)?

7. Testing Tools

Who Watches the Watchers? 测试工具里当然也有 Bug

  • 例如,本课程网站中给出的测试工具
  • 很多传统的软件测试方法在这里都有发挥的空间 (例如,使用 “随机测试” 测试 “随机测试工具”)