单元测试入门

来源:互联网 发布:泽野螳螂 知乎 编辑:程序博客网 时间:2024/05/19 18:42


一、    单元测试的误解

对于单元测试,人们往往存在很多的误解:

1)        浪费的时间太多

2)        软件开发人员不应参与单元测试

3)        我是很棒的程序员,不需要进行单元测试

4)        不管怎样,集成测试将会抓住所有的Bug

5)        单元测试效率不高

二、    单元测试的意义

因此单元测试具有以下意义:

1)        单元测试集中注意力于程序的基本组成部分,首先保证每个单元测试通过,才能使下一步把单元组装成部件并测试其正确性具有基础。单元是整个软件的构成基础,像硬件系统中的零部件一样,只有保证零部件的质量,这个设备的质量才有基础,单元的质量也是整个软件质量的基础。因此,单元测试的效果会直接影响软件的后期测试,最终在很大程度上影响到产品的质量。

2)        单元测试可以平行开展,这样可以使多人同时测试多个单元,提高了测试的效率。

3)        单元规模较小,复杂性较低,因而发现错误后容易隔离和定位,有利于调试工作。

4)        单元的规模和复杂性特点,使单元测试中可以使用包括白盒测试的覆盖分析在内的许多测试技术,能够进行比较充分细致的测试,是整个程序测试满足语句覆盖和分支覆盖要求的基础。

5)        单元测试的测试效果是最显而易见的。做好单元测试,不仅后期的系统集成联调或集成测试和系统测试会很顺利,节约很多时间;而且在单元测试过程中能发现一些很深层次的问题,同时还会发现一些很容易发现而在集成测试和系统测试很难发现的问题;更重要的是单元测试不仅仅是证明这些代码做了什么,是如何做的,而且证明是否做了它该做的事情而没有做不该做的事情。

6)        单元测试的好与坏不仅直接关系到测试成本(因为如果单元测试中易发现的问题拖到后期测试发现,那么其成本将成倍数上升),而且也会直接影响到产品质量,因为可能就是由于代码中的某一个小错误就导致了整个产品的质量降低一个指标,或者导致更严重的后果。

三、    单元测试实例之隔离框架

反过来看单元测试的规则定义,如果一个测试满足下列定义的任何一个,它就不是一个真正的单元测试:

1.        访问数据库

2.        访问网络(如 RESTful 服务接口,SOAP 服务接口的访问等等)

3.        访问文件系统

4.        不能独立运行

5.        运行单元测试需要额外的配置等

很多功能设计到数据的时候,会不知道如何写单元测试,下面的例子,就是使用隔离框架编写的WebApi接口的代码及其单元测试。

1)        创建仓储模式代码以及注册IOC,编写业务处理层接口,IUserService只是接口,无任何实现。因为使用隔离框架,不需要依赖数据库。

在控制器中的IUserService也是无任何实现。

现在要测试和实现的是UserController类的AddUser方法,创建实现IUserService的模拟对象以及一个最终能通过测试的数据对象Users

接下来采用的是测试驱动开发的开发方法,在这里简单的介绍下,什么是驱动测试开发。

测试驱动开发,简称TDD,是一种不同于传统软件开发流程的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码,并加速开发过程。

先根据五个测试用例编写不通过的单元测试(个人习惯编写正常的单元测试会通过),如下:




后台只有一句返回成功的代码,即让正常的通过测试。


接下来,慢慢编写让其他测试通过的代码。


最后,检查一下测试代码覆盖率是,了解哪些代码测试没有涉及到。我们在编写已有代码的单元测试时,检测测试代码覆盖率能帮助我们编写更完善的单元测试。


关于单元测试的写法,有不同的说法,有的是一个方法只用一个测试方法,里面加多个断言;有的则是一个方法多个测试方法,在方法命中描述每个方法的测试点。

希望大神指正不好的地方~

0 0
原创粉丝点击