12
返回列表 发新帖
楼主: AlexQin

[转载] 自动化单元测试实践之路

[复制链接]
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
11#
 楼主| 发表于 2014-5-14 11:20 | 只看该作者
本帖最后由 AlexQin 于 2014-5-14 11:21 编辑

构建管理工具(Maven)
  • 项目统一使用Maven进行构建管理,在pom.xml中进行依赖jar包配置
  • 持续集成服务器上同时需要安装Maven,setting.xml除了配置仓库之外,还需要配置sonar,包括sonar服务器地址、数据库连接方式:
  1. <profile>
  2.     <id>sonar</id>
  3.     <activation>
  4.     <activeByDefault>true</activeByDefault>
  5.     </activation>
  6.     <properties>
  7.     <!-- EXAMPLE FOR MYSQL -->
  8.     <sonar.jdbc.url>
  9.       jdbc:mysql://127.0.0.1:3306/sonar?useUnicode=true&characterEncoding=utf8
  10.     </sonar.jdbc.url>
  11.     <sonar.jdbc.driverClassName>com.mysql.jdbc.Driver</sonar.jdbc.driverClassName>
  12.     <sonar.jdbc.username>sonar</sonar.jdbc.username>
  13.     <sonar.jdbc.password>sonar</sonar.jdbc.password>
  14.     <!-- SERVER ON A REMOTE HOST -->
  15.     <sonar.host.url>http:/127.0.0.1:9000</sonar.host.url>
  16.     </properties>
  17. </profile>
复制代码



使用道具 举报

回复
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
12#
 楼主| 发表于 2014-5-14 14:38 | 只看该作者
Mockito配置重点

所有单元测试继承MockitoTestContext父类


MockitoTestContext 父类:

  1. package com.chinacache.portal;
  2. import java.util.Locale;
  3. import org.junit.BeforeClass;
  4. import org.mockito.MockitoAnnotations;
  5. import org.springframework.mock.web.MockHttpServletRequest;
  6. import org.springframework.web.context.request.RequestContextHolder;
  7. import org.springframework.web.context.request.ServletRequestAttributes;
  8. import com.chinacache.portal.web.util.SessionUtil;
  9. import com.opensymphony.xwork2.util.LocalizedTextUtil;
  10. /**
  11. * Mockito 测试环境。继承该类后,Mockito 的相关注解 (@Mock, @InjectMocks, ...) 就能生效
  12. */
  13. public class MockitoTestContext {   
  14.     public MockitoTestContext() {
  15.         MockitoAnnotations.initMocks(this);
  16.     }
  17. }
复制代码

BillingBusinessManager 源码:

  1. package com.chinacache.portal.service.billing;
  2. //引入包忽略...
  3. /**
  4. * 计费业务相关的业务方法
  5. */
  6. @Transactional
  7. public class BillingBusinessManager {
  8.     private static final Log log = LogFactory.getLog(BillingBusinessManager.class);
  9.     @Autowired
  10.     private UserDAO userDAO;
  11.     @Autowired
  12.     private BillingBusinessDAO billingBusinessDAO;
  13.     @Autowired
  14.     private BillingBusinessSubscriptionDAO billingBusinessSubscriptionDAO;
  15.     @Autowired
  16.     private BillingBusinessSubscriptionDetailDAO billingBusinessSubscriptionDetailDAO;
  17.     @Autowired
  18.     private BillingRegionSubscriptionDAO billingRegionSubscriptionDAO;
  19.     @Autowired
  20.     private BillingRegionDAO billingRegionDAO;
  21.     @Autowired
  22.     private ContractTimeManager contractTimeManager;
  23.     /**
  24.      * 根据id查询业务信息
  25.      * @return 如果参数为空或者查询不到数据,返回空列表

  26.      * O 中的中、英文业务名来自 BILLING_BUSINESS 表
  27.      */
  28.     public List getBusinessesByIds(List businessIds) {         return billingBusinessDAO.getBusinessbyIds(businessIds); } }
复制代码

BillingBusinessManagerUnitTest类:

  1. //引入包忽略...
  2. public class BillingBusinessManagerUnitTest extends MockitoTestContext {
  3.     @InjectMocks
  4.     private BillingBusinessManager sv;
  5.     @Mock
  6.     private BillingBusinessDAO billingBusinessDAO;
  7.     @Test
  8.     public void testGetBusinessesByIds() {
  9.         List<BusinessVO> expected = ListUtil.toList(new BusinessVO(1l, "a", "b"));
  10.         //简洁的语法如下所示
  11.         when(billingBusinessDAO.getBusinessbyIds(anyListOf(Long.class))).thenReturn(expected);
  12.         List<Long> businessIds = ListUtil.toList(TestConstants.BUSINESS_ID_HTTP_WEB_CACHE);
  13.         List<BusinessVO> actual = sv.getBusinessesByIds(businessIds);
  14.         Assert.assertEquals(expected, actual);
  15.     }
  16.    }
复制代码

更多Mockito的使用,可以参考官网:http://code.google.com/p/mockito/


使用道具 举报

回复
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
13#
 楼主| 发表于 2014-5-14 14:39 | 只看该作者
6 总结

如何加强开发过程中的自测环节,一直都是个头痛的问题,开发的代码质量究竟如何?模块之间的质量究竟如何?回归测试的效率如何?重构之后,如何快速验证模块的有效性?


这些在没有做自动化单元测试之前,都是难以考究的问题。唯有通过数据去衡量,横向对比多个版本的构建分析结果,才能够发现整个项目质量的趋势,是提升了,还是下降了,这样开发、测试人员才能够有信心做出恰当的判断。


当然,单元测试也不是银弹,即便项目的覆盖率达到100%,也不能表明产品质量没有任何问题,不会产生任何缺陷。重点在于确保单元测试环节的实施,可以提前释放压力、风险、暴露问题等多个方面,改变以往没有单元测试,所有问题都集中到最后爆发的弊端。


最后,用一张图来做个对比:

图-6-1-使用前后对比


增加单元测试之后:

  • 开发效率有望提升5-20%;重构、回归测试效率提升10%,降低出错的几率,总体代
  • 码质量提升;
  • 在开发过程中暴露更多问题,将风险和压力提前释放,持续构建促使开发重视代码质量;
  • UnitTest质量对于团队来说,是可视化了,交付的是有质量的产品,而不是数量;


使用道具 举报

回复
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
14#
 楼主| 发表于 2014-5-14 14:40 | 只看该作者
作者简介

李乐,测试经理,7年以上工作经验,目前就职于ChinaCache质量部

博客:jooben.blog.51cto.com

微博:weibo.com/iamlile



使用道具 举报

回复
论坛徽章:
64
罗罗诺亚·索隆
日期:2017-09-07 16:40:52itpub13周年纪念徽章
日期:2014-10-08 15:19:03itpub13周年纪念徽章
日期:2014-10-08 15:19:03itpub13周年纪念徽章
日期:2014-10-08 15:19:03itpub13周年纪念徽章
日期:2014-10-08 15:19:03itpub13周年纪念徽章
日期:2014-10-08 15:19:03祖国65周年纪念徽章
日期:2014-09-28 15:11:01青年奥林匹克运动会-五人制曲棍球
日期:2014-09-12 15:36:032014系统架构师大会纪念章
日期:2014-08-04 09:33:532013系统架构师大会纪念章
日期:2014-08-04 09:33:53
15#
发表于 2014-5-15 19:27 | 只看该作者
Good Job!

使用道具 举报

回复
论坛徽章:
0
16#
发表于 2022-12-13 16:31 | 只看该作者


使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表