软件测试与测试优先的编程课程总结
测试的重要性
测试是提高软件质量的重要手段,它可以检验软件中可能出现的错误,保证软件构造的正确性,增强用户体验。测试优先的编程是一种新型的编程方式,能极大限度地保证编程的正确性,有助于提高代码质量、减少错误和缺陷、加快开发速度并推动良好的软件设计实践。
测试种类
1. 单元测试
测试代码中实现特定功能的部分,比如功能函数是否正确实现。
2. 集成测试
测试多个类,包,组件,子系统这些集成的模块,来验证对应的功能模块的功能是否正确实现。
3. 系统测试
应用于软件构造的最后阶段,来测试整个软件的最终版本的正确性。
如何进行软件测试
首先,我们需要确定单靠偶然测试是没有意义的,因为它很难覆盖实际应用遇到的全部用例。除此之外,基于样本的统计数据对软件测试的意义也不大,软件与硬件不同,软件产品之间往往存在着巨大的差异,并没有统计分布规律可循,因此,软件测试必须要系统化!这也反映了测试优先的编程的重要性。
测试优先的编程
简单来说,就是写代码之前先写测试。
流程:先写spec—>再写满足spec的测试用例—>根据测试用例写代码,写完后执行测试,出现错误后更改,直到通过它。
什么是spec?
spec是软件功能的规范,类似于需求文档。
- 变量的类型
- 返回值的类型
- 它们之间的约束和关系
- 程序要实现的具体功能
如何写测试用例?
测试用例的书写是基于spec的,它的基本结构为:输入+执行条件+期望结果
等价类划分
我们可以基于等价类划分来书写测试用例,根据spec中对于输入的约束,我们可以划分出有限个等价类,我们假设相同的等价类具有相似的行为,这样就可以降低测试用例的数量。
等价类的划分可以有多种形式,比如根据正负划分,根据整数的大小划分,根据输入的类型划分等等。
边界值分析
边界值分析方法是对等价类方法的补充。由于大量的错误发生在边界而非中央,所以在等价类划分时,将边界作为等价类之一加入考虑是必要的。比如,在输入整数时,我们可以将Integer.MIN_VALUE,Integer.MAX_VALUE作为等价类。
划分覆盖
刚才讨论了将输入用例划分为若干等价类,在实际测试中,我们还需要将这些等价类进行组合。
有两种方式。笛卡尔积:全覆盖 覆盖每个取值:一种等价类出现最少一次即可
有各自优点。前者:测试完备,但用例数量多,测试代价高。
后者:测试用例少,代价低,但测试覆盖度未必高。
测试工具——JUnit
JUnit 是一个被广泛采用的 Java 单元测试框架。
一个JUnit是一个被@test标记的测试函数方法,它有很多库方法,比如最常用的assertEquals(x,y),用于判断期待输出和实际输出是否相等。