声明:此篇文章的内容基本上都是从网络上收集到的已有的内容,原创部分几乎为零。概念性的内容摘自书《软件测试》(美国Ron Patton著)
此篇文章的结构是:从“测试方式”渐进到其中的1项“静态白盒”,然后列出了3个常见的静态白盒工具它们是:FindBugs、PMD、CheckStyle。所以说此篇文章并不深入,仅作为初步参考好了。
功能测试的基本分类
- 静态黑盒:(测试产品说明书)
针对任意形式的产品说明书,无所谓文档或者图示。要站在一格高度上审视,而不是立刻钻进去找软件缺陷,而是为了找出根本性的大问题、疏忽和遗漏。主要目的是更好地了解软件要做什么,如果能很好地理解产品说明书背后的原因和操作方式,就可以更好地仔细检查。
- 动态黑盒:(测试软件,所以也称作“行为测试”)
不深入代码细节的软件测试方法,进行输入、接受输出、检验结果。
- 静态白盒:(检查程序代码,所以也称作“结构分析”)
在不执行代码的前提下,有条理地仔细审查软件设计、体系结构、代码,从而找出软件缺陷。好处1是尽早发现缺陷,好处2是为设计黑盒测试用例提供思路。静态白盒测试不必要了解代码的细节,但是根据审查代码的备注,可以确定似乎有问题或者存在缺陷的特性范围。
常见软件缺陷:数据引用错误、数据声明错误、计算错误、比较错误、控制流程错误、子程序参数错误、输入输出错误、其它(考虑编码、可移植性、软硬件兼容性….)
- 动态白盒:(结构测试)
查看并使用代码的内部结构,从而设计和执行测试。换句话说,是指利用查看代码功能和实现方式得到的信息来确定哪些要测试、哪些不要测试、如何开展测试。
为什么静态白盒测试
静态测试包括代码检查、静态结构分析、代码质量度量等。它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。代码检查包括代码走查、桌面检查、代码审查等,主要检查代码和设计的一致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代码结构的合理性等方面。可以发现违背程序编写标准的问题,程序中不安全、不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题,包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构检查等内容。
为什么要进行静态测试呢?软件开发进行到编码阶段的时候,最大的风险就在于如何保证代码的易读性和一致性,从而使得软件的维护的代价不会很高。一个软件产品可能实现了所要求的功能,但如果它的内部结构组织的很复杂,很混乱,代码的编写也没有规范的话,这时软件中往往会隐藏一些不易被察觉的错误,这是其一。其次,即使这个软件基本满足了用户目前的要求,但到了日后对该产品进行维护升级工作的时候,会发现维护工作相当困难。 所以,如果能对软件进行科学、细致的静态分析,使系统的设计符合模块化、结构化、面向对象的要求,使开发人员编写的代码符合规定的编码规范,就能够避免软件中大部分的错误,同时为日后的维护工作节约大量的人力、物力。这就是对软件进行静态分析的价值所在。
静态白盒测试的工具
工具名 |
静态扫描语言 |
开源/付费 |
厂商 |
主页网址 |
ounec5.0 |
VB.Net、C、C++和C#, |
付 费 |
Ounce Labs |
http://www.ouncelabs.com |
Coverity Prevent |
C/C++,C#,JAVA |
付 费 |
Coverity |
http://www.coverity.com/index.html |
@stake SmartRisk |
C/C++,Java |
付 费 |
Symantec Corporation |
http://www.symantec.com/business/index.jsp |
Rational Purify |
C/C++,Java |
付费 |
IBM |
http://www-01.ibm.com/software/awdtools/purify/ |
PREfix |
microsoft |
|||
Jtext |
Java |
付费 |
parasoft |
http://www.parasoft.com/jsp/cn/support.jsp |
flawfinder |
C/C++ |
开源 |
http://www.dwheeler.com/flawfinder/ |
|
Static Code |
C/C++,C#,JAVA |
付费 |
Fortify |
http://www.fortify.com/ |
Klocwork Insight |
C/C++ ,Java |
付费 |
Klocwork |
http://www.klocwork.com/products/insight.asp |
PolySpace |
C/C++、Ada |
付费 |
MathWorks |
http://www.mathworks.cn/ |
rats |
C/C++, Python,Perl, PHP |
开源 |
http://www.fortify.com/security-resources/rats.jsp |
|
LAPSE |
Java |
开源 |
http://www.owasp.org/index.php/Category:OWASP_LAPSE_Project |
|
Fluid |
java |
开源 |
http://www.fluid.cs.cmu.edu:8080/Fluid |
|
Splint |
C |
开源 |
University of Virginia, |
http://www.splint.org/ |
cqual |
C/C++ |
开源 |
马里兰大学 |
http://www.cs.umd.edu/~jfoster/cqual/ |
MOPS |
C |
开源 |
berkeley大学 |
http://www.cs.berkeley.edu/~daw/mops/ |
BOON |
C |
开源 |
berkeley |
http://www.cs.berkeley.edu/~daw/boon/ |
BLAST |
C |
开源 |
The BLAST 2.0 Team |
http://mtc.epfl.ch/software-tools/blast/ |
SpikeWAMP |
Php |
开源 |
http://developer.spikesource.com/wiki/index.php/SpikeWAMP |
|
Pixy |
Php |
开源 |
http://pixybox.seclab.tuwien.ac.at/pixy/ |
|
Mike |
Java |
开源 |
http://milk.sourceforge.net/download.html |
|
Smatch |
C |
开源 |
http://smatch.sourceforge.net/ |
|
Oink |
C++ |
开源 |
http://www.cubewano.org/oink |
|
Frama-C |
C |
开源 |
http://frama-c.cea.fr/ |
|
RTL-check |
开源 |
http://rtlcheck.sourceforge.net/ |
||
PMD |
Java |
开源 |
||
FindBugs |
Java |
开源 |
马里兰大学 |
http://findbugs.sourceforge.net/ |
ITS4 |
CC++ |
开源 |
http://www.cigital.com/its4/ |
|
QJ-Pro |
Java |
开源 |
http://qjpro.sourceforge.net/ |
|
Jint |
Java |
开源 |
http://artho.com/jlint/ |
|
Hammurapi |
Java |
开源 |
http://www.hammurapi.biz/hammurapi-biz/ef/xmenu/hammurapi-group/index.html |
|
DoctorJ |
Java |
开源 |
http://www.incava.org/projects/java/doctorj/index.html |
|
Dependency Finder |
Java |
开源 |
http://depfind.sourceforge.net/ |
|
Checkstyle |
Java |
开源 |
http://checkstyle.sourceforge.net/ |
|
Classycle |
Java |
开源 |
http://classycle.sourceforge.net/ |
|
JDepend |
Java |
开源 |
http://www.clarkware.com/software/JDepend.html |
|
JCSC |
Java |
开源 |
http://jcsc.sourceforge.net/ |
FindBugs
FindBugs可以做什么
FindBugs是一个专门分析JAVA代码问题的静态代码扫描工具,它是由一位马里兰大学的博士写的,官网:http://findbugs.sourceforge.net/index.html,里面有FindBugs工具的下载,并且也包含了那位博士写的关于静态代码分析引擎的一些论文。FindBugs可以发现的问题包括:多线程竞争问题、性能问题、安全问题、代码规范。FindBugs检查类或者JAR文件,将字节码与一组缺陷模式进行对比以发现可能的问题。如果用人工检查的方式,这些bug可能很难才会被发现,或许永远也无法发现,直到运行时发作。
FindBugs对于bug的解释在官网有说明,参考http://findbugs.sourceforge.net/bugDescriptions.html
Bad practice—不好的做法,Correctness—正确性,Experimental—实验的,Internationalization—国际化,Malicious code vulnerability—恶意代码漏洞,
Multithreaded correctness—多线程正确性,Performance—性能,Security—安全性,Dodgy code—狡猾的代码
在何时使用FindBugs
开发阶段
当完成了某一部分功能模块开发的时候(这通常是指代码撰写完成,并已debug通过之后),可藉由FindBugs对该模块涉及的java文件进行一次扫描,以发现一些不易察觉的bug或是性能问题。交付新版的时候,开发团队可以跑FindBugs,除掉一些隐藏的bug。在开发阶段使用FindBugs,一方面开发人员可以对新版的品质更有信心,另一方面,测试人员藉此可以把更多的精力放在业务逻辑的确认上面,而不是花大量精力去关注一些要在特殊状况下才可能出现的bug(典型的如引用了空指针Null Pointer Dereference)。从而可以提高测试的效率。
维护阶段
这里指的是系统已经上线,却发现因为代码中的某一个bug导致系统崩溃。在除掉这个已暴露的bug之后,为了快速的找出类似的但还未暴露的bug,可以使用FindBugs对该版的代码进行扫描。当然,在维护阶段使用FindBugs往往是无奈之举,且时间紧迫。此外,如果本来在新版交付的时候就使用过FindBugs的话,往往意味着这种bug是FindBugs还无法检测出的。这也是FindBugs局限的地方。
怎么使用FindBugs
下载地址: http://sourceforge.net/projects/findbugs/files/findbugs%20eclipse%20plugin/
安装:Eclipse插件安装
FindBugs提供两种工具形式,一种是界面形式的工具,另外一种是以Eclipse插件的形式提供的。
介绍FindBugs插件形式的使用:
(1) 右键某个项目-->在弹窗里的路径是Find Bugs-->Find Bugs
(2) 把FindBugs附带的3个功能(Bug Explorer、Bug Details、Bug User Annotation)导出,使它们显示在工具栏内
(3) Bug Explorer显示的是用FindBugs对这个项目扫描的结果
(4) Bug Details包括Bug类别及程度、Bug定位、对Bug的解释
(5) Bug User Annotation仅仅是一些自己的备注
PMD
PMD可以做什么
PMD可以直接使用它自带的规则(当然也可以使用自己的规则)对Java源程序进行分析找出程序存在的问题,可以很大程度上的减轻代码检查工作的繁琐,为项目组今后的维护和开发工作起到指导的作用。
PMD附带了许多可以直接使用的规则,利用这些规则可以找出Java源程序的许多问题,例如:
潜在的bug:空的try/catch/finally/switch语句
未使用的代码:未使用的局部变量、参数、私有方法等
可选的代码:String/StringBuffer的滥用
复杂的表达式:不必须的if语句、可以使用while循环完成的for循环
重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs
循环体创建新对象:尽量不要再for或while循环体内实例化一个新对象
资源关闭:Connect,Result,Statement等使用之后确保关闭掉
此外,用户还可以自己定义规则,检查Java代码是否符合某些特定的编码规范。例如,你可以编写一个规则,要求PMD找出所有创建Thread和Socket对象的操作。
怎么使用PMD
安装:Eclipse插件安装
(1) 启动Eclipse
(2) 选择Help-->Software Updates-->Find and Install
(3) 选择Next,选择New remote site
(4) 在Name框中输入PMD,URL框中输入http://pmd.sf.net/eclipse
(5) 在之后的对话框中一直点击下一步或者接受协议,完成Eclipse的PMD插件的安装
在安装完更新后,如果发生了一个异常,例如”java.lang.RuntimeException: Could not find that class xxxx”,这时试着删除workspace中的.metadata/plugins/net.sourceforge.pmd.eclipse目录下的ruleset.xml文件。
(6) 然后选择PMD-->Check node with PMD,即可使用PMD工具检查代码,检查结果会放在reports目录下
(7) 启动Eclipse IDE,打开工程,选择 "Windows"->"Preferences"下的PMD项,其中Rules Configuration 项目可以配置PMD的检查规则,自定义检查规则也可以在此通过Import的方式导入到PMD中
(8) 配置好后,鼠标右键点击工程中需要检查的JavaSource,选择"PMD"->"Check Code With PMD" ,之后PMD就会通过规则检查你的JavaSource了并且将信息显示在PMD自己的视图上
工具 |
目的 |
检查项 |
FindBugs 检查.class |
基于Bug Patterns概念,查找javabytecode(.class文件)中的潜在bug |
检查bytecode中的bug patterns NullPoint空指针检查、没有合理关闭资源、字符串相同判断错(==,而不是equals)等 |
PMD 检查源文件 |
检查Java源文件中的潜在问题 |
空try/catch/finally/switch语句块 未使用的局部变量、参数和private方法 空if/while语句 过于复杂的表达式,如不必要的if语句等 复杂类 |
CheckStyle 检查源文件 主要关注格式 |
检查Java源文件是否与代码规范相符 |
Javadoc注释 命名规范 Size度量,如过长的方法 缺少必要的空格Whitespace 重复代码 |
CheckStyle
CheckStyle可以做什么
通常一个之前没有进行过checkstyle检查的项目,初次检查可能会有几百个错误,有些格式之类的错误,使用Eclipse自动格式化一下就能解决,如果命名之类的错误可以通过Eclipse统一修改。通过checkstyle检查之后比较多的错误是如下几种:
变量命名不符合规范
空格使用不规范
Java类没有加注释
Equals使用没有避免空指针,使用了类似nullString.equals("myString");而不是使用"myString".equals(nullString)
怎么使用CheckStyle
安装:Eclipse插件安装
在Eclipse-->Help-->Instasll New Software中输入下面的URL进行安装。http://eclipse-cs.sourceforge.net/update
(1) 安装完插件后,在Eclipse的下面路径能找到配置选项
Windows-->Preferences-->Checkstyle
(2) New--> External Configuration File,配置自定义规则
原因:一般的项目检查出来都会有非常多的错误警告信息,所以需要导入我们自己编写的配置文件
(3) 配置完成后ok--> Set as Default
(4) 选择1个项目右键--> properties--> checkstyle--> Checkstyle active for this project-->在configure内选择自定义规则
(5) ok
参考文档
《Java静态代码检查checkstyle》http://qa.blog.163.com/blog/static/19014700220133351850624/
《为啥不用静态代码检查工具呢?》http://qa.blog.163.com/blog/static/190147002201342382422899/
《Analysis Tool List》http://www.cs.cmu.edu/~aldrich/courses/654/tools/