课程作业
测试一个真实的软件系统
选择一个 real-world software 作为待测软件 (Software Under Test, SUT)
- 挑选合适的一种或多种测试技术
- 可以采用任何测试方法 (本门课程介绍的测试方法可作为一个比较好的出发点)
- 从各种渠道搜集资料做一些研究 (that is, do some re-search),进一步了解拟采用的测试方法。在这一过程中,思考以下一些问题:
- 你打算对 SUT 的哪个部分/方面进行测试?
- 拟采用的测试方法是否适合解决相关问题?
- 如何使用这种方法?相关的测试工具有哪些?
- 实际应用这些测试方法时会面临什么挑战?
- 实施具体的测试
- 结合已有的测试框架和测试工具,编写测试代码/脚本,尽可能实现自动化测试 (当然,测试的自动化程度取决于具体的 SUT 和测试方法)。在这一过程中,你需要尝试解决软件测试的两大关键问题:
- 测试输入数据如何生成?
- 测试预期输出结果如何判定?
- 没思路时可以问问 ChatGPT,但不要被误导 😜
- 收集和分析测试数据,量化测试结果 (例如,统计某种覆盖率)。在这一过程中,我们鼓励你:
- 将找到的 bug 汇报给软件开发者 (例如,在 GitHub 提交一个 issue)
- 和某种 baseline 方法进行对比 (例如,已有的测试用例集、随机测试等)
- 结合已有的测试框架和测试工具,编写测试代码/脚本,尽可能实现自动化测试 (当然,测试的自动化程度取决于具体的 SUT 和测试方法)。在这一过程中,你需要尝试解决软件测试的两大关键问题:
- 精心准备 slides 并在课堂上口头汇报
- 对待测软件和测试方法进行简要介绍
- 对测试过程进行介绍,例如:
- 测试执行环境的设置
- 测试输入数据设计方法
- 测试预期输出判定方法
- 测试执行的具体步骤等
- 对测试结果进行介绍,例如:
- 测试结果如何
- 有哪些有意思的发现
- 测试是否有效、测试有效和无效的可能原因有哪些
- 有哪些地方可以进一步改进
- 对你未来可能的软件开发有何启示等
- 每人 15 分钟左右,计划在第 11~16 周之内随堂完成 (无需提前预约,当天课前说明即可)
候选待测软件
这里给出了几类我们推荐的待测软件,你可以根据个人兴趣从中进行挑选。当然,你也可以选择其它类型的待测软件,但需要说明你的选择足够符合 real-world 的要求 (而不是一个简单的 toy program)。
1. Library
我们开发的大部分应用程序都依赖很多基础的 library,这些 library 中不可避免地会存在很多问题和隐患 (有些时候代码执行结果不对并不是你的问题)
- 例如,numpy (Python)、scipy (Python)、Apache Commons Numbers (Java)、Jackson (Java)、glibc (C) 等
- 其实就是对 library 中各式各样的 API 进行测试:
- 当对每个 API 分别进行测试时,如何确定每个参数的取值 (以白盒或者黑盒的方式)?
- 当考虑多个 API 时,如何确定这些 API 的执行顺序?
2. REST API
当现代软件开发向面向服务和微服务方向发展时,企业 Web 系统通常会以 REST API 向外提供服务
- 例如,GitHub、Azure、WeatherStack、高德地图、腾讯云 等。此外 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
编译器和求解器作为一类重要的基础软件,当然也要进行测试
- 例如,gcc、llvm、Z3 Prover、Choco-solver 等
- 此时的测试输入将包括一个程序、或者一个约束表达式
- 这样的测试输入如何构造 (同时如何确保是一个合法的输入)?
- 又如何判断测试输出结果是否正确 (Differential Testing 是一种常见的策略)?
5. AI Software
图像分类、机器翻译、智能问答等 AI 软件当然也是软件,同样也需要测试
- 例如,Multi-Label Classifier、Google Translation API、Google Vision API、ChatGPT 等
- 但软件的形式和本质开始产生变化
- 测试覆盖标准如何定义 (对代码行进行覆盖好像意义不大)?
- 测试输入如何构造 (如何生成一个「随机」的图片)?
- 测试输出如何判断 (软件测试的老问题)?
- 如何将已有的测试方法迁移到 AI 软件的测试、以及如何设计更合理的测试策略?
6. Game
谁不爱玩游戏呢?而且测试领域有个专门的术语叫 Play Test
- 测试过程看起来和玩游戏没什么区别
- 但这里面有什么关键的测试问题、又如何解决 (这才是重点)?
7. Testing Tools
Who Watches the Watchers? 测试工具里当然也有 Bug
- 例如,本课程网站中给出的测试工具
- 很多传统的软件测试方法在这里都有发挥的空间 (例如,使用 “随机测试” 测试 “随机测试工具”)