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. 单元测试用例设计

单元测试的内容

单元测试的对象是软件设计的最小单位——模块或函数,单元测试的依据是详细设计描述。

 

单元化架构 单元数量_驱动模块_02

2. Junit 4.x——Java单元测试框架

单元化架构 单元数量_单元化架构 单元数量_03

 

 

 

单元化架构 单元数量_白盒测试_04

开源的Java测试框架,主要用于白盒测试、回归测试;Junit 4.x 版本中引入了注解(Annotation)来执行单元测试。Eclipse中已经带有Junit4;

2.1. 创建Junit项目

 

单元化架构 单元数量_驱动模块_05

 

 

 

单元化架构 单元数量_单元化架构 单元数量_06

2.2. 创建计算器类

 

单元化架构 单元数量_单元测试_07

2.3. 执行入门JUnit测试

2.3.1. 创建测试类,编写测试代码

 

单元化架构 单元数量_单元化架构 单元数量_08

 

 

 

单元化架构 单元数量_驱动模块_09

2.3.2. 测试通过

 

单元化架构 单元数量_单元化架构 单元数量_10

2.4. Before After Test标签的应用

2.4.1. 代码效果

 

单元化架构 单元数量_单元测试_11

2.4.2. 测试结果

 

单元化架构 单元数量_单元化架构 单元数量_12

2.5. 断言用法

 

单元化架构 单元数量_白盒测试_13

对于断言,如果断定的正确运行通过,绿条

如果断定的不正确,红条

2.6. 其他特殊场景

2.6.1. 异常预测测试

 

单元化架构 单元数量_单元化架构 单元数量_14

 

 

 

单元化架构 单元数量_驱动模块_15

2.6.2. tmeout 超时关闭

另外一个test 用法,@Test(timeout=毫秒),如果一个方法里有循环,在这里可以设置超时时间,限制它多长时间关闭。  

 

单元化架构 单元数量_单元化架构 单元数量_16

2.6.2. Ignore注解

 

单元化架构 单元数量_驱动模块_17

2.7. 创建测试组(测试一堆)

 

单元化架构 单元数量_单元化架构 单元数量_18

单元化架构 单元数量_白盒测试_19

 

 

 

单元化架构 单元数量_单元化架构 单元数量_20

 

 

 

单元化架构 单元数量_白盒测试_21

 

 

 

单元化架构 单元数量_驱动模块_22