《2022年软件测试文档》由会员分享,可在线阅读,更多相关《2022年软件测试文档(16页珍藏版)》请在金锄头文库上搜索。
1、软件测试报告一、问题描述:用 Java实现求两整数的加、减、乘、除运算结果,要求两整数的范围都是0,100。从键盘输入数m,数 n,判断他们的范围,假设不在0,100范围内,则输出提示语,要求重新输入,并且在做除法运算时, 当除数为 0 时, 输出提示语,说明除数不能为 0。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 16 页将两数的范围定在 0,100,以更好的进行边界值分析, 等价类测试等黑盒测试方法;为充分表达白盒测试的特点,有些地方故意用了if-else 语句, while 循环;另外,加、减、乘、除运算分别用了四个函数来计
2、算,这样既可以在主函数中调用,又可以在Junit 框架中分别对这四种运算进行测试。二、程序源代码:1. import java.util.Scanner; 2. publicclass Computer 3. privateinta; 4. privateintb; 5. public Computer (int x,int y) / 构造函数,初始化6. 7. a=x; / 注意: Juint中需要输入测试值在0100 范围 内8. b=y; 9. 10. publicdouble add() /加法11. 12. returna+b; 13. 14. publicdouble minus(
3、) / 减法15. 16. returna- b; 17. 18. publicdouble multiply() / 乘 法19. 20. returna* b; 21. 22. publicdouble divide() /除法,要求除数不能为0,否则输出提示语23. 24. if( b!=0) 25. returna/ b; 26. else27. System.out .println( 除数不能为 0! ); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 16 页28. return 0; 29. 30. publicsta
4、ticvoid main(String args) 31. 32. Scanner scanner = null; 33. scanner = new Scanner(System.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=0&n=0&m=0&n=10执行语句块3出口精选学习资料
5、 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 16 页、 判定分支覆盖:每个判定必须至少获得一次“真”值和“假”值,则测试用例:表 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 、条件判定覆盖:每个判定中的每个条件的所有可能值 真/ 假至少出现一次并且每个判定本身的结果真 / 假也至少出现一次,则测
6、试用例:表 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 到节点 36.(从节点 43 到 51) .所以:圈复杂度 VG= 51335334454455555565精选学习资料
7、- - - - - - - - - 名师归纳总结 - - - - - - -第 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.TestCas
8、e; /引入 Junit框架中所有类publicclass 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(); / 建立环境, 可以进行一
9、些测试数据的初始化,还可以把数据库联接写在此处,以减少重复性工作,提高效率a = new Computer(1,99); b = new Computer(101,5); c = new Computer(1,2); d = new Computer(1,0); protectedvoid tearDown() throws Exception super.tearDown(); publicvoid testComputer() int x=1; int y=1; assertSame(x,y); /assertSame() publicvoid testAdd() / 加法测 试asser
10、tEquals(100.0, a.add(); 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 16 页 publicvoid testAdd1() assertEquals(106.0, b.add(); / 输入值超出要求范围, 测试失败,因为要求 0100 范围,所以,在构造 Computer()函数时,要规定变量 x,y的范围 publicvoid testMinus() / 减法测 试assertEquals(-89,a.minus(); / 预期值和结果 不相等,测试失败 publicvoid testMinus1() a
11、ssertEquals(-89.0,a.minus(); publicvoid testMultiply() assertEquals(2.0,c.multiply(); publicvoid testMultiply1() Object tx = null; try assertEquals(2.0,c.multiply();/c.multiply()的正常结果是,所以在此不应抛出异常fail( should have thrown an exception ); / 上面不抛出异常,不执行fail() catch (Exception e) tx = e; assertNotNull(tx
12、); / 断言tx 不为空 , 则一定有异 常 publicvoid testDivide() assertEquals(0.0,d.divide(); / 因divide()函数中,当 d=0时,返回,所以这里 测试应该成功,虽然希望得到“被除数不能为0! ”的情况 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 12 页,共 16 页publicvoid testDivide1() assertEquals(0.5, c.divide(); publicvoid testEmpty() try c .divide(); fail( should
13、 have thrown an exception ); catch(RuntimeException Ex) assertTrue( true); /assertTrue(true); 截图:(1) 、测试 testAdd1()时,由于 b=new Computer(101,5);assertEquals(106.0, b.add();输入值范围超出定义范围,测试异常 ; (2) 、 测试testMinus()时,assertEquals(-89,a.minus();预期值和实际值不相同,测试异常;(3) 、测试 testMultiply()时,断言不为空,抛出异常精选学习资料 - - -
14、- - - - - - 名师归纳总结 - - - - - - -第 13 页,共 16 页Junit集成测试:在Junit中,Test Case总是对所有方法进行测试,而Test Suite中可对其中的一部分方法测试,而且一个测试类中还可以包含其他测试类。在Test Case 类中声明一个 public static Test suite()方法即可完成多个测试类的集成。例如,在上例 ComputerTest类中,添加: publicstatic Test Suit() TestSuite suite=new TestSuite(); suite.addTest(new ComputerTes
15、t(testAdd); suite.addTest(new ComputerTest(testMultiply1); return suite; 假设在另一个 ComputerTest1类中, 要测试 ComputerTest中的所有测试方法,则应:publicclass ComputerTest1 extends TestCase public ComputerTest1(String name) Super(name); publicstatic Test Suit() TestSuite suite=new TestSuite(); Suite(ComputerTest.class);
16、return suite; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 14 页,共 16 页四、测试用例设计体会:在这次软件测试过程中,我扮演了用户、程序员、测试员三钟角色,为了充分表达黑盒、白盒以及 Junit动态测试的特点, 我特意设计了一个 0,100之间的整数简单加减乘除运算。对于黑盒测试,在设计测试用例时完全没有考虑程序内部的逻辑结构和内部特性,只纯粹的依据功能和要求来设计测试用例进行测试。测试时使用了多种测试方法,包括边界值测试边界值分析、健壮性测试、特殊值测试,等价类测试弱一般、强一般、弱健壮、强健壮等价类测试,基于决策表的测试
17、等。虽然黑盒测试很容易生成测试用例,但实际上只有一小部分可能的输入被测试到,某些代码得不到测试, 不能直接对隐蔽了许多问题的特定程序段进行测试,不易进行充分性测试。比方:在上例中,假设输入的数据是2,0 ,则输出的是 0.0 ,很明显这个结果是不正确的。对于白盒测试, 在设计测试用例时首先对程序进行分析,从程序的内部结构出发设计测试用例, 涉及到程序的控制方法、 源语句、编码细节、数据库设计等。设计测试用例时应用了白盒测试中的多种测试方法,其中包括: 测试覆盖语句覆盖、分支覆盖、分支条件覆盖等 、基路径测试等方法。白盒测试中,对代码的测试比较透彻,但不容易生成测试用例,而且测试工作量很大,。因
18、为白盒测试是基于代码的基础上, 所以对变量的定义、 数据的分析、 精度的度量都有严格的要求。如:上例中要求输入的值是 0,100之间的 int型,而输出的结果却要求的是 double型。对于Junit,编写了另一段代码来测试要执行的代码,代码中的一个测试类精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 15 页,共 16 页TestCase包含了很多测试方法 testXXXX ,每个测试方法中又有很多测试断言 assertXXXX ,在方法中测试预期值是否和实际值一致。总之,在这次测试设计让我对软件测试有了一个深入了解,对于测试方法、测试过程,都有了较好的认识,学会了如何进行黑盒测试、白盒测试、以及一些测试工具如Junit 。当然,对于以后企业上的软件测试, 还有待很大的提高。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 16 页,共 16 页