文章目录
基本概念
validation / verification
- validation: 是否构建了正确的系统
- verification: 是否以正确的方式构建系统
input domain / output domain
- input domain & input domain
- 输入类型中的值集称为输入域,
- 输出类型中的值集称为输出域。
- 上述例子中,输入的类型是
string
和char
,因此根据输入域的定义,输入域应该是所有 string 和 char 的组合;可以表示成 (s,c) 的集合,其中 s 是字符串,c 是字符 - 输出类型是隐式的,因为squeeze的参数是按引用传递的。如果非说 ouput domain,那么 squeeze 函数的 output domain 是所有的
string
- fibonacci 的输入域是所有的
unsigned int
,而输出域也是所有的unsigned int
- 输入域的 value 可能违反 specification,例如如果一个 input 导致了 divided by 0 问题(这是一个规范),那么也是有可能的
- 输入域在不同的系统上可能是不同的
- 有效地选择输入和输出域是非常重要的,但是并不像上面说的这么容易
deterministic / non-deterministic
- deterministic / non-deterministic: 如果对于一个 input,输入 function 之后结果总是相同的,那么这个 function 是 deterministic,否则是 non-deterministic 的。
terminate / not-terminate
- terminate / not terminate:一个程序是否能够正常终止。以下程序是 not-terminate 的
- 无限循环
- 等待事件的程序(例如等待用户输入)
- 上述的
squeeze
和fibonacci
都是termiate
的程序,也就是他们最终都会终止,只不过对于fibonacci
有返回值,因此测试程序可以直接用这个返回值来做判断,而squeeze
没有返回值,因此必须重新查看 input 进去的数组来确定是否正确地执行操作 - 对于那些
not-terminate
的程序,由于我们无法得到最后的结果(没有 return)因此,有些not-terminate
可以通过查看其中间的 observable outputs 来查看,或者有些干脆就对外不可见
Testing
概念
- testing 的目的是找 failure,找不到 failure 的 testing 没意义