2022年软件测试文档.docx
精选学习资料 - - - - - - - - - 软件测试报告一、问题描述:用 Java 实现求两整数的加、减、乘、除运算结果,要求两整数的范畴都是0,100;从键盘输入数m,数 n,判定他们的范畴,假设不在0,100范畴内,就输出提示语,要求重新输入,并且在做除法运算时, 当除数为 0 时,输出提示语,说明除数不能为 0;名师归纳总结 - - - - - - -第 1 页,共 16 页精选学习资料 - - - - - - - - - 将两数的范畴定在 0,100,以更好的进行边界值分析, 等价类测试等黑盒测试方法;为充分表达白盒测试的特点,有些地方有意用了if-else 语句, while 循环;另外,加、减、乘、除运算分别用了四个函数来运算,这样既可以在主函数中调用,又可以在 Junit 框架中分别对这四种运算进行测试;二、程序源代码:1. import java.util.Scanner; x,int y / 构造函数,初始化0100 范畴 内2. publicclass Computer 3. privateinta ; 4. privateintb ; 5. public Computer int6. / 留意: Juint中需要输入测试值在7. a=x; 8. b=y; /加法9. 10. publicdouble add 11. 12. returna+b; 13. 14. publicdouble minus / 减法15. 16. returna- b; 17. 18. publicdouble multiply / 乘 法19. 20. returna* b; 21. 22. publicdouble divide /除法,要求除数不能为0 ,否就输出提示语23. 名师归纳总结 24. if b .=0 a/ b; " 除数不能为 0!" ; 第 2 页,共 16 页25. return26. elseout .println27. System.- - - - - - -精选学习资料 - - - - - - - - - 28. return 0; 29. 30. publicstaticvoid mainString args 31. 32. Scanner scanner = null ; 33. scanner = new ScannerSystem. in ; 34. System. out .println " 请输入 0100 的两个 m,n 整数 :" ; 35. System. out .println " 请输入第一个数:" ; 36. while true / 假设输入值不在要求范畴内,就有循环直到输入正确为止37. int m = scanner.nextInt; 38. if m>=0&&m<=100 39. 40. System. out .println " 请输入其次个数:" ; 41. while true 42. int n = scanner.nextInt; 43. if n>=0&&n<=100 44. 45. Computer cpt= new Computerm,n; 46. System. out .println " 运算结果是: " ; 47. System. out .println " 加法 :" +m+"+" +n+ "=" +cpt.add; 48. System. out .println " 减法 :" +m+"-" +n+ "=" +cpt.minus; 49. System. out .println " 乘法:" +m+"*" +n+ "=" +cpt.multiply; 50. System. out .println " 除法 :" +m+"/" +n+ "=" +cpt.divide; 51. 52. else53. System. out .print " 输入 n 值不在要求区间 , 请重新输入 n :n" ; 54. 55. 56. else57. System. out .print " 输入 m值不在要求区间 , 请重新输入 m:n" ; 58. 59. 名师归纳总结 - - - - - - -第 3 页,共 16 页精选学习资料 - - - - - - - - - 60. 三、黑盒测试:1、边界值测试:、边界值分析:输入要求是 0100之间的整数, 因此产生了 0 和 100 两个边界,边界值分析可产生 4*2+1=9 个测试用例; 可构造 50,0、50,1、50,50、50,99、50,100、0,50、1,50、99,50、100,50 这 9 组测试用例;表 1 边界值分析测试用例用例mn预期输出 +、- 、* 、 / 实际输出 +、- 、* 、/ 150050. 0、 50. 0、0. 0、除数不为0!50. 0、 50. 0、0. 0、0. 02501 51. 0、 49. 0、50. 0、 50. 051. 0、 49. 0、50. 0、50. 035050100. 0、0. 0、2500. 0、1. 0100. 0、0. 0、2500. 0、1. 045099149. 0、-49. 0、4950. 0、0. 505109. 0、-9. 0、2950. 0、5 50100150. 0、-50. 0、5000. 0、0. 5150. 0、-50. 0、5000. 0、0. 56050 50. 0、 -50. 0、0. 0、0. 050. 0、 -50. 0、0. 0、 0. 07 15051. 0、 -49. 0、50. 0、0. 0251. 0、 -49. 0、50. 0、0. 028 9950149. 0、49. 0、 4950. 0、1. 98149. 0、49. 0、4950. 0、1. 98910050150. 0、50. 0、 500. 0、2. 0150. 0、50. 0、500. 0、2. 0在该测试时,发觉 50,0这个测试的除法的预期输出和实际输出不一样,是由于代码中 return 0;当除数 n=0 时,实际返回的是 0.0 ;publicdouble divide if b .=0 a / b ; returnelse名师归纳总结 - - - - - - -第 4 页,共 16 页精选学习资料 - - - - - - - - - System.out .println" 除数不能为 0! " ; return 0; / 显现Bug 健壮性测试:健壮性测试可产生6*2+1=13个测试用例,在上面边界值分析测试用例的基础上再添加 50,-1、50,101、-1,50、101,50这 4 个测试用例即可;表 2 健壮性测试用例用例mn预期输出 +、 * 、/实际输出1050-149. 0、 51. 0、-50. 0、-50. 0输入 n 值不在要求区间1150101 151. 0、-51. 0、5050. 0、0. 495输入 n 值不在要求区间12-15049. 0、 -51. 0、-50. 0、-0. 02输入 m 值不在要求区间1310150151. 0、51. 0、 5050. 0、2. 02输入 m 值不在要求区间2、等价类测试:规定了输入值 m,n 的范畴 0 ,100 ,就变量的有效等价类: M1=m:0m100 N1=n:0n100 变量的无效等价类: M2=m:m0 M3=m:m100 N2=n:n0 N3=n:n0 、弱一般等价类测试:该测试可用每个等价类的一个变量实现,可生成、强一般等价类测试:1 个测试用例;名师归纳总结 - - - - - - -第 5 页,共 16 页精选学习资料 - - - - - - - - - 该测试基于多缺陷假设,需要1*1=1个测试用例;表 3 强、弱一般等价类测试用例用例mn预期输出 +、 *、/、实际输出WN1,SN15050100. 0、0. 0、2500.0 、1.0、弱健壮等价类测试:该测试基于单缺陷假设,不仅对有效值测试,仍考虑了无效值,可生成1+2+2=5个测试用例;实际输出用例表 4 弱健壮等价类测试用例mn预期输出 +、 *、/WR15050100. 0、0. 0、2500.0 、1.0、 WR250-149. 0、51. 0、-50. 0、-50.0输入 n 不在要求区间 WR3 50101151. 0、-51. 0、5050. 0、0. 495输入 n 不在要求区间 WR4 -15049. 0、-51. 0、 -50. 0、 -0. 02输入 m 不在要求区间 WR5 10150151. 0、51. 0、5050. 0、 2. 02输入 m 不在要求区间、强健壮等价类测试:该测试基于多缺陷假设,从全部等价类笛卡尔积的每个元素中获得测试用例,可生成 1+2 * 1+2 =9 个测试用例;表 5 弱健壮等价类测试用例名师归纳总结 用例mn预期输出 +、 *、/实际输出第 6 页,共 16 页SR1-1-1-2. 0、 0. 0、1.0 、输入 m 值不在要求区间 SR2-15049. 0、- 51. 0、- 50. 0、- 0. 02输入 m 值不在要求区间 SR3 -1101100.0 、 0099输入 m 值不在要求区间 SR4 50 -1 49. 0、51. 0、-50. 0、-50.0输入 n 值不在要求区间 SR5 5050100. 0、0. 0、2500. 0、1. 0100. 0、0. 0、2500. 0、1. 0 SR6 50101106.0 、输入 m 值不在要求区间 SR7 101-1 100.0 、输入 m 值不在要求区间 SR8 10150 151.0 、输入 m 值不在要求区间101 SR9 101202.0 、输入 m 值不在要求区间- - - - - - -精选学习资料 - - - - - - - - - 3、因果图:C1:输入 m值在 0,100 e1 :输出结果 e2C内 C2:输入 n 值在 0,100内:输入 m值不在区间 e3:输入 n 值不在区间me1e2Ce33.基于决策表的测试:变量的有效等价类: M1=m:0m100 N1=n:0n100 变量的无效等价类: M2=m:m0 234 M3=m:m100 N2=n:n0 N3=n:n0 表 6 基于决策表的测试用例桩1C1:第一个数在:M1M1M2,M3M2,M3C2:其次个数在:N1N2,N3 N1N2,N3A1 :正常输出结果:XXXXA2 :输入 m 值不在要求区间,重新输入A3 :输入 n 值不在要求区间,重新输入X二、白盒测试:1. 测试掩盖指标:名师归纳总结 - - - - - - -第 7 页,共 16 页精选学习资料 - - - - - - - - - 流程图:入口 a f 执行语句块5执行语句块1 F T m>=0&&m<=10bd 执行语句块2执行语句块3 F 执行语句块4n>=0&&n<=10 F T c 出口、语句掩盖:每个可执行的语句必需至少执行一次,就测试用例:名师归纳总结 m1=-1,m2=1表 7 语句掩盖测试用例条件取值第 8 页,共 16 页测试用例通过路径;n1=101 ,n2=99 a,f,b,d,c F1,T1,F2,T2 - - - - - - -精选学习资料 - - - - - - - - - 、判定分支掩盖:每个判定必需至少获得一次“ 真” 值和“ 假” 值,就测试用例:表 8 判定分支掩盖测试用例通过路径条件取值m=1,n=99 a,b,c T;Tm1=-1,m2=1,n=99 a,f,b,c F1,T1;T2 m=1,n1=-1,n2=99 a,b,d,c T;F1,T1 m1=-1,m2=1;n1=101,n2=99 a,f,b,d,c F1,T1;F2,T2 、条件判定掩盖:每个判定中的每个条件的全部可能值 真 / 假至少显现一次并且每个判定本身的结果真 / 假也至少显现一次,就测试用例:表 9 条件判定掩盖测试用例通过路径条件取值m=1,n=99 a,b,c T,T 、路径掩盖:测试用例要求掩盖全部可能的路径:表10 路径掩盖测试用例 通过路径 条件取值m1=-1,m2=1;n1=101 ,n2=99 a,f,b,d,c F1,T1,F2,T2 2.基路径测试: 为简便画图,开头点从主要代码第 36 行开头,其他无分支节点用省略号表示名师归纳总结 - - - - - - -第 9 页,共 16 页精选学习资料 - - - - - - - - - 1从节点 1 到节点 36.333 534544从节点 43 到 51 45.555555名师归纳总结 所以:圈复杂度 VG= 56第 10 页,共 16 页- - - - - - -精选学习资料 - - - - - - - - - 4 个独立路径为 :P1:1,.,36,37,38.42,43.54,55,58,59,60 P2:1,.,36,37,56,57,58,59,60 P3:1,.,36,37,38.42,52,53,54,55,58,59,60 P4:1,.,36,37,38.42,43.54,42,52,53,54,55,58,59,60 P5:1,.,36,37,56,57,58,36,37,56,57,58,59,60 三、Junit 动态测试:import junit.framework.TestCase; / 引入 Junit 框架中全部类public class ComputerTest extends TestCase private Computer a; / 定义变量private Computer b; private Computer c ; private Computer d; public ComputerTest String name super name; / 构造函数 , 使用 super 关键字直接引用父类TestCase 的构造函 数 protectedvoid setUp throws Exception super.setUp; / 建立环境, 可以进行一些测试数据的初始化,仍可以把数据库联接写在此处,以削减重复性工作,提高效率a = new Computer1,99; b = new Computer101,5; c = new Computer1,2; d = new Computer1,0; protectedvoid tearDown throws Exception super.tearDown; public void testComputer int x=1; int y=1; assertSame x,y; /assertSame 名师归纳总结 publicvoid testAdd a.add; / 加法测 试第 11 页,共 16 页assertEquals100.0, - - - - - - -精选学习资料 - - - - - - - - - publicvoid testAdd1 b.add; / 输入值超出要求范畴, 测试assertEquals106.0, 失败,由于要求 0100 范畴,所以,在构造 Computer y的范畴 函数时,要规定变量 x,publicvoid testMinus a.minus; / 减法测 试assertEquals-89,/ 预期值和结果 不相等 ,测试失败 publicvoid testMinus1 a .minus; assertEquals-89.0, public void testMultiply assertEquals 2.0, c .multiply; public void testMultiply1 Object tx = null ; try assertEquals 2.0, c .multiply; /c.multiply 的正常结果是,所以在此不应抛出异 常fail " should have thrown an exception " ; / 上面不抛出反常,不执行fail catch Exception e tx = e; assertNotNulltx; / 断言 tx 不为空 , 就肯定有异 常 public void testDivide assertEquals 0.0, d.divide; / 因divide 函数中,当 d=0时,返回,所以这里 测试应当胜利,虽然期望得到“ 被除数不能为 0!” 的情形 名师归纳总结 - - - - - - -第 12 页,共 16 页精选学习资料 - - - - - - - - - publicvoid testDivide1 assertEquals0.5, c .divide; publictryvoid testEmpty c .divide; fail "should have thrown an exception " catchRuntimeException Ex /assertTruetrue; assertTrue true; 截图:1 、测试 testAdd1 时,由于 b=new Computer101,5;assertEquals106.0, b.add;输入值范畴超出定义范畴,测试反常 ; 2 、测试testMinus时,assertEquals-89,a.minus;预期值和实际值不相同,测试反常;3 、测试 testMultiply时,断言不为空,抛出反常名师归纳总结 - - - - - - -第 13 页,共 16 页精选学习资料 - - - - - - - - - Junit 集成测试:在Junit 中, Test Case 总是对全部方法进行测试,而 Test Suite 中可对其中的一部分方法测试,而且一个测试类中仍可以包含其他测试类;在 Test Case 类中声明一个 public static Test suite 方法即可完成多个测试类的集成;例如,在上例 ComputerTest 类中,添加: public static Test Suit TestSuite suite=new TestSuite; "testAdd" ; suite.addTestnew ComputerTest suite.addTestnew ComputerTest"testMultiply1"return suite; 假设在另一个 ComputerTest1类中,要测试 ComputerTest中的全部测试方法,就应:publicclass ComputerTest1 extends TestCase public ComputerTest1String name Supername; publicstatic Test Suit TestSuite suite= new TestSuite; SuiteComputerTest.class; return suite; 名师归纳总结 - - - - - - -第 14 页,共 16 页精选学习资料 - - - - - - - - - 四、测试用例设计体会:在这次软件测试过程中,我扮演了用户、程序员、测试员三钟角色,为了充分表达黑盒、白盒以及 Junit动态测试的特点, 我特意设计了一个 0,100之间的整数简洁加减乘除运算;对于黑盒测试,在设计测试用例时完全没有考虑程序内部的规律结构和内部特性,只纯粹的依据功能和要求来设计测试用例进行测试;测试时使用了多种测试方法,包括边界值测试边界值分析、健壮性测试、特别值测试,等价类测试弱一般、强一般、弱健壮、强健壮等价类测试,基于决策表的测试等;虽然黑盒测试很简洁生成测试用例,但实际上只有一小部分可能的输入被测试到,某些代码得不到测试, 不能直接对隐藏了很多问题的特定程序段进行测试,不易进行充分性测试;比方:在上例中,假设输入的数据是 2,0 ,就输出的是 0.0 ,很明显这个结果是不正确的;对于白盒测试, 在设计测试用例时第一对程序进行分析,从程序的内部结构动身设计测试用例, 涉及到程序的掌握方法、 源语句、编码细节、数据库设计等;设计测试用例时应用了白盒测试中的多种测试方法,其中包括: 测试掩盖 语句掩盖、分支掩盖、分支条件掩盖等 、基路径测试等方法;白盒测试中,对代码 的测试比较透彻,但不简洁生成测试用例,而且测试工作量很大,;由于白盒测 试是基于代码的基础上, 所以对变量的定义、 数据的分析、 精度的度量都有严格名师归纳总结 的要求;如:上例中要求输入的值是 0,100之间的 int型,而输出的结果却要第 15 页,共 16 页求的是 double型;代码中的一个测试类对于 Junit,编写了另一段代码来测试要执行的代码,- - - - - - -精选学习资料 - - - - - - - - - TestCase包含了很多测试方法 testXXXX,每个测试方法中又有很多测试断言 assertXXXX,在方法中测试预期值是否和实际值一样;总之,在这次测试设计让我对软件测试有了一个深化明白,对于测试方法、测试过程,都有了较好的熟悉,学会了如何进行黑盒测试、白盒测试、以及一些名师归纳总结 测试工具如 Junit;当然,对于以后企业上的软件测试, 仍有待很大的提高;第 16 页,共 16 页- - - - - - -