软件测试——计算器加减乘除

软件测试——计算器加减乘除

实 验 目 的:

(1)掌握软件测试的过程和方法。

(2)掌握测试用例的设计方法。

(3)熟悉测试计划说明书、测试记录与分析报告的编写。

实 验 环 境:

PC一台 、Junit、WORLD编辑工具

实 验 内 容 及 过 程:

实验要求:

1.根据所选的课程设计题目进行以下实验

2.用程序设计所规定的编程语言,编写一段代码实现软件需求给出的一个功能(每位同学所选的功能模块不同)。

3.制定测试计划、设计测试用例,特别是一些异常情况的处理。

4.模块的动态测试以黑盒法为主,辅以白盒法。重要执行路径的测试使用白盒法。白盒法必须先列出所有判定,再选择覆盖标准,根据不同的覆盖标准所列出的情况,设计测试用例。

5.阅读相关的软件开发标准文档,正确编写测试计划、测试记录与分析报告。

实验步骤:

1.编写一段代码实现软件项目的一个功能。

2.制定测试计划,设计软件项目相应的测试用例。

3.测试数据,调试运行策略。

4.编写测试记录与分析报告。

5.完成实验报告。

一、问题描述

用Java实现求两整数的加、减、乘、除运算结果,要求两整数的范围都是[0,100]。从键盘输入数m,数n,若不在[0,100]范围内,则输出提示语,要求重新输入,并且在做除法运算时,当除数为0时,输出提示语,说明除数不能为0。

将两数的范围定在[0,100],以更好的进行边界值分析,等价类测试等黑盒测试方法;为充分体现白盒测试的特点,有些地方故意用了if-else语句,while循环;另外,加、减、乘、除运算分别用了四个函数来计算,这样既可以在主函数中调用,又可以在Junit框架中分别对这四种运算进行测试。

二、程序源代码

package JunitTest;

import java.util.Scanner;

public class Computer {

private int a;

private int b;

public Computer (int x, int y) //构造函数, 初始化

{

a=x;

b=y;//注意:Junit中需要输入测试值在0-100范围内

}

public int limit() {

if (a >= 0 && a <= 100) {

if (b >= 0 && b <= 100) {

return b;

} else {

System.out.println("输入n值不在要求区间,请重新输入n ");

}

return a;

} else {

System.out.println("输入m值不在要求区间,请重新输入m ");

}

return 0;

}

public int add ()

{

limit();

return a+b;

}

public int minus ()

{

limit();

return a-b;

}

public int multiply()

{

limit();

return a*b;

}

public int divide ()

{

if(b!=0) {

limit();

return a / b;

}

else{

System.out.println("除数不能为0! ");

}

return 0;

}

public static void main(String[] args)

{

Scanner scanner;

scanner = new Scanner (System.in) ;

System.out. println ("请输入0~100的两个m, n整数:");

System.out.println("请输入第一个数:");

do {//若输入值不在要求范围内,则有循环直到输入正确为止

int m = scanner.nextInt();

if (m >= 0 && m <= 100) {

System.out.println("请输入第二个数:");

while (true) {

int n = scanner.nextInt();

if (n >= 0 && n <= 100) {

Computer cpt = new Computer(m, n);

System.out.println("运算结果是:");

System.out.println("加法:" + m + "/" + n + "=" + cpt.add());

System.out.println("减法:" + m + "-" + n + "=" + cpt.minus());

System.out.println("乘法:" + m + "*" + n + "=" + cpt.multiply());

System.out.println("除法:" + m + "/" + n + "=" + cpt.divide());

} else

System.out.print("输入n值不在要求区间,请重新输入n:\n");

}

} else

System.out.print("输入m值不在要求区间,请重新输入m:\n");

} while (true);

}

}

三、黑盒测试

1.边界值分析

输入要求是0-100之间的整数,因此产生0和100两个边界。可构造(50,0)、(50,1)、(50,50)、(50,99)、(50,100)、(0,50)、(1,50)、(99,50)、(100,50)、(50,-1)、(50,101)、(-1,50)、(101,50)这13组测试用例。

2.等价类划分

规定了输入值m,n的范围[0,100],则

变量的有效等价类:

M1={m:0≤m≤100}

N1={n:0≤n≤100}

变量的无效等价类:

M2={m:m≤0}

M3={m:m≥100}

N2={n:n≤0}

N3={n:n≥0}

3.因果图

1:输入m值在[0,100]以内 2:输入n值在[0,100]以内

12:输出结果 13:输入m值不在区间 14:输入n值不在区间

4.决策表法

变量的有效等价类:

M1={m:0≤m≤100}

N1={n:0≤n≤100}

变量的无效等价类:

M2={m:m≤0}

M3={m:m≥100}

N2={n:n≤0}

N3={n:n≥0}

四、白盒测试

程序的大致流程图如下:

1.语句覆盖

每个可执行的语句必须至少执行一次,则测试用例:

2.判定覆盖

每个判定必须至少获得一次“真”值和“假”值,则测试用例:

