1软件质量保证与测试2015年春季教师:杨秋辉实验报告1–静态白盒测试学号:姓名:1引言白盒测试(white-boxtesting)又称透明盒测试(glassboxtesting)、结构测试(structuraltesting)等,软件测试的主要方法之一,也称结构测试、逻辑驱动测试或基于程序本身的测试。测试应用程序的内部结构或运作,而不是测试应用程序的功能(即黑盒测试)。在白盒测试时,以编程语言的角度来设计测试案例。测试者输入数据验证数据流在程序中的流动路径,并确定适当的输出,类似测试电路中的节点。测试者了解待测试程序的内部结构、算法等信息,这是从程序设计者的角度对程序进行的测试。FindBugs是由BillPugh和DavidHovemeyer创建的开源程序,用来查找Java代码中的程序错误。它使用静态分析来识别Java程序中上百种不同类型的潜在错误。潜在错误可分为四个等级:恐怖的(scariest)、吓人的(scary)、令人困扰的(troubling)和值得关注的(ofconcern),这是根据其可能产生的影响或严重程度,而对开发者的提示。2测试结果记录表1FindBugs静态测试结果分析表编号源代码(指明是哪个函数中的哪几条语句)编译提示静态测试结果你的修改再次静态测试结果你的理解1函数function1():if(str!=null)无错误Bug:Repeatedconditionaltestintest.function1()Thecodecontainsaconditionaltestisperformedtwice,onerightaftertheother(e.g.,x==0||x==0).Perhapsthesecond删除第2个if(str!=null)无错误是缺陷,需要根据程序实际应该的逻辑来确定是否修复。如静态测试结果所述,两个相同的条件语句重复出现,没有实际意实验分数占百分比得分实验室演示10%实验报告90%合计100%2occurrenceisintendedtobesomethingelse(e.g.,x==0||y==0).义。如果只是程序员无意中多写了一次,不会影响程序运行结果;但按照代码编写的一般规律,这里应该是两个不同的判定条件。2函数function3():Stringstr3=String.format({0}{1},str1,str2);无错误Bug:String.format(String,Object[])needsprintf-styleformatbutcalledwithMessageFormatAmethodiscalledthatexpectsaJavaprintfformatstringandalistofarguments.However,theformatstringdoesn'tcontainanyformatspecifiers(e.g.,%s)butdoescontainmessageformatelements(e.g.,{0}).ItislikelythatthecodeissupplyingaMessageFormatstringwhenaprintf-styleformatstringisrequired.Atruntime,alloftheargumentswillbeignoredandtheformatstringwillbereturnedexactlyasprovidedwithoutanyformatting.修改为Stringstr3=String.format(%s%s,str1,str2);无错误是缺陷,函数调用时参数使用错误。String.format(String,Object[])前面的String部分需要像printf一样使用%s占位符才能显示后面的变量。3函数function5():returnnewRandom(seed).nextInt();无错误Bug:RandomobjectcreatedandusedonlyonceinTest.function5(int)Thiscodecreatesajava.util.Randomobject,usesittogenerateonerandomnumber,andthendiscardstheRandomobject.Thisproducesmediocrequalityrandomnumbersandisinefficient.Ifpossible,rewritethecodesothattheRandomobjectiscreatedonceandsaved,andeachtimeanewrandomnumberisrequiredinvokeamethodontheexistingRandom修改为Randomran=newRandom(seed);returnran.nextInt();无错误是缺陷。Random出来的对象没保存,而是直接调用它的另一方法,这样做Random的效率很低,应该把它保存下来,下次再用到不用new,提高效率。3objecttoobtainit.IfitisimportantthatthegeneratedRandomnumbersnotbeguessable,youmustnotcreateanewRandomforeachrandomnumber;thevaluesaretooeasilyguessable.Youshouldstronglyconsiderusingajava.security.SecureRandominstead(andavoidallocatinganewSecureRandomforeachrandomnumberneeded).4函数function7():synchronized(str)无错误Bug:SynchronizationoninternedStringinTest.function7()ThecodesynchronizesoninternedString.privatestaticStringLOCK=LOCK;...synchronized(LOCK){...}...ConstantStringsareinternedandsharedacrossallotherclassesloadedbytheJVM.Thus,thiscouldislockingonsomethingthatothercodemightalsobelocking.Thiscouldresultinverystrangeandhardtodiagnoseblockinganddeadlockbehavior.See://jira.codehaus.org/browse/JETTY-352.SeeCERTCON08-J.Donotsynchronizeonobjectsthatmaybereusedformoreinformation.删除synchronized(str)和后面{}无错误是缺陷。对String类型上锁可能造成其它运行在java虚拟机上的类的String上锁,导致大面积死锁。43遗漏缺陷分析【列出你认为静态测试应该可以发现、但被遗漏的缺陷】表2FingBugs静态测试遗漏缺陷表编号源代码缺陷描述你认为此缺陷为什么不能被自动工具发现?1函数function2():System.out.println(str);;一句代码后,分号多一个不影响程序的性能和结果2函数function4():System.out.println(str.toString());Str本来就是String类型,又使用toString函数转化并不存在潜在风险3函数function6():for(inti=0;i=arr.length;i++)数组访问越界工具在未运行的情况下检查bug不能判断访问是否越界4其他的测试代码【你还能想到哪些在编程中容易出现的缺陷?请写出示例代码,记录测试结果。】编号源代码(指明是哪个函数中的哪几条语句)编译提示静态测试结果你的修改再次静态测试结果你的理解1If(name!=“”)无错误Bug:ComparisonofStringobjectsusing==or!=!name.equal(“”)无错误String类型比较内容是否相同时不能用!=或==2intcurrent=(min+max)/2无错误Bug:Computationofaveragecouldoverflow(low+high)1无错误Min+max可能超过int最大值,得到负数3If(m_dValue==Double.NaN)无错Bug:DoomedtestforequalitytoNaNDouble.isNaN(m_dValue)无错误Nan很特殊(表示未定义和不可表示的值),没有任何值跟它相等,包括它自身,所以x==Double.NaN永远返回5误false。5自动化测试和手动测试的比较1.效率方面,自动化测试明显优于手动测试2.准确率方面,虽然自动化测试效率较高,但其找出的“错误”可能不是错误,准确率赶不上手动测试。3.资源耗费方面,自动测试明显优于人工。6静态测试和动态测试的比较区别一:静态测试是用于预防的,动态测试是用于矫正的区别二:多次的静态测试比动态测试要效率和效益高区别三:静态测试综合测试程序代码区别四:在相当短的时间里,静态测试的覆盖度能达到100%,而动态测试经常是只能达到50%左右,原因动态测试发现的bug大部分只是在测试实际执行的那部分代码区别五:动态测试比静态测试更花时间区别六:静态测试比动态测试更能发现bug区别七:静态测试的执行可以在程序编码编译前,动态测试只能在编译后才能执行区别八:静态测试能发现动态测试所不能发现的一些:“Syntaxerror,codethathardtomaintain,codethathardtotest,codethatdoesnotconfirmtocodingstandard,andANSIviolations”静态测试能够发现而动态测试不能发现的:程序逻辑错误等动态测试能够发现而静态测试不能发现的:内存的越界访问、环境错误等7测试时遇到的困难和挑战结果都是英文,不是那么易懂,需要查询资料。8本实验的收获和结论代码静态测试的重要性,静态测试能找到大部分错误,软件静态测试在软件开发过程中必不可少。69意见和建议当然有用,没知道怎么做试验。能根据指导完成实验。时间挺充足。希望减少需要自己填写的内容,个人觉得做的时候都是去各大搜索引擎找,实际学到都是在自己不断编码过程中掌握的。