原写于2012-03-29
题记:新同学分享了“测试驱动”,第一次感觉测试驱动离自己那么近。因此开始尝试。记下自己的一小点想法。
1.一切从测试开始
不管在写复杂的代码,还是简单的代码,一切从测试开始。练习成自己编码的习惯。
自己的做法只能算是“伪测试驱动”,因为还是有详细的设计,但遵循此做法,对于需求的变更、代码存在的bug,导致编码修改的时候,心里是踏实的。
目前自己还不能感觉到对后期的维护会带来什么样的结果?
推荐《测试驱动开始》。
2.工具
junit、mockito、emma、findbug
junit,这是大家熟知的,学到新点:a。参数化测试 b。private方法测试(反射) c。runwith & Unite,组织测试单元(实际工作中未用到)
mockito,轻量的mock工具。测试中很麻烦的一个问题是:环境依赖,比如:web中依赖容器生成request对象。mockito很好的解决大部分问题(static类与private方法未能解决)。
emma,代码覆盖率检查工具,eclipse插件。效果:红色=未测试;黄色=测试不完整,只是部分逻辑;绿色=测试完整。(注意:不能绝对的追求覆盖率,一定要记住2/8原则,将主要的精力关注主要的逻辑)。
findbug,帮助排查低级bug工具
3.习惯
a.代码结构,3部分:prepare(包含mock)准备数据、action执行、assert验证
b.方法命名:被测试方法名$测试目的,如:run$ParameterIsNull
c.测试A类,有两个方法run()和prepare(),run方法调用prepare,且prepare执行非常耗时间。想要单独测试run()方法 ?B extends A,复写prepare方法(等于是mock prepare方法),单独的测试run方法逻辑
d。持续写测试代码的习惯
-------------------------------------- 一年之后,自己整理另外一点关于单元测试 ---------------------------------------
说起“单元测试mock问题”,之前用过powermock框架,绝对是个利器。请允许我先唠叨3个问题:
1. 为什么要写单元测试?
必须要承认,写单元测试会带来更多工作量。但其带来的好处也显而易见,自己体会有2点:a.假设你写的代码中有bug,若在单元测试环节发现只需1分钟可解决,若在功能测试发现可能需要5分钟,若在测试过程中发现可能需要1小时。帮助整体效率的提升;b.一个系统不可能永远都是一个人在维护,必然会有其他人参与。如何保证代码不会被别人改错(如:a被b、c、d依赖,本次日常需要改动a,如何保证a正确性;或重构),单元测试是其中一个很好的关卡。
2. 遵循什么原则?
a) 2/8原则,不要盲目追求覆盖率:
保证覆盖核心业务逻辑。(前团队经验:WEB应用40%左右,纯服务应用不低于50%)
b) 不要依赖环境
如hsf服务,保证任何时候都可以运行成功
c) 粒度要小,自动校验
保证单个方法单个分支粒度,单元测试也是代码也需要维护,写的糟糕的单元测试更可怕;不能自动校验,等于没写
d) 不断运行,才能更好发挥其作用
单元测试运行要尽可能快;至少保证trunk任何一次提交都会运行单元测试
3. 如果你发现单元测试很难写(非技术原因),这时可考虑代码自身是否存在问题(如:单个方法包含的逻辑是否太多,能否拆分公用)
上面也都是我的一些yy想法,有任何问题,欢迎大家拍砖。
1. 关于mockito/jmock/esaymock等,选择哪一个?推荐mockito,原因参见http://stackoverflow.com/questions/22697/whats-the-best-mock-framework-for-java
2. 对习惯使用mockito同学,每每遇到private method、static method … 看着http://code.google.com/p/mockito/wiki/FAQ#What_are_the_limitations_of_Mockito,该咋办呢?
powermock统统可以解决以上常见问题,且保持mockito api风格、使用习惯
3. 关于powermock
详见:http://code.google.com/p/powermock/,推荐‘入门’阅读如下部分
- document
- getting started
- motavition
- mockito extends
- mockito 1.8+ useage
- faq
附件:https://gist.github.com/4110984 ,实际开发中使用到的powermock的一些特性,简化后的例子(仅为说明powermock api使用)。主要包括:
- 修改私有域 (PrivateFieldOrMethodTest)
- 私有方法
- 测试私有方法 (PrivateFieldOrMethodTest)
- Verify (PrivateFieldOrMethodTest)
- Mock类部分方法,如:public a method调用private b method (MockPartialMethodTest)
- 静态方法(mockStaticMethodAndVerifyStaticMethod)
- Mock
- 抛出异常
- Verify
- Mock Java core library,如:Thread (MockJavaCoreLibraryTest)
- Mock 构造器 (MockConstructionTest)
注:仅当遇到‘如上的疑难杂症’时,推荐使用powermock;普通的场景,推荐使用mockito。且它们之间不会有任何冲突。
相关推荐
Test简介单元测试工具C++Test简介软件测试C++Test是Parasoft公司出品的一个针对C/C++源代码进行自动化单元测试的工具。它可以对源代码进行三种测试:白盒测试、黑盒测试以及回归功测试。白盒测试C++Test对C/C++源...
单元测试工具 C++单元测试工具!静态代码分析 代码动态测试
智能化单元测试工具 SmartUnit DDC 动态缺陷检查工具 概述 汽车电子领域等高安全领域,对单元测试有较高的行业标准: 汽车电子行业遵从ISO26262标准。安全等级从ASIL-A到ASIL-D,对单元测试的要求依次增高。...
单元测试工具,模块测试工具,单元测试工具,模块测试工具
Java语言是一个支持面向对象的语言,通常情况下我们可以将程序的一个单元看成是一个独立的类,因此进行单元测试的重点就是对这些类进行测试。 1、不需要测试get和set这样的行为 2、一个方法至少需要测试一次
通常,你会用一些库比如 Mocha 或 Jasmine,写一个单元测试,这些库可以让你定义测试用例,并提供 API 来编写判断。我们通过创建一个工具,可以让你更轻松地与现有的库一起工作。一下是 Venus 的主要好处:在你的...
JUnit 帮助文档 软件测试 测试工具 单元测试框架 测试人员使用工具
junit4单元测试工具
单元测试架构工具包与执行跟踪工具包zip,本讲主要为您介绍单元测试架构工具包与执行跟踪工具包的具体使用。欲了解更多LabVIEW相关信息,请点击ni.com/LabVIEW 分类:在线视频
常见软件单元测试工具列表大全常见软件单元测试工具列表大全
在V模型开发中,Tessy主要应用在单元测试和集成测试阶段。单元测试通过运行代码检测出函数中错误,比如算法错误、接口问题等;集成测试则在单元测试的基础上验证单元之间接口的正确性。基于越早发现bug开发成本越低...
文章是redisUtils工具类的封装,和基于springboot环境的单元测试; 文中封装了redis的众多方法,希望对您有所帮助。
单元测试工具Junit的简单使用
Delphi单元测试工具
Vs的单元测试工具 适合大多数VS版本,安装后,可以很好的使用
微软的VS开发工具为我们提供了强大的单元测试环境,在VS当中可以直接对类库项目进行测试,极大的方便了程序员的自我纠错能力。除了官方的解决方案之外,还有一种非常好的免费开源的第三方测试工具,那就是NUnit。它...
欢迎下载LabVIEW网络讲坛之单元测试架构工具包与执行跟踪工具包后续资源包,内含此次视频的相关例程以及演讲讲义. 欲了解
软件测试论文----单元测试及测试工具的研究与应用 《软件测试》秦晓 科学发版社
LabVIEW单元测试架构工具包(英文版)rar,使用LabVIEW软件设计工具,可以保证高品质以及稳定应用。单元测试架构可以运行自动软件测试,复原测试以及最后确认。为了更好的下载和评估NI LabVIEW单元测试架构,您需先购买...
软件测试是软件工程中的最重要的一个环节,而单元测试是软件测试中的很重要的一个步骤,DOT单元测试工具NUnit全部由C#编写