3.条件组合覆盖

每个判定中的每个条件的所有可能值(真/假)至少出现一次并且每个判定本身的结果(真/假)也至少出现一次,则测试用例:

4.路径覆盖

测试用例要求覆盖所有可能的路径,则测试用例:

五、测试代码

package JunitTest;

import junit.framework.Test;

import junit.framework.TestCase;

import junit.framework.TestSuite;

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的构造函数

}

protected void setUp() throws Exception {

super.setUp();//建立环境,可以进行一些测试数据的初始化,还可以把数据库联接写在此处,以减少重复性工作,提高效率

a = new Computer(12, 2);

b = new Computer(101, 5);

c = new Computer(5, 101);

d = new Computer(1, 0);

}

public void tearDown() throws Exception {

super.tearDown();

}

public void testAdd() {

assertEquals(14, a.add());

}

public void testMinus() {

assertEquals(10, a.minus());

}

public void testMultiply() {

assertEquals(24, a.multiply());

}

public void testDivide() {

assertEquals(6, a.divide());

}

public void testDivideByZero() {

try {

assertEquals(0, d.divide());//因divide()函数中当d=0时,返回0,所以这里测试应该成功,虽然希望得到“除数不能为0!”的情况

fail("should have thrown an exception");//上面不抛出异常,不执行fail()

}catch (Exception e){

assertTrue(true);

}

}

public void testAdd1() {

try {

assertEquals(106, b.add());//因divide()函数中当d=0时,返回0,所以这里测试应该成功,虽然希望得到“除数不能为0!”的情况

fail("should have thrown an exception");//上面不抛出异常,不执行fail()

}catch (Exception e){

assertTrue(true);

}

}

public void testAdd2() {

try {

assertEquals(106, c.add());//因divide()函数中当d=0时,返回0,所以这里测试应该成功,虽然希望得到“除数不能为0!”的情况

fail("should have thrown an exception");//上面不抛出异常,不执行fail()

}catch (Exception e){

assertTrue(true);

}

}

}

public static Test suite ()

{

TestSuite suite=new TestSuite();

suite.addTest(new ComputerTest("testAdd1"));

suite.addTest(new ComputerTest("testDivideByZero"));

return suite;

}

运行结果截图:

(1)测试testDivideByZero,由于d=new Computer(1,0);除数不能为0,抛出异常;

(2)测试testAdd1()时,由于b=new Computer(101,5);assertEquals(106,b.add());输入值范围超过定义范围,抛出异常;

(3)测试testAdd2()时,由于c=new Computer(5,101);assertEquals(106,c.add());输入值范围超过定义范围,抛出异常。

扩展:

若在另一个ComputerTest1类中,要测试ComputerTest中的所有测试方法,则可以:

package JunitTest;

import junit.framework.Test;

import junit.framework.TestCase;

import junit.framework.TestSuite;

public class ComputerTest1 extends TestCase

{

public ComputerTest1 (String name)

{

super(name);

}

public static Test suite ()

{

TestSuite suite=new TestSuite();

suite.addTestSuite (ComputerTest.class);

return suite;

}

}

六.心得体会

在这次软件测试过程中,我扮演了用户、程序员、测试员三钟角色,为了充分体现黑盒、白盒以及Junit动态测试的特点,我特意设计了一个[0,100]之间的整数简单加减乘除运算。

对于黑盒测试,在设计测试用例时完全没有考虑程序内部的逻辑结构和内部特性,只纯粹的依据功能和要求来设计测试用例进行测试。测试时使用了多种测试方法,包括边界值测试,等价类测试,基于决策表的测试等。虽然黑盒测试很容易生成测试用例,但实际上只有一小部分可能的输入被测试到,某些代码得不到测试,不能直接对隐蔽了许多问题的特定程序段进行测试,不易进行充分性测试。

对于白盒测试,在设计测试用例时首先对程序进行分析,从程序的内部结构出发设计测试用例,涉及到程序的控制方法、源语句、编码细节、数据库设计等。设计测试用例时应用了白盒测试中的多种测试方法,其中包括:语句覆盖、判定覆盖、条件组合覆盖、路径覆盖等方法。

对于Junit,编写了另一段代码来测试要执行的代码,代码中的一个测试类(TestCase)包含了很多测试方法(testxxxx),每个测试方法中又有很多测试断言(assertXXXX),在方法中测试预期值是否和实际值一致。

总之,在这次测试设计让我对软件测试有了一个深入了解,对于测试方法、测试过程,都有了较好的认识,学会了如何进行黑盒测试、白盒测试、以及一些测试工具(如Junit)。当然,对于以后企业上的软件测试,还有待很大的提高。

🌈 相关推荐

2019雅马哈三大电子鼓推荐与简单评测
365bet官网ribo88

2019雅马哈三大电子鼓推荐与简单评测

📅 08-06 👁️ 3641
炼狱厨神奇遇攻略【封印时间:N天】
365bet官网ribo88

炼狱厨神奇遇攻略【封印时间:N天】

📅 09-07 👁️ 7297