《码出高效(Java开发手册》学习笔记8)

【《码出高效(Java开发手册》学习笔记8)】单元测试的概念:计算机世界里的软件产品通常是由模块组合而成的,模块又可以分成诸多子模块。比如淘宝系统由搜索模块、商品模块、交易模块等组成,而交易模块又分成下单模块、支付模块、发货模块等子模块,如此细分下去,最终的子模块是由不可再分的程序单元组成的。对这些程序单元的测试,即称为单元测试(Unit Testing,简称单测)。
一、单元测试的基本原则
AIR原则:
A:Automatic(自动化)
I:Independent(独立性)
R:Repeatable(可重复)
单元测试应该是全自动执行的。测试用例通常会被频繁的触发执行,执行过程必须完全自动化才有意义。
单元测试中不允许使用System.out来进行人工验证,而必须使用断言来验证。
在进行单元测试时,为保证其独立性,用力之间不允许互相调用,也不允许出现执行次序的先后依赖。
编写单元测试时要保证测试粒度足够小,这样有助于精确定位问题,单元测试用例默认是方法级别的。单测不负责检查跨类或者跨系统的交互逻辑,那是集成测试需要覆盖的范围。编写单元测试用例时,为了保证被测模块的交付质量,需要符合 BCDE原则。
· B:Border,边界值测试,包括循环边界、特殊取值、特殊时间点、数据顺序等。
· C:Correct,正确的输入,并得到预期的结果。
· D:Design,与设计文档相结合,来编写单元测试。
· E: Error,单元测试的目标是证明程序有错,而不是程序无错。为了发现代码中潜在的错误,我们需要在编写测试用例时有一些强制的错误输入(如非法数据、异常流程、非业务允许输入等)来得到预期的错误结果。
二、单元测试覆盖率
1、粗粒度覆盖
粗粒度覆盖包括类覆盖和方法覆盖
2、细粒度覆盖
细粒度覆盖包括:行覆盖,分支覆盖,条件判定覆盖,条件组合覆盖,路径覆盖
三、单元测试编写
1、Junit单元测试框架
Junit测试注解:
2、命名
单元测试类的定义与被测类一一对应,放置于与被测类相同的包路径下,并以被测类名称加上Test命名。目录结构示例如下。
《码出高效(Java开发手册》学习笔记8)
文章图片

主流Java单元测试命名规范有两种:一种是以传统的test开头,然后加待测场景和期待结果的命名方式。另一种则是should…When结构。
3、断言与假设
在Junit中,常用的断言被封装在org.junit.jupiter.Assertions类中,均为静态方法。以下为常用的断言相关方法。
《码出高效(Java开发手册》学习笔记8)
文章图片

假设提供的方法被封装在org.junit.jupiter.api.Assumptions类中。
《码出高效(Java开发手册》学习笔记8)
文章图片

    推荐阅读