Contents

你不能保证你代码是正确的,只能证明他是错的。
如果没有测试,它就是坏的。
因为java是静态语言,程序员对于语言的安全性太多舒服,想“编译通过了,那没问题了”。但是静态类型校验,有很大的限制。它只代表满足语法和基本类型规则。不意味着到达你编程的目的。

单元测试
这个在你创造的代码中建立集成测试的过程,每次构建系统的时候运行他们。这样构建过程不仅仅检查语法错误。你教它检查语义上的错误。
“单元”涉及最小块代码测试的想法。每个类都测试方法的行为。“系统”测试不同,检查完成的程序是否满足要求。
C风格语言,尤其c++,注重性能甚于安全编程。开发java比c++更快的原因是因为java更安全。特性比如:垃圾收集,类型校验。集成单元测试在编译的时候,将扩展你的安全网,结果是更快的开发。你可以更简单和健壮的重构你的代码,当你发现设计和实现的缺陷时,一般情况下会生产更好的产品,更快。
我的测试经验开始于,保证书中代码的正确性,书中的每个程序必须能自动提取,和编译在一个合适的构建系统。这本书的构建系统是gradle,你安装jdk后, 简单的gradlew compilejava,来编译整本书的所有代码。。。。
JUnit
最初的junit发布于2000年,基于java1.0,没用到java反射机制,所以写单元测试是一个很麻烦和啰嗦的活动。我发现了设计的缺陷,写了自己的单元测试框架,这个框架走向了另一个极端,“尝试可能可行的最简单的方法”。自此Junit使用发射和注解提升了很多。最新版本添加了lambda的支持,在junit5中。
在最简单的junit使用中,每个方法代表一个测试,使用@Test注解。Junit确定这些方法为分立的测试,设定和运行一次只有一个,采取措施避免测试间的副作用。

覆盖率的错觉
测试覆盖率,或者叫代码覆盖率。更改的百分比,更好测试覆盖率。很多方法去计算覆盖率,一个有用的文章描述是java code coverage tools
太容易决定100%覆盖率是可接受的值。数值不太是测试有效性的一个好的测量值。你可能测试了所有,只有65%的覆盖率。为了100%你可能要浪费很多时间保证其他。
测试覆盖率是一个初略的数据是有效的,当你分析一个未知的代码。如果测试工具报告很低的数值,比如40%,告诉你覆盖率可能是无效。然后一个非常高数值也是可疑的,可能是一个知识不足的人下团队决定。
最好的覆盖率工具是发现未测试的代码库。但不依赖它告诉你测试的质量。

Contents