赞
踩
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
以下列举了一些我为什么使用单元测试的好处:
编写单元测试的时机通常有三种情况。首先,在具体实现代码之前进行,这是测试驱动开发(TDD)所倡导的方法。其次,与具体实现代码同步进行,即先编写少量功能代码,然后紧接着编写单元测试(重复这两个过程,直到完成功能代码开发)。实际上,这种方案与第一种非常接近,基本上功能代码开发完成后,单元测试也差不多完成了。最后,第三种情况是在编写完功能代码后再编写单元测试。根据我的经验,事后编写的单元测试的粒度通常较粗。对于同样的功能代码,采用前两种方案的结果可能是用10个较小的单元测试来覆盖,每个单元测试相对简单易懂,可读性和可维护性都较好(重构时单测的改动较小);而采用第三种方案编写的单元测试,往往是用1个较大的单元测试来覆盖,这个单元测试的逻辑就比较复杂,因为它需要测试的东西很多,可读性和可维护性相对较差。
建议:我个人比较推荐将单元测试与具体实现代码同步进行的方案。只有对需求有一定的理解后,才能知道什么是代码的正确性,才能编写出有效的单元测试来验证正确性。能够编写一些功能代码说明对需求已经有一定理解了。
单元测试不是越多越好,而是越有效越好!进一步解读就是哪些代码需要有单元测试覆盖:
HelloWorld 例子
我们已一个简单的例子来快速展示 JUnit4 的基本用法.
首先新建一个名为 JUniTest 的 Maven 工程, 然后添加依赖:
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
编写测试代码:
import org.junit.Test; import static org.junit.Assert.assertEquals; public class TestJunit { @Test public void testingCrunchifyAddition() { assertEquals("Here is test for Addition Result: ", 30, addition(27, 3)); } @Test public void testingHelloWorld() { assertEquals("Here is test for Hello World String: ", "Hello + World", helloWorld()); } public int addition(int x, int y) { return x + y; } public String helloWorld() { String helloWorld = "Hello +" + " World"; return helloWorld; } }
使用测试用例:
public class App { public static void main(String[] args) { Result result = JUnitCore.runClasses(TestJunit.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } if (result.wasSuccessful()) { System.out.println("Both Tests finished successfully..."); } } } public class TestJunit { @Test public void testingCrunchifyAddition() { assertEquals("Here is test for Addition Result: ", 30, addition(27, 3)); } ... }
@Test (expected = Exception.class) 表示预期会抛出Exception.class 的异常
@Ignore 含义是“某些方法尚未完成,暂不参与此次测试”。这样的话测试结果就会提示你有几个测试被忽略,而不是失败。一旦你完成了相应函数,只需要把@Ignore注解删去,就可以进行正常的测试。
@Test(timeout=100) 表示预期方法执行不会超过 100 毫秒,控制死循环
@Before 表示该方法在每一个测试方法之前运行,可以使用该方法进行初始化之类的操作
@After 表示该方法在每一个测试方法之后运行,可以使用该方法进行释放资源,回收内存之类的操
@BeforeClass 表示该方法只执行一次,并且在所有方法之前执行。一般可以使用该方法进行数据库连接操作,注意该注解运用在静态方法。
@AfterClass 表示该方法只执行一次,并且在所有方法之后执行。一般可以使用该方法进行数据库连接关闭操作,注意该注解运用在静态方法。
要经历如下几个阶段:
其中, 类级初始化和销毁资源处理在每一个测试用例类这仅仅执行一次, 方法级初始化, 销毁资源处理方法在执行测试用例这的每个测试方法中都会被执行一次.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。