首先在此给你们拜个晚年,你们新年好。这也有近半个月没有进行跟新了,是时候将本身最新的学习成果进行总结分享一下了。废话很少说,进入今天的主题--单元测试。java
百度百科的解释是这样的:单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。一般而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。例如,你可能把一个很大的值放入一个有序list 中去,而后确认该值出如今list 的尾部。或者,你可能会从字符串中删除匹配某种模式的字符,而后确认字符串确实再也不包含这些字符了。数据库
简单的说,单元测试就是对你程序中最小的功能模块进行测试,在c语言里多是一个函数,java中多是一个方法或者类。数组
目的就是为了提升代码的质量。框架
为何要进行单元测试?说白了就是单元测试有什么好处,其实测试的好处无非就是减小bug、提升代码质量、使代码易于维护等。单元测试有什么好处请看一下百度百科中概括的四条:ide
一、它是一种验证行为。
程序中的每一项功能都是测试来验证它的正确性。它为之后的开发提供支援。就算是开发后期,咱们也能够轻松的增长功能或更改程序结构,而不用担忧这个过程当中会破坏重要的东西。并且它为代码的重构提供了保障。这样,咱们就能够更自由的对程序进行改进。
二、它是一种设计行为。
编写单元测试将使咱们从调用者观察、思考。特别是先写测试(test-first),迫使咱们把程序设计成易于调用和可测试的,即迫使咱们解除软件中的耦合。
三、它是一种编写文档的行为。
单元测试是一种无价的文档,它是展现函数或类如何使用的最佳文档。这份文档是可编译、可运行的,而且它保持最新,永远与代码同步。函数
四、它具备回归性。
自动化的单元测试避免了代码出现回归,编写完成以后,能够随时随地的快速运行测试。工具
在讨论如何更好的进行单元测试以前,先来看看我之前是怎么测试代码的。性能
之前是这样测试程序的:单元测试
public int add(int x,int y) { return x + y; } public static void main(String args[]) { int z = new Junit().add(2, 3); System.out.println(z); }
如上面所示,在测试咱们写好的一个方法时,一般是用一个main方法调用一下咱们要测试的方法,而后将结果打印一下。如今看来这种方式已经很是out了,因此出现了不少单元测试的工具,如:JUnit、TestNG等。借助它们可让咱们的单元测试变得很是方便、高效。今天就说说如何利用JUnit进行单元测试。学习
JUnit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。它包括如下特性:
一、用于测试指望结果的断言(Assertion)
二、用于共享共同测试数据的测试工具
三、用于方便的组织和运行测试的测试套件
四、图形和文本的测试运行器
JUnit使用注解标注为测试方法并配置它们,下表中给出了JUnit4很是重要的注解。下面全部的注解都用在方法上。
JUnit 4 | 描述 |
---|---|
import org.junit.* |
用于导入下列注解。 |
@Test |
将方法标记为测试方法。 |
@Before |
在每次测试以前执行,通常用于准备测试环境(初始化类等)。 |
@After |
在每次测试以后执行,用于清理测试环境 (例如删除临时数据,还原默认值等)。 它也能够拥有清理内存( It can also save memory by cleaning up expensive memory structures.)。 |
@BeforeClass |
在全部测试以前,执行一次。它通常用于执行time intensive activities,例如链接数据库等。使用该注解标记的方法须要定义为static void。 |
@AfterClass |
在全部的测试执行完成以后执行一次。 它通常用于清理一些 activities, 例如断开数据链接。使用该注解标记的方法须要定义为static void |
@Ignore or @Ignore("Why disabled") |
标记该注解的测试方法是被禁用的。这对于实际代码作了修改而测试代码没有修改的状况是很是有用的,或者因为这条测试执行时间过长先不将其包含在测试中,最好是提供一下不去测试的缘由。 |
@Test (expected = Exception.class) |
若是这个测试方法不抛出赋值的异常(Exception.class)将会失败。 |
@Test(timeout=100) |
若是这个测试方法执行超过100毫秒将会失败。 |
JUnit提供静态方法,经过Assert类来测试某些条件。这些断言语句一般以assert开头。他们容许你指定错误信息、预期结果和实际结果。断言方法将测试返回的实际值和预期值相比较。若是比较失败就会抛出AssertionException异常。
下表简单的介绍了这些方法。[]中的参数是可选的字符串类型。
语句 | 描述 |
---|---|
fail([message]) |
让这个测试方法失败,可能用于检查代码中某个部分是否未执行,或者在执行测试代码以前是否存在失败的测试。这个message参数是可选的。 |
assertTrue([message,] boolean condition) |
验证boolean条件为true。 |
assertFalse([message,] boolean condition) |
验证boolean条件为false。 |
assertEquals([message,] expected, actual) |
验证expected和actual相同。注:对于数组则检查的是引用而不是数组的内容。 |
assertEquals([message,] expected, actual, tolerance) |
验证float或者double匹配。 你们知道计算机表示浮点型数据都有必定的误差,因此哪怕理论上他们是相等的,可是用计算机表示出来则可能不是,因此这里运行传入一个误差值。若是两个数的差别在这个误差值以内,则测试经过,否者测试失败。 |
assertNull([message,] object) |
验证object为null。 |
assertNotNull([message,] object) |
验证object不为null。 |
assertSame([message,] expected, actual) |
验证expected和actual是同一个对象。 |
assertNotSame([message,] expected, actual) |
验证expected和actual不是同一个对象。 |
总的来讲使用单元测试要比本身手动的测试性能快一些,而且相对来讲要简洁,所以确实是一个很重要的的知识,而且我也和实际开发的朋友沟经过,在实际开发中也是常用检测本身代码的一个标准。本文主要是将单元测试的一些简单介绍,若是有时间,我会将单元测试的框架JUnit进行具体的总结分享。