软件测试实验 FindBugs

1.配置 FindBugs


打开 Eclipse,通过【Window -> Preferences】下【Java -> FindBugs】查看 FindBugs的
配置情况。问题: 这里可以配置 FindBugs的哪些特性?

选择导入的项目,通过【Window -> Preferences】下【Java -> FindBugs】查看 FindBugs

配置情况,得出由图所示可知FindBugs的特性

1.Run Automatically开关

(1)当此项选中后FindBugs将会在你修改Java类时自动运行,如你设置了Eclipse自动编译开关后,当你修改完Java文件保存,FindBugs就会运行,并将相应的信息显示出来。

(2)当此项没有选中,你只能每次在需要的时候自己去运行FindBugs来检查你的代码。

2.Minimum confidence to report选择项

这个选择项是让你选择哪个级别的信息进行显示,有LowMediumHigh三个选择项可以选择,很类似于Log4J的级别设置。 比如:

(1)你选择了High选择项,那么只有是High级别的提示信息才会被显示。

(2)你选择了Medium选择项,那么只有是MediumHigh级别的提示信息才会被显示。

(3)你选择了Low选择项,那么所有级别的提示信息都会被显示。

此外,还有一个拖动条供选择rank等级(1-20),rank越高,严重程度越低,显示的信息越多。

3.Reported(visible) bug categories选择项(左侧是分类,右侧是等级)

在这里是一些显示Bug分类的选择:

Correctness关于代码正确性相关方面的

Performance关于代码性能相关方面的

Multithreaded correctness关于代码多线程正确性相关方面的

Malicious code vulnerability关于恶意破坏代码相关方面的

Internationalization关于代码国际化相关方面的

严重程度:Scariest>Scary>Troubling>Of concern,这个和rank的设置1-20是匹配的。

4. Detector configuration选择项

在其他的tab标签页中,显示了更多更详细的bug check configuration,用户可以根据需要进行选择和配置。

2.在 Sudoku上运行 FindBugs

打开 Eclipse,在 Sudoku项目上右键选择 FindBugs。
A. 查看 FindBugs发现的问题,一共有几类问题,各是什么含义?将这几类问题翻译成
中文;

答:三类问题。如图:

1. 对数组使用toString方法

Bug: Invocation of toString on combination in solver.Matrix.main(String[])

The code invokes toString on an array, which will generate a fairly useless result such as [C@16f0472. Consider using Arrays.toString to convert the array into a readable String that gives the contents of the array. See Programming Puzzlers, chapter 3, puzzle 12. 
 

解释:在数组上调用toString,这将得到一个没有用处的结果。在考虑使用数组时,toString将数组转换成一个可读的字符串数组的内容。

2. matrix .compute()在循环中使用+连接字符串

Bug: solver.Matrix.compute() concatenates strings using + in a loop

The method seems to be building a String using concatenation in a loop. In each iteration, the String is converted to a StringBuffer/StringBuilder, appended to, and converted back to a String. This can lead to a cost quadratic in the number of iterations, as the growing string is recopied in each iteration. 
Better performance can be obtained by using a StringBuffer (or StringBuilder in Java 1.5) explicitly.

解释:该方法似乎是在循环中使用连接构建字符串。在每次迭代中,字符串被转换为

StringBuffer/StringBuilder,附加到字符串,然后再转换回字符串。这可能导致迭代次数的二次成本,因为不断增长的字符串在每次迭代中重复出现。

通过显式地使用StringBuffer(或Java 1.5中的StringBuilder)可以获得更好的性能。

3.读取问题

Bug: Unread field: gui.MainWindow.m_gameOutput

This field is never read.  Consider removing it from the class.

解释:存在未读字段:gui.MainWindow.m_gameOutput,也就是说这个字段永远不会被读取。

B. 如何解决 FindBugs指出的问题?请修改 Sudoku程序,以改正所有 FindBugs指出的
问题。注意:同类错误仅需记录一次修改思想即可。

答:修改方法如下:

1. 对数组使用toString方法

解决方法:可以利用Arrays类位于 java.util 包中,主要包含了操纵数组的各种方法

使用时需要导入包:import java.util.Arrays;

修改之后,我们发现bug已经消失。

解决结果:

2. matrix .compute()在循环中使用+连接字符串

(由于思想一样,这里只举例一个来修改)

旧代码为:       

String fixed = "";

        int total = 0;

            for(int i=0, rows = m_field.length; i<rows; i++){

              for(int j=0, cols = m_field[i].length; j<cols; j++) {

                total ++;

                index ++;

                if(m_field[i][j] == 0)

                   m_unfixedNumber ++;

                else

                   fixed += m_field[i][j];              

            }

        }

将原来的代码改成:       

StringBuffer buf = new StringBuffer();

        int total = 0;

          for(int i=0, rows = m_field.length; i<rows; i++){

              for(int j=0, cols = m_field[i].length; j<cols; j++) {

                  buf.append(m_field[i][j]);

              }

          }

        {      

          String fixed = buf.toString();

解决结果:

Normal confidence只剩9个。该Bug已经解决。

3.读取问题

解决方法:可以将语句private GameOutput                     m_gameOutput = null; m_gameOutput = new GameOutput(m_sashForms, SWT.BORDER, m_gameField);语句删除即可

解决结果:

Unread field已经不再提示。该Bug已经解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钻仰弥坚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值