测试优先的编程 {ignore=true}
1. 什么是测试
测试是一种从程序中发现错误的一种编程,根据这段话,很显而易见的一点就是测试的好坏衡量标准取决于其发现程序中bug的能力。
针对这种能力还需要几个要求,第一个就是测试不能冗余,也就是说测试用例之间不能有重复的部分,第二个就是最佳特性,并且不能太复杂也不能太简单。
测试的种类分为三种,分别是单元测试,集成测试和系统测试,单元测试是对程序中最小的可测试单元进行测试,集成测试是对程序中的模块进行测试,系统测试是对整个系统进行测试。而除此之外还有回归测试,顾名思义,回归测试就是在修改旧代码后,重新进行测试,以确保修改后的代码不会影响到原来的代码。
测试仅仅是一种检测代码bug的手段,是一种动态的行为,而语法上面的bug则可以由静态分析来完成,甚至可以判断空指针等常见的错误。
2. 测试用例
一个简单的公式可以描绘出测试用例是什么
测试用例
=
输入
+
执行条件
+
预期结果
测试用例 = 输入 + 执行条件 + 预期结果
测试用例=输入+执行条件+预期结果
3. 测试优先
有了前面的铺垫我们终于来到了重点,那就是测试优先。测试优先的编程就是在编写代码之前先编写测试用例,然后再编写代码。
这种测试优先的依据是各个函数的 spec,我们据此写测试,并且我们再进行代码的实现,显而易见的好处是无论在任何一个阶段,我都可以对写出的代码进行测试,极大程度地保证了不会出现bug集中爆发的情况。并且在编写测试的时候,我们还逐渐的理解 spec,并可以在中途不断修改、完善。
4. 等价类划分
等价类划分可以帮助我们清晰的去划分测试用例,从而更好的进行测试。
可以按照边界值、正负、奇偶等划分。
等价类的构造要尽量符合下图。
5. 黑盒测试与白盒测试
黑盒测试是指在测试的时候,我们只关注输入和输出,而不关注程序的内部结构,也就是说我们不知道程序的内部结构,只知道程序的功能,我们只关注程序的功能是否正确。
相对应的白盒测试是指在测试的时候,我们关注程序的内部结构,也就是说我们知道程序的内部结构,我们关注程序的每一条语句是否正确。
黑盒表示一种不可见的状态,而白盒表示一种透明清晰可见的意思,这两个命名也是有一定的道理的。
6. 测试覆盖率
我们对代码的覆盖有函数覆盖、语句覆盖、分支覆盖、条件覆盖、路径覆盖等。
函数覆盖就是测试中要调用每个函数至少一次、语句覆盖指每个语句至少调用一次、分支覆盖指每个条件分支至少调用一次,而条件覆盖指的是每个条件都要至少覆盖一次,路径覆盖指的是每个路径都要至少覆盖一次。
其中分支覆盖与条件覆盖容易混淆。
该图为分支覆盖(也叫判定覆盖)
该图为条件覆盖
其中效果上来说
路径覆盖
>
分支覆盖
>
语句覆盖
路径覆盖 > 分支覆盖 > 语句覆盖
路径覆盖>分支覆盖>语句覆盖