Test-First Programming
什么是软件测试?
-
The process of checking the quality, functionality, and perfomance of a sofware product before launching. 1
-
The act of examing the artifacts and the behavior of the software under test by vertification and validation. 2
-
The process checks whether the actual software matches the expected requirements and ensures the software is bug-free.3
-
软件测试是一项调查,旨在为利益相关者提供有关产品或服务质量的信息。
测试能提高软件正确率,但是不能使正确率达到100%!
软件测试的特征
软件测试的目的:破坏、证错、负能量。尽快的发现程序中的错误。
再好的测试也不能证明系统中没有错误。
优秀的测试:
- 能及时发现错误
- 简洁高效
- 最佳特性
- 既不简单也不复杂
测试的层次
- 单元测试:对软件的单元或组件进行测试,验证它们是否按照设计运作。
- 集成测试:将多个小的单元一起测试,验证不同单元之间的交互是否故障。
- 系统测试:对完整的集成系统进行测试,验证系统是否符合规定要求。
- 验收测试:对系统的可接受性进行测试,验证系统是否符合业务要求,以及是否能够被验收。
测试方法
1. Static Testing & Dynamic Testing
- 静态测试通常是隐式的,使用编程工具或文本编辑器检查代码结构、语法和数据流的静态分析。
- 动态测试发生在程序运行时,通常在程序没有完全运行的过程中,检查部分组件。
测试通常用于发现错误,而Debug用于找出错误的根源。
2. White-Box Testing & Black-Box Testing
- 白盒测试是对程序内部结构的测试。
- 黑盒测试是对程序外在表现的测试。
序号 | 黑盒测试 | 白盒测试 |
---|---|---|
1 | 不关心内部代码结构 | 关心内部代码结构 |
2 | 又被成为数据驱动测试 | 又被称为结构测试 |
3 | 面向使用者、测试者、开发者 | 面向测试者与开发者 |
4 | 只能通过试错实现 | 可以更好地测试数据域与内部边界 |
5 | 一般用于集成测试和系统测试 | 一般在单元测试阶段完成 |
6 | 可以检测规范要求的缺失 | 无法检测规范要求功能的缺失 |
软件测试的难点
- 软件行为在离散输入空间中差异巨大:
- 大多数正确,小部分出错
- bug的出现不符合特定概率分布
- 无统计规律可循。
测试用例
1. 什么是测试用例?
-
test case = test input + excution condition + expected result
-
测试用例是对程序的一个提问,是为了验证程序是否满足某种特定需求的样板。
2. 什么是一个好的测试用例?
- 最可能发现错误
- 不重复、不冗余
- 最有效
- 既不简单也不复杂
3. 编写测试用例的方法
基于等价类划分编写测试用例:将函数的输入域划分为等价类,从等价类中导出测试用例。
假设:相似的输入将会展示相似的行为,因此从每个等价类中选择一个代表即可。从而大幅度减少测试用例的范围。
大量的错误发生在输入域的边界而非中央,边界分析方法是对等价类划分的补充。
- 程序员经常犯大小差1的错误。
- 某些边界值是特殊情况,需要特殊处理。
- 程序的行为在某些边界处发生突变。
测试驱动开发(TDD)
-
Process:
-
写出程序的spec。
-
写出符合spec的测试用例。
-
写/改代码,执行测试。(重复第三步直到测试通过)。
-
-
先写测试可以大幅度提高写代码的效率。
- 写测试用例可以加强对spec的理解。
代码覆盖度
概念:在测试中,源代码被测试的比例。
基本的覆盖率准则:
- 函数覆盖率:程序中被调用函数的比例。
- 语句覆盖率:程序中执行的语句的比例。
- 分支覆盖率:程序中执行的分支语句的比例。
- 条件覆盖率:程序中被取过真假值的布尔子表达式。
实际中,根据预先设定的覆盖度标准,逐步增加测试用例的数量,直到覆盖度达到标准。
自动测试&回归测试
1. 自动测试
意义:手工测试代价太高,使用自动化测试可以提高测试效率。
方法:使用自动化测试框架(Junit),自动调用函数、自动判定结果、自动计算覆盖度。
只是自动执行测试用例,而不是自动生成测试用例。
2. 回归测试
-
一旦程序被修改,重新执行以前的所有测试。
-
一旦发现bug,要马上重写一个可重现改bug的测试用例,并将其加入测试库。
Reference
Katalon (2023) What is software testing? definition, types, and Tools, katalon.com. Available at: https://katalon.com/resources-center/blog/software-testing (Accessed: 25 March 2024). ↩︎
Software testing (2024a) Wikipedia. Available at: https://en.wikipedia.org/wiki/Software_testing (Accessed: 25 March 2024). ↩︎
GfG (2024) What is software testing?, GeeksforGeeks. Available at: https://www.geeksforgeeks.org/software-testing-basics/ (Accessed: 25 March 2024). ↩︎