Slide 1

Slide 1 text

Java 质量保障 LI Daobing 2011-08-04

Slide 2

Slide 2 text

Outline  如何做单元测试  如何让代码对单元测试友好  一种中规中矩的结构设计  总结

Slide 3

Slide 3 text

注意 : 以下都是个人观点

Slide 4

Slide 4 text

单元测试  单元测试的目的  验证类实现了设计时承诺的行为  帮助再现 bug  帮助发现 bug  保障重构

Slide 5

Slide 5 text

单元测试的基本约定  使用 JUnit4 或者 TestNG  源码与测试的包 (package) 名保持一致,  FooService 对应的测试类为 FooServiceTest

Slide 6

Slide 6 text

测试名最好是一个句子  测试名最好是一个句子  好的名字 : runShouldRaiseFooExceptionWithNullArgumen t  一般的名字 : testRun  糟糕的名字 : test2  最好的情况是看见一个测试类的全部方法名就知 道这个类能干什么,什么情况下会有什么行为

Slide 7

Slide 7 text

为测试准备单独的环境  可以用 System.getenv 或者 System.getProperty 来判定当前的环境  为测试准备一份单独的配置文件 / 工厂类 /Spring Configuration

Slide 8

Slide 8 text

使用依赖注入来简化测试

Slide 9

Slide 9 text

使用 protected 函数来 mock 底 层依赖

Slide 10

Slide 10 text

如何正确测试异常

Slide 11

Slide 11 text

其他要点  测试不易过大,每个单元测试尽量只检测类的一 个特性  测试不仅仅是执行代码,更要检测代码执行后结 果是否满足期望  不要在单元测试中随意 catch 异常,尽量让异 常抛出来  如果使用 Spring, 可以使用 Spring 现有的测试 支持

Slide 12

Slide 12 text

Outline  如何做单元测试  如何让代码对单元测试友好  一种中规中矩的包设计  总结

Slide 13

Slide 13 text

服务应当是一个对象而不是一个类  测试需要构建一个测试用对象,依赖于一些 mock 的底层服务  甚至需要创建多个服务  这个时候使用对象比使用类方便  对象意味着晚绑定 , 晚绑定意味着灵活

Slide 14

Slide 14 text

服务应当是一个对象而不是一个类  比如 A 服务依赖于 B 服务,如果 B 服务是一 个对象,那么可以构造出一个 B 服务的 Mock 对象,注入到 A 服务,方便测试 A 服务  如果 B 服务是一个类,那么测试起来就会很麻 烦

Slide 15

Slide 15 text

服务的依赖尽量在构造时一次传入  在服务创建时可以一次检查所有可能的问题  避免服务处于一个无效的状态

Slide 16

Slide 16 text

使用工厂简化服务构造

Slide 17

Slide 17 text

按 package 划分 Factory  如果工程比较大,只用一个 Factory 类会显得 过于复杂,一般建议按 package 来划分 Factory  同时一个 package 最好只有一个 Factory, Factory 具有配置的隐喻,而配置应该集中而不 是分散  比如 com.snda.llap.replicator.client.DatanodeChoos erClientFactory

Slide 18

Slide 18 text

你其实也可以使用 Spring

Slide 19

Slide 19 text

声明方法时不要使用通用异常类

Slide 20

Slide 20 text

不要拦截你不知道如何处理的异常

Slide 21

Slide 21 text

在边界处检查异常  尽量在系统边界处检查异常,而在系统中间让异 常透明通过  比如 web 或者 socket 服务,只在相应前做一 个通用异常检查,并返回信息给用户  当然在另外一个边界处也要做适当检查,避免所 依赖的其他服务出现异常时延迟发现。

Slide 22

Slide 22 text

不要使用 e.printStackTrace()

Slide 23

Slide 23 text

组织你的异常类  Exception  KeybaseException  FooException  RuntimeException  KeybaseRuntimeException  BarException

Slide 24

Slide 24 text

其他建议  熟悉 commons-lang,codec,io, ... 库  熟悉 guava 库

Slide 25

Slide 25 text

一种中规中矩的工程结构

Slide 26

Slide 26 text

Summary  Java  静态,面向对象  安全,易用,对多线程支持较好  推崇单元测试,文档,代码检查。  推崇设计模式,重构,团队合作。  也是在企业应用领域使用最广泛的语言。  不是动态语言 (Python, Ruby, …)  对高并发支持不好 (Scala, ...)

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

Q&A

Slide 29

Slide 29 text

Thanks for your attention