A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 不二晨 金牌黑马   /  2019-4-1 08:59  /  1557 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

面向对象测试的概述

面向对象是一种软件开发的思想,在整个软件生命周期都要遵循这种思想,根据软件生命周期的各个阶段,可以将面向对象测试分为以下几种:

面向对象分析的测试OOA test

面向对象设计的测试OOD test

面向对象编码的测试 OOP test

其中面向对象编码测试又分为单元测试和集成测试

面向对象分析和设计的测试主要是检查验证系统需求说明书,概要设计等需求设计文档,主要采用静态分析的方法,分析系统的架构是否合理,各个类的设计是否合理,有无多余或者缺少的类,以及每一个类中的属性和方法设计是否合理,有无多余或者缺少的属性和方法等。



面向对象程序的单元测试

传统的面向过程的语言如C语言是对函数的测试,而面向对象程序的单元测试主要是对基类和派生类的测试。

在一个类中封装了对象的属性和方法,那么对类的测试必然包括对属性的测试和方法的测试,对于方法的测试完全可以采用传统的白盒测试技术,如边界值、逻辑驱动测试、循环语句测试等。但是更多的时候是把类作为一个整体,将其属性和方法结合起来测试以及不同类之间的关联测试

下面结合实例来讲解一下面向对象单元测试的大概步骤

Shape类,rectangle类,square类和circle类。其中shape类为基类,rectangle类,square类都继承自shape类,square类继承自rectangle类

/*形状类,实现该形状周长和面积的计算*/
public abstract class Shape
{
        public abstract double perimeter();//计算周长,抽象方法
        public abstract double area();//计算面积,抽象方法
}

Shape类为抽象类,定义了两个抽象方法。就只是提供一个方法名,而不包含任何实现代码,需要在子类中重写。包含抽象方法的类称为抽象类。

/*矩形类,实现矩形周长和面积的计算*/
public class Rectangle extends Shape
{
        int a;
        int b;

public Rectangle(int x, int y)
{
        a = x;
        b = y;
}

public double perimeter()
{
        return 2*(a+b);
}

public double area()
{
        return a*b;
}
}
Rectangle 类定义了两个私有成员变量,分别表示长和宽,重写覆盖了基类shape的求周长和面积的方法

/*正方形类,实现正方形周长和面积的方法*/
public class square extends rectangle
{

public square(int x, int y)
{
        super(x,y);
}

public double perimeter()
{
        return 4*a;
}

public double area()
{
        return a*a;
}
}
Square类定义了一个私有成员变量表示边长,重写覆盖了父类rectangle的求周长和面积的方法。

/*圆形类,实现圆形周长和面积的计算*/
public class circle extends shape
{
        private int r;
       
        public circle(int x)
        {
                r = x;
        }

        public double perimeter()
        {
                return 2*3.14*r;
        }

        public double area()
        {
                return 3.14*r*r;
        }
}
Circle类定义了一个私有成员变量表示半径,重写了覆盖父类shape的求周长和面积的方法

分析完以上四个类之后,就来分步骤对他们进行测试

1.划分类的优先级

         在单元测试阶段,如果时间允许的话,可以不测试所有的类,但是一定要测试上层的关键类。可以将系统中所有的类按照复杂程度和使用的频率划分一下优先级,比如一个类的功能相对来说比较复杂,或者该类是一个基类,被其他很多类继承或者调用,那么就一定要优先测试这种类。

         假设一个系统中一共有四个类。类A~D。其中B和C都继承自A类,类D和类A是平行的,但是类D调用类A中的属性或是方法。那么就先测试类A


可见,shape类是所有类的基类,被其他类所继承,理论上来说应该优先测试,但是在该程序中shape类是一个抽象类,其中的方法没有具体的实现细节,所以只需要检查shape的成员变量和方法设计是否合理即可,重点应该放在rectangle和circle类上面



2.对被测试的方法进行静态分析

静态分析的重点是:

                检查类的结构是否合理

                Public private protect关键字设置是否合理,一般成员变量设置为私有成员变量,不允许其他类访问,构造函数设置为公有public

                检查类中的成员变量和方法设计是否合理,有无缺少或者多余的情况。

                检查程序是否符合相应的编码规范



3.对被测试类设计测试用例

在静态分析结束之后,就可以对该程序设计测试用例。在这些类中,计算参数都是通过构造函数获得的,只需要修改构造函数的参数即可。比如在rectangle类中,可以构造一下测试用例(1,1),(1.2,3.4),(a,b),(,)



4.构造测试驱动程序

设计完测试用例后,还需要构造测试驱动程序,也叫测试驱动框架。进行动态测试。Mian函数就是一种测试驱动程序,比如要测试rectangle类,可以在rectangle类中添加如下代码

public class Rectangle extends Shape
{
        int a;
        int b;

public Rectangle(int x, int y)
{
        a = x;
        b = y;
}

public double perimeter()
{
        return 2*(a+b);
}

public double area()
{
        return a*b;
}

public  static void main(String []args)
{       
        Rectangle rect1 = new Rectangle(1,1);
        Rectangle rect2 = new Rectangle(1.2,3.4);

        Rectangle rect3 = new Rectangle(a,b);
        Rectangle rect4 = new Rectangle(,);

        System.out.println(rect1.perimeter());
        System.out.println(rect1.area());

        System.out.println(rect2.perimeter());
        System.out.println(rect2.area());


        System.out.println(rect3.perimeter());
        System.out.println(rect3.area());


        System.out.println(rect4.perimeter());
        System.out.println(rect4.area());

}

}
直接编译不通过


---------------------
【转载,仅作分享,侵删】
作者:若海音符
原文:https://blog.csdn.net/Chenyt01/article/details/51850892
版权声明:本文为博主原创文章,转载请附上博文链接!

1 个回复

倒序浏览
奈斯,感谢分享!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马