这本书的定位是Junit的入门书籍,我用Junit差不多有五年的时间了,因此大部分的概念对我而言都并不陌生。我所在的项目组对产品代码覆盖率要求非常高,要写非常多测试代码来验证功能。
大概用了一下午的时间,快速的翻了翻这本书,记了些笔记。总体感觉大概就是可以做junit的user guild了。
单元测试的目的:
--------------------------------------------------------------------------------
执行单元测试,是为了证明某段代码的行为确实和开发者期待的一样,又可具体为:
1> 它的行为和我的期望一致吗?
2〉它的行为始终和我的期望一致吗?
注:“始终”反映出:产品代码是否稳定?测试代码是否具有可重复性?
单元测试说明了我的意图了吗?
--------------------------------------------------------------------------------
程序员写测试代码的过程,也是理解需求的过程。单元测试一般都是白盒测试,需要程序员重新审视自己的代码是否满足需求,也会进一步审视自己的代码是否优秀以方便测试。如果是由其他人写单元测试代码,起到的是一个代码审查和knowledge sharing的作用。如果使用的是敏捷组织所倡导的测试驱动开发,会促使程序员写出结构更简单更方便测试的代码。
需要测试哪些内容?Right-BICEP
--------------------------------------------------------------------------------
Right 测试的结果是否正确/ Boundary Condition 边界条件/ Inverse relation 反转关系/ Cross check 交叉测试/ Exception,Error/ Performance
有哪些边界条件? CORRECT:
--------------------------------------------------------------------------------
Conformity一致性/ Ordering顺序性/ Range区间性/ Reference依赖性/ Existence存在性/ Cardinality基数性/ Time时间正确性
Mock
--------------------------------------------------------------------------------
Mock体现了接口类型使用的好处。对于方法的使用,引用处应该使用类的接口类型,即抽象类型而不是实际类型。Mock对象和被测试对象需要使用同一接口,因此在使用的时候,可以使用mock对象来替换真实对象。非常适合使用在当真实对象不宜/不易生成或者不稳定的情况。
EasyMock是基于mock技术的一套类库。
好的测试品质 A-TRIP:
--------------------------------------------------------------------------------
Automatic 自动化:调用测试自动化/检查结果自动化。可以引入持续集成工具来进行。
Thorough 彻底的:测试代码对产品代码的覆盖率要比较高。可以用Clover等工具衡量。
Repeatable 可重复的:每次测试的结果都一样。要求测试代码不依赖于不能控制的东西,如环境。必要时可以引入Mock对象。
Independent 独立的:每个测试都应该是一座孤岛。测试应当简洁精炼,针对性强。测试之间应该互相不影响,可以任何时候以任意顺序运行测试用例。
Professional 专业的:要写好的测试代码。任何针对设计的普遍规则,如DRY,解耦等,同样适用于UT。如果要达到比较高的覆盖率,测试代码会很多,因此需要保持跟产品代码一样的专业程度,保持简洁精炼,设计良好且重构充分。
方法的参数是否需要验证?
--------------------------------------------------------------------------------
这时一个开放性问题。如果方法定义处和使用处都做了验证,对于很多不愿意放太多时间在测试上的团队而言,是浪费时间和精力的。而且这么做也违反了DRY原则。最坏情况是没人做检查,这不符合良好测试的彻底性品质。
因为UT是针对方法级别的测试,建议是如果被测试的方法做了检查,那应该有相应的测试代码去测试这个检查。如果被测试方法未做检查,那我们有理由相信,在某个入口处应该保证了参数的合法性,此时测试代码可以把重点放在功能上。
测试代码应该放哪?
--------------------------------------------------------------------------------
作者给出了三个建议:
1〉和源代码同一目录。缺点是测试代码到处都是,不易管理,而且如果最后发布的产品不需要包含测试代码,会给构建和发布最后产品的工作增加复杂度;
2〉在当前被测试代码的子目录。缺点是不在同一个package,不能访问protected成员;
3〉并行树。测试类和产品代码在同一个包中,但位于不同的源码树。需要确保两棵树的根都在classpath中。这下测试代码是真的跑远了。
第三种方法好。既解决了产品代码应该和测试代码在同一个包中以确保protected成员能被访问的问题,也解决了两者实际路径应该分开的问题。
--------------------------------------------------------------------------------
在实际使用的过程中,可以在给Junit传参数指定要运行的testcase,否则:
如果测试类定义了suit方法,则会运行所有包含在该方法内的testcase;
否则Junit将使用反射机制来发现testXXXX方法。
Junit的suit()提供了自定义测试集合的功能,可以覆写。
assertTrue(true) // 我预计流程每次都会来到这个地方
注:这种写法可读性不是很强,至少它看上去怪怪的。assert一个经过该流程的变量会好一些。
每个测试都应该是一座孤岛
《单元测试之道Java版》热门书评
-
JUnit- java程序员的测试得力助手
4有用 2无用 LeslieGu 2007-03-14
一个高质量的程序离不开测试,一个高质量的java程序更不可能会没有JUnit测试,此书讲解如何通过JUnit来进行测试,阐述了单元测试带来的好处。个人认为,好的团队应该坚持为自己写的代码添加测试程序。提高程序的质量和团队成员的势气、信心。最后,值得一读:)...
-
每个测试都应该是一座孤岛
3有用 0无用 Naru 2013-09-12
这本书的定位是Junit的入门书籍,我用Junit差不多有五年的时间了,因此大部分的概念对我而言都并不陌生。我所在的项目组对产品代码覆盖率要求非常高,要写非常多测试代码来验证功能。大概用了一下午的时间,快速的翻了翻这本书,记了些笔记。总体感觉大概就是可以做junit的user guild了。单元测试...
-
没有讲到OO单元测试的精髓
3有用 0无用 Todd 2010-06-30
对OOP有一定理解的读者一定会发现,本书没有讲到单元测试的精髓。什么是单元测试的精髓呢?我认为是测试类的内聚性。举个例子:stack类的push和pop方法就是一种高内聚,它们的组合才有stack体现出FILO的性质。单元测试的目标不是孤立地测试push和pop,而是测试FILO性质。单元测试的目标...
-
延续了程序员修炼三部曲风格的好书
1有用 0无用 旺福 2009-07-19
这本书只有170多页,让你能够在短时间内了解如何使用JUnit进行单元测试,而不必啃着大部头还带着挫折感,是学习Junit的首选入门书籍。作者首先告诉你单元测试的重要性,然后手把手教你如何使用Junit进行简单的单元测试,最后以自己的经验告诉读者好的测试应该具有怎样的品质。即使是不使用JUnit做单...
-
一本专门讲用junit做测试的书籍
0有用 2无用 疯狂的菠菜 2009-08-23
这个可能是到目前为止我看到的最薄的技术书了.一本专门讲用junit做测试的书籍, 但是又不是纯技术的书籍, 里面没有介绍junit如何实现, 也没有大篇幅的介绍如何使用junit, 或者介绍junit的一些高级用法, 这些统统的没有, 那么这本书都讲的什么呢, 它讲了做单元测试的一些原则, 单元测试...
书名: 单元测试之道Java版
作者: Andrew Hunt
出版社: 电子工业
副标题: 使用Junit
译者: 陈伟柱 | 陶文
出版年: 2005-1
页数: 159
定价: 25.00元
ISBN: 9787121006654