单元测试是编写测试代码,用来检测特定的、明确的、细颗粒的功能。单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的。
单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复、改进或重构之后的正确性,当你修改了原来的函数后,怎么知道你的修改没有破坏函数原来的功能呢?这就可以通过跑一下原来写好的单元测试,如果都通过,那就没有破坏原来的功能。如果有失败的,那就要去改啦。
一般来说,单元测试任务包括
接口功能测试:用来保证接口功能的正确性。
局部数据结构测试(不常用):用来保证接口中的数据结构是正确的
比如变量有无初始值
变量是否溢出
边界条件测试
变量没有赋值(即为NULL)
变量是数值(或字符)
主要边界:最小值,最大值,无穷大(对于DOUBLE等)
溢出边界(期望异常或拒绝服务):最小值-1,最大值+1
临近边界:最小值+1,最大值-1
变量是字符串
引用“字符变量”的边界
空字符串
对字符串长度应用“数值变量”的边界
变量是集合
空集合
对集合的大小应用“数值变量”的边界
调整次序:升序、降序
变量有规律
比如对于Math.sqrt,给出n2-1,和n2+1的边界
所有独立执行通路测试:保证每一条代码,每个分支都经过测试
代码覆盖率
语句覆盖:保证每一个语句都执行到了
判定覆盖(分支覆盖):保证每一个分支都执行到
条件覆盖:保证每一个条件都覆盖到true和false(即if、while中的条件语句)
路径覆盖:保证每一个路径都覆盖到
相关软件
Cobertura:语句覆盖
Emma: Eclipse插件Eclemma
各条错误处理通路测试:保证每一个异常都经过测试
JUnit是Java单元测试框架,已经在Eclipse,Idea中默认安装。
JUnit4
JUnit4通过注解的方式来识别测试方法。目前支持的主要注解有:
@BeforeClass 全局只会执行一次,而且是第一个运行
@Before 在测试方法运行之前运行
@Test 测试方法
@After 在测试方法运行之后允许
@AfterClass 全局只会执行一次,而且是最后一个运行
@Ignore 忽略此方法
用suite来组合测试
就是一次运行多个测试类,比如你在工作中想做一系列的操作,但是每个操作都是独立的dao,那么一个一个的运行test会很繁琐。还好junit提供了suite,可以将多个test组合到一起,一次运行。