目前团队人数很少,也没有真正意义上的测试人员,那么如何保证代码质量呢?最近看了《持续交付——发布可靠软件的系统方法》很受启发,突然也想通了很多集成开发工具的设计理念,并做了一些实践,特别记录下来与众人分享。

如何保证代码质量

我觉得根本就是持续集成,确保代码服务器上的版本始终是可运行的。粗粒度上就是把功能分阶段做,每个阶段的功能是完整可发布的,这样有很多好处,尽早看到效果来调整、尽早发现bug、有成果可以鼓舞士气等等;细粒度上就是把每次提交的东西进行测试,让问题尽早暴露尽早修复。

如何达到这个目标呢?原则就是让重复的工作自动化,让测试频繁进行。具体来说就是自动化测试、自动化打包、自动化部署。

自动化测试就是为了能够经常反复的测试才能更早的发现问题。为了让开发人员勤于测试,所以测试的运行时间必须要够短。持续集成推崇的方式是每次提交执行一次测试,这里只做单元测试以确保速度,这也是为什么grails里面把unit单独拿出来鼓励测试。

自动化打包我没用高级的工具,就是利用ant+Ivy写的打包脚本,并借用Grails的思想,通过不同的打包参数可以打出dev、test、prod的包,这样就大大减少人工打包出错的概率。

自动化部署目前我用sae倒是平台就已经支持了,直接上传war包以后,部署都是自动进行的。但是sae的问题就是你本地测试通过的东西,那个环境却不一定行,无比尴尬。

测试种类与分工

测试种类的名词有很多,且最后用的都有很多歧义,特别是集成测试更是有多种含义。我觉得最好理解的划分就是:功能测试(单元测试,组件测试,验收测试)和非功能测试(探索性测试、性能测试、容量测试)。只要能做成自动化的就是开发人员做的;没有办法自动化的就是测试人员做的。

其中,单元测试是不依赖外部只测试某一个类的,为了达到这个效果还有挺多工作的,外部依赖的类要用Mock来模拟,并且尽量不连接数据库这些外部依赖。组件测试就是要有这些外部依赖了,也可以说成是功能测试。验收测试就是模拟用户行为做一系列操作,这个是在最终发布的时候做一次,确保用户使用的正确性。

但注意,每个测试间要做到互相独立,否则会大大增加维护难度。

我期望的效果

单元测试是好东西,但是其实我觉得组件测试是涵盖单元的功能,只是运行时间更长一点而已,但为了减轻测试代码的工作量,我想省去单元测试而全部采用组件测试。组件测试有一个棘手问题就是用到数据库,而数据库是一个有状态的,测试运行的先后顺序都会影响测试结果,所以最好的办法是让每个测试执行完进行回滚。

验收测试是个刚学习到的理念,就是把用户对某个功能的一系列操作放在一起进行功能效果验收。虽然会有很大维护量,但是可以有效模拟用户行为,对功能效果进行完整的测试,达到回归测试的效果。

总结一下,就是利用组件测试达到频繁测试的效果,用验收测试达到回归测试效果。

测试框架

为了达到以上效果有什么好的框架,我查了一圈资料,也试了几个框架。Junit4还是被公认最简单有效的框架,并且有众多的扩展插件和IDE支持,但缺点就是自身功能过于简单。要实现每次测试完的回滚需要结合dbunit,要和spring集成也要自己实现,用到mock也有很多工具可选择。

最后发现一个整合的测试框架Unitlis,它不但整合了以上需求,还简化了配置操作,同时还实现了数据库升级文件的版本管理。试用以后感觉很不错,非常有爱。官方主页是http://unitils.sourceforge.net/summary.html。

我觉得Unitils有以下几个比较显著的优点:

1. 基于反射的断言非常强大,自动过滤掉null和空值,对数组也无视顺序,真的是基于内容本身的比较。
    2. 集成了spring管理,都是用注解来声明,非常清楚简洁。
    3. 集成dbunit,配置简化了很多配置,特别对事务回滚配置也很灵活、简单。
    4. 自带的Mock很好用,语法很漂亮,虽然暂时没打算用。

参考资料:
1. unitils cookbook: http://unitils.sourceforge.net/cookbook.html
2. 开发测试的那些事儿: http://stamen.iteye.com/blog/1466145
3. 测试整合之王Unitils: http://stamen.iteye.com/blog/1480316
4. 使用unitils测试Service层: http://stamen.iteye.com/blog/1485837
5. 《持续交付——发布可靠软件的系统方法》

转载于:https://blog.51cto.com/passover/850426

