其次,重构那些运行时间比较长且不经常失败的测试类;
更多参考推荐阅读:《Unit Testing Guidelines》
http://geosoft.no/development/unittesting.html
4 流程
图-4-1-典型工作流程
开发人员遵循每日构建原则,提交功能代码、测试代码(以UnitTest结尾的测试类)到Svn;
Jenkins平台,根据配置原则(假设配置定时器每6分钟检查Svn有代码更新则构建)进行:代码更新、代码编译、UnitTest、持续反馈的流水线工作;
构建结果发送到Sonar,并且把失败的构建以邮件方式通知影响代码的开发人员;
开发人员、测试人员需要在Sonar平台进行review;
5 实践
Jenkins配置重点
构建触发器:推荐使用PollSCM
Poll SCM:定时检查源码变更(根据SCM软件的版本号),如果有更新就执行checkout。
Build periodically:周期进行项目构建(它不care源码是否发生变化)。
配置时间:H/6 * * * *
1、Build配置
Goals and options:emma:emma -Dtest=*UnitTest soanr:sonar
注明:
emma:emma,Add the "emma:emma" goal to your build to generate Emma reports;
-Dtest=*UnitTest,参数配置,运行以UnitTest结尾的测试类;
sonar:sonar,来触发静态代码分析。
需要安装Emma Plugin(https://wiki.jenkins-ci.org/display/JENKINS/Emma+Plugin)
2、构建后操作
增加Aggregate downstream test results,勾选自动整合所有的downstream测试;
增加Editable Email Notification,在“高级”选项增加触发器“Unstable”,
勾选“Send To Committers”,Check this checkbox to send the email to anyone who checked in code for the last build。
注明:Editable Email Notification插件是 https://wiki.jenkins-ci.org/display/JENKINS/Email-ext+plugin
另外一些Jenkins的单元测试覆盖率展现方式,可以查看官网。
构建管理工具(Maven)
1、项目统一使用Maven进行构建管理,在pom.xml中进行依赖jar包配置
2、持续集成服务器上同时需要安装Maven,setting.xml除了配置仓库之外,还需要配置sonar,包括sonar服务器地址、数据库连接方式:
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- EXAMPLE FOR MYSQL -->
<sonar.jdbc.url>
jdbc:mysql://127.0.0.1:3306/sonar?useUnicode=true&characterEncoding=utf8
</sonar.jdbc.url>
<sonar.jdbc.driverClassName>com.mysql.jdbc.Driver</sonar.jdbc.driverClassName>
<sonar.jdbc.username>sonar</sonar.jdbc.username>
<sonar.jdbc.password>sonar</sonar.jdbc.password>
<!-- SERVER ON A REMOTE HOST -->
<sonar.host.url>http:/127.0.0.1:9000</sonar.host.url>
</properties>
</profile>
|
Mockito配置重点
所有单元测试继承MockitoTestContext父类
MockitoTestContext 父类:
package com.chinacache.portal;
import java.util.Locale;
import org.junit.BeforeClass;
import org.mockito.MockitoAnnotations;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.chinacache.portal.web.util.SessionUtil;
import com.opensymphony.xwork2.util.LocalizedTextUtil;
/**
* Mockito 测试环境。继承该类后,Mockito 的相关注解 (@Mock, @InjectMocks, ...) 就能生效
*/
public class MockitoTestContext {
public MockitoTestContext() {
MockitoAnnotations.initMocks(this);
}
}
|
BillingBusinessManager 源码:
package com.chinacache.portal.service.billing;
//引入包忽略...
/**
* 计费业务相关的业务方法
*/
@Transactional
public class BillingBusinessManager {
private static final Log log = LogFactory.getLog(BillingBusinessManager.class);
@Autowired
private UserDAO userDAO;
@Autowired
private BillingBusinessDAO billingBusinessDAO;
@Autowired
private BillingBusinessSubscriptionDAO billingBusinessSubscriptionDAO;
@Autowired
private BillingBusinessSubscriptionDetailDAO billingBusinessSubscriptionDetailDAO;
@Autowired
private BillingRegionSubscriptionDAO billingRegionSubscriptionDAO;
@Autowired
private BillingRegionDAO billingRegionDAO;
@Autowired
private ContractTimeManager contractTimeManager;
/**
* 根据id查询业务信息
* @return 如果参数为空或者查询不到数据,返回空列表
* O 中的中、英文业务名来自 BILLING_BUSINESS 表
//引入包忽略... |
原文转自:http://www.uml.org.cn/Test/201407281.asp