一:静态测试含义:

静态测试是指无须执行被测代码,而是借助专用的软件测试工具评审软件文档或程序,度量程序静态复杂度,检查软件是否符合编程标准,借以发现编写的程序的不足之处,减少错误出现的概率。

静态测试包括代码检查、静态结构分析、代码质量度量等。

二:静态测试检查点

个人总结的静态测试检查点如下(疏漏不足肯定有,欢迎大家补充):

三. 代码检查点实例:

下面举几个代码中常见的错误示例,讲讲静态测试的作用和使用角度。

1.空指针风险

Person person = aMap.get(“bob”);

if (person != null) {

person.updateAccessTime();

}

String name = person.getName();

当MAP中不存在” bob”的key值时,name会取到空指针。

2.资源连接未关闭,比如文件,数据流,DB的连接操作完成后,

try {

fr = new FileReader(“D:/userSecondCheckRecoder.txt”);

} catch (FileNotFoundException e1) {

e1.printStackTrace();

}

需要补充关闭IO语句,fr.close()

3.性能处理技巧,减少内存无谓的耗损

String s = “”;

for (int i = 0; i < field.length; ++i) {

s = s + field[i];

}

以上代码功能上是通过的,但存在性能上不必要的耗损,在每次迭代中,字符串转换为stringbuffer/Builder,并转换回一个字符串。随着越来越多的字符串中的每一次迭代中,这会增加二次迭代的次数,使用StringBuffer效率更高。

更改为以下方式更好:

StringBuffer buf = new StringBuffer();

for (int i = 0; i < field.length; ++i) {

buf.append(field[i]);

}

String s = buf.toString();

4.规范:包含命名规范(类名,方法名,常量变量名),未被使用的变量或者方法,硬编码路径等。比如

File file = new File(“D:/ CheckRecoder.txt”);

5.非法的参数和计算

List<Long> a = new ArrayList<Long>();

a.add(10L);

a.add(11L);

System.out.println(a.contains(10));

应该修改为:

System.out.println(a.contains(10L));

或者比如荒谬的计算:

code = code ? code;

从例子可以看出,代码检查比动态测试更有效率,能快速找到缺陷,发现30%~70%的逻辑设计和编码缺陷;静态测试具有发现缺陷早、降低返工成本、覆盖重点和发现缺陷的概率高的优点。自动化维护成本低,且测试较为提前,对缺陷预防很有帮助。

四:主流静态测试工具介绍:

主流的JAVA代码静态自动化扫描工具:FINDBUGS介绍

FindBugs 是一个静态分析工具,它检查类或者 JAR 文件,将字节码与一组缺陷模式进行对比以发现可能的问题。FindBugs可以在ECLIPSE插件,构建工具(MAVEN,ANT),命令行等方式运行。FindBugs自带了丰富的故障探测器,每种探测器对应的详情如下:http://findbugs.sourceforge.net/bugDescriptions.html,且支持用户自定义规则探测器。运行FindBugs对代码扫描后根据故障类型结果如图:

关于更多故障类型的解读和检测器的自定义方式,将在后面的博文中总结。