1. 单元测试
1.1. 单元测试概念
单元测试是对软件基本组成单元的测试。
在传统的结构化编程语言如C语言中,单元一般是模块,也就是函数或子过程;
在象C++中, 单元是类或类的方法;
在Ada语言中,单元可为独立的过程、函数或Ada包;
在第四代语言(4GL)中,单元对应为一个菜单或显示界面。
多个被测模块之间的单元测试可同时进行,以提高单元测试效率。
单元测试一般应该由编程人员完成,有时测试人员也加入进来,但编程人员仍会起到主要作用。
单元测试的依据是软件的详细设计描述、源程序清单、编码标准等。
1.2. 单元测试目的
验证代码能否达到详细设计的预期要求。
发现代码中不符合编码规范的地方。
准确定位发现的错误,以便排除错误。
1.3. 单元测试的优点
由于单元测试是在编码过程中进行的,若发现了一个错误,不管是从做回归测试的角度,还是对错误原因理解的深刻性的角度,修复错误的成本远小于集成测试阶段,更是小于系统测试阶段。
在编码的过程中考虑单元测试问题,有助于编程人员养成良好的编程习惯,提高源代码质量。
1.4. 单元测试的测试方法
Java junit测试
Python unittest测试 ---白盒测试
在单元测试阶段,应使用白盒测试方法和黑盒测试方法对被测单元进行测试,其中以使用白盒方法为主。
在单元测试阶段以使用白盒测试方法为主,是指在单元测试阶段,白盒测试消耗的时间、人力、物力等成本一般会大于黑盒测试的成本。
1.5. 单元测试的步骤
单元测试的实施应遵循一定的步骤,力争做到有计划、可重用。
单元测试的步骤如下:
① 计划单元测试
② 设计单元测试
③ 实现单元测试
④ 执行单元测试
⑤ 单元测试结果分析并提交测试报告
1.6. 单元测试的环境构成
在单元测试时,如果模块不是独立的程序,需要辅助测试模块,有两种辅助模块:
驱动模块(Driver)
桩模块(Stub)
1.7. 单元测试环境
驱动模块(Driver)
用来代替被测单元的上层模块的。驱动模块能接收测试数据,调用被测单元,也就是将数据传递给被测单元,最后打印测试的执行结果。可将驱动模块理解为被测单元的主程序。
桩模块(Stub)又称为存根模块,它用来代替被测单元的子模块。设计桩模块的目的是模拟实现被测单元的接口。桩模块不需要包括子模块的全部功能,但应做少量的数据操作,并打印接口处的信息。
人们在进行单元测试时尽量避免开发驱动模块和桩模块。尤其应避免开发桩模块,因为驱动模块开发的工作量一般少于桩模块。
若采用自底向上的方式进行开发,底层的单元先开发并先测试,可以避免开发桩模块,采用这种方法测试上层单元时,也是对下层单元的间接测试,但当下层单元被改动后,则需要执行回归测试判断其上层单元是否需要修改。
当不得不开发驱动模块及桩模块时,人们力求它们的简单以提高工作效率。但过于简单的驱动模块和桩模块会影响单元测试的有效性,因而,对被测单元的彻底测试有时会被推迟到集成测试阶段完成。
1.8. 单元测试用例设计
单元测试的内容
单元测试的对象是软件设计的最小单位——模块或函数,单元测试的依据是详细设计描述。
2. Junit 4.x——Java单元测试框架
开源的Java测试框架,主要用于白盒测试、回归测试;Junit 4.x 版本中引入了注解(Annotation)来执行单元测试。Eclipse中已经带有Junit4;
2.1. 创建Junit项目
2.2. 创建计算器类
2.3. 执行入门JUnit测试
2.3.1. 创建测试类,编写测试代码
2.3.2. 测试通过
2.4. Before After Test标签的应用
2.4.1. 代码效果
2.4.2. 测试结果
2.5. 断言用法
对于断言,如果断定的正确运行通过,绿条
如果断定的不正确,红条
2.6. 其他特殊场景
2.6.1. 异常预测测试
2.6.2. tmeout 超时关闭
另外一个test 用法,@Test(timeout=毫秒),如果一个方法里有循环,在这里可以设置超时时间,限制它多长时间关闭。
2.6.2. Ignore注解
2.7. 创建测试组(测试一堆)