个人对持续集成的理解和实践相关推荐

  1. Jenkins持续集成项目搭建与实践——基于Python Selenium自动化测试(自由风格)

    Jenkins简介 Jenkins是Java编写的非常流行的持续集成(CI)服务,起源于Hudson项目.所以Jenkins和Hudson功能相似. Jenkins支持各种版本的控制工具,如CVS.S ...

  2. 浅谈持续集成的理解以及实现持续集成,需要做什么?

    一.持续集成是什么? 持续集成是一种软件开发的实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译,发布,自动化 ...

  3. fir.im 持续集成技术实践

    互联网时代,人人都在追求产品的快速响应.快速迭代和快速验证.不论是创业团队还是大中型企业,都在探索属于自己的敏捷开发.持续交付之道.fir.im 团队也在全面实施敏捷,并推出新持续集成服务 - flo ...

  4. Jekins持续集成在ERP研发中的应用实践

    源宝导读:"持续集成"是敏捷最佳实践中,保证高质量交付的关键环节之一.本文将介绍明源云ERP系统在研发过程中,应用Jekins平台完成持续集成自动构建的实践. 一.认识持续集成 持 ...

  5. 研发协同平台持续集成实践

    源宝导读:"持续集成"是敏捷最佳实践中,保证高质量交付的关键环节之一.本文将分享,在大规模研发在线协同的背景下,如何支撑在线持续集成的高性能和高可用. 一.什么是持续集成 在< ...

  6. golang项目持续集成Travis-CI实践

    文章目录 shorturl 1 `Travis-ci`支持 2 `.travis.yml` 3 Hello World 4 短链服务 5 添加持续集成 6 问题fix实践 7 还得是GOPATH 8 ...

  7. CruiseControl.NET持续集成实践

    前言 团队开发需要进行集中的项目文件管理与有效的协调,我们采用源代码管理工具协助我们管理,卓有成效.限定重要文件的访问权限.使用悲观锁杜绝成员同时编辑同一份文件.不允许长时间迁出文件等规则让我们在某一 ...

  8. 我们离DevOps有多远--持续集成思想的延伸

    Wikipedia对DevOps的定义是: DevOps是软件开发.运维和质量保证三个部门之间的沟通.协作和集成所采用的流程.方法和体系的一个集合. 它是人们为了及时生产软件产品或服务,以满足某个业务 ...

  9. 持续集成(Continous Integration)

    [b]对持续集成的理解:[/b] 1.持续集成是敏捷开发的一种重要实践: 2.持续集成强调频繁构建,保证团队协同开发的软件时刻处于一种可运行状态: 3.持续集成能够尽早的发现软件的缺陷,从而降低修复这 ...

最新文章

  1. 坐标1-based和0-based
  2. 关于element click intercepted报错解决办法
  3. Coursera自动驾驶课程第18讲:The Planning Problem
  4. h5 img js 点击图片放大_H5实现移动端图片预览:手势缩放, 手势拖动,双击放大......
  5. 仿短视频竖屏播放源码
  6. mysql 只开放某个表_MySQL只恢复某个库或某张表
  7. python consulate_使用python测测你的系统最多能创建多少个线程 | 学步园
  8. python设计查询余额程序_使用Python调取任意数字资产钱包余额功能
  9. python主成分分析_Python的主成分分析PCA算法
  10. X线、CT、B超、核磁共振区别
  11. 网秦上市前夕被央视曝光恶意吸费 网秦飞流否认
  12. Python 股票分析入门
  13. 设置浏览器保护色(chrome)
  14. proteus中继电器怎么找_proteus中这个开关在哪
  15. Python有参函数和无参函数实例
  16. Mysql聚簇索引和非聚簇索引原理(数据库)
  17. 计算机网络-实验四:配置网络路由
  18. 互联网晚报 | 9月6日 星期一 | 北京证券交易所完成工商注册;“武汉云”正式启用;中国连续5届残奥会金牌榜、奖牌榜双第一...
  19. JAVA高级工程师-面试经历(含面试问题及解答)
  20. 云服务器的购买和使用教程(腾讯云为例)

热门文章

  1. Android中的资源复用小技巧
  2. 以Settings.APPLICATION_DEVELOPMENT_SETTINGS打开开发者面板出错总结
  3. 【linux杂谈】查看centOS系统的版本号和内核号
  4. Dubbo 只注册,只订阅
  5. Can not find the tag library descriptor for http://java.sun.com/jsp/jstl/
  6. 笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-08 数据修改
  7. c# 中Stopwatch 类的运用
  8. 关于Panel隐藏横向滚动条
  9. [BZOJ] 1637: [Usaco2007 Mar]Balanced Lineup
  10. Azure VNet介绍