自动化单元测试实践之路(2)

发表于:2014-07-29来源:uml.org.cn作者:李乐点击数: 标签:
或许,使用Ant来构建的团队要问,为什么用Maven呢?简单来说两点 1、对第三方依赖库进行统一的版本管理 说实话,ant处理依赖包之间的冲突问题,还是得靠

  或许,使用Ant来构建的团队要问,为什么用Maven呢?简单来说两点

  1、对第三方依赖库进行统一的版本管理

  说实话,ant处理依赖包之间的冲突问题,还是得靠人工解决,这个对于研发来说是消耗时间的,倒不如把节省的时间投入到业务中去。另外再也不用每个项目繁琐复制spring.jar了,通过maven自动管理Java 库和项目间的依赖,打包的时候会将所有jar复制到WEB- INF/lib/目录下。

  2、统一项目的目录结构。

  官方的约定:http://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html

  保证所有项目的目录结构在任何服务器上都是一样的,每个目录起什么作用都很清楚明了。

  3、统一软件构建阶段

  http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

  Maven2把软件开发的过程划分成了几个经典阶段,比如你先要生成一些java代码,再把这些代码复制到特定位置,然后编译代码,复制需要放到classpath下的资源,再进行单元测试,单元测试都通过了才能进行打包,发布。

  测试框架:JUnit&Mockito

  1、JUnit

  JUnit是一个Java语言的单元测试框架。

  2013年见过一个旧项目,测试代码还是以main作为入口,为什么要使用JUnit?

  JUnit 的优点是整个测试过程无人值守,开发无须在线参与和判断最终结果是否正确,可以很容易地一次性运行多个测试,使得开发更加关注测试逻辑的编写,而不是增加构建维护时间。

  团队示例代码:

// 功能代码
package com.chinacache.portal.service;
public class ReportService {
    public boolean validateParams() {
    }
    public String sendReport(Long id) {
    }
    public String sendReport(Long id, Date time) {
    }
}
// 单元测试代码
package com.chinacache.portal.service; // 必须与功能代码使用相同 package
public class ReportServiceUnitTest { // 测试类名以 UnitTest (单元测试) 或 InteTest (集成测试) 结尾
    // 测试方法名以 test 开头,然后接对应的功能方法名称
    @Test
    public void testValidateParams() {
    }
    // 如果功能方法存在重载,则再接上参数类型
    @Test
    public void testSendReportLong() {
    }
    // 如果一个功能方法对应多个测试方法,不同测试方法可使用简洁而又有含义的单词结尾,例如 success、fail 等    
    @Test
    public void testSendReportLongDateSuccess() {
    }
    // 这样通过测试方法名即可知道:测的是哪个功能方法,哪种情况
    @Test
    public void testSendReportLongDateFail() {
    }
}

  2、Mockito

  Mockito是一个针对Java的mocking框架。使用它可以写出干净漂亮的测试用例和简单的API。它与EasyMock和jMock很相似,通过在执行后校验什么已经被调用,消除了对期望行为(expectations)的需要,改变其他mocking库以“记录-回放”(这会导致代码丑陋)的测试流程,使得自身的语法更像自然语言。

  Mockito示例:

List mock = mock(List.class);
when(mock.get(0)).thenReturn("one");
when(mock.get(1)).thenReturn("two");
someCodeThatInteractsWithMock();
verify(mock).clear(); 

  EasyMock示例:

List mock = createNiceMock(List.class);
expect(mock.get(0)).andStubReturn("one");
expect(mock.get(1)).andStubReturn("two");
mock.clear();
replay(mock);
someCodeThatInteractsWithMock();
verify(mock);

  官方对比文章:http://code.google.com/p/mockito/wiki/MockitoVSEasyMock

  反馈平台:Jenkins&Sonar

  持续集成平台:Jenkins

  Jenkins 的前身是 Hudson 是一个可扩展的持续集成引擎,主要用于:

  1.持续、自动地构建测试软件项目

原文转自:http://www.uml.org.cn/Test/201407281.asp