第十六章 代码校验
你永远不能保证你的代码是正确的,你只能证明它是错的。
测试
测试覆盖率的幻觉
测试覆盖率,同样也称为代码覆盖率,度量代码的测试百分比。百分比越高,测试的覆盖率越大。
当分析一个未知的代码库时,测试覆盖率作为一个粗略的度量是有用的。如果覆盖率工具报告的值特别低(比如,少于百分之40),则说明覆盖不够充分。然而,一个非常高的值也同样值得怀疑,这表明对编程领域了解不足的人迫使团队做出了武断的决定。覆盖工具的最佳用途是发现代码库中未测试的部分。但是,不要依赖覆盖率来得到测试质量的任何信息。
前置条件
Java断言语法
断言语句有两种形式,抛出 AssertionError
异常 :
assert boolean-expression;
assert boolean-expression: information-expression;
information-expression
可以产生任何类型的对象。
需要在运行程序时显式启用断言,启动时添加虚拟机参数。一种简单的方法是使用 -ea
flag, 它也可以表示为: -enableassertion
,这将运行程序并执行任何断言语句。
java -ea Assert1
有另一种办法控制你的断言:编程方式,通过链接到类加载器对象(ClassLoader)。类加载器中有几种方法允许动态启用和禁用断言,其中 setDefaultAssertionStatus()
,它为之后加载的所有类设置断言状态。
Guava断言
因为启用Java本地断言很麻烦,Guava团队添加一个始终启用替换断言的 Verify
类。他们建议静态导入 Verify
方法。
支持 verify()
和 verifyNotNull()
。
使用Guava前置条件
com.google.common.base.Preconditions.checkXXX
每个前置条件都有三种不同的重载形式:一个什么都没有,一个带有简单字符串消息,以及带有一个字符串和替换值。
测试驱动开发(TDD)
TDD的目标是产生更好,更周全的测试,因为在完全实现之后尝试实现完整的测试覆盖通常会产生匆忙或无意义的测试。
日志
业内普遍认为标准 Java 发行版本中的日志包 (java.util.logging
) 的设计相当糟糕。 大多数人会选择其他的替代日志包。