Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4133187
  • 博文数量: 70
  • 博客积分: 5010
  • 博客等级: 大校
  • 技术积分: 1400
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-27 15:06
文章存档

2011年(2)

2010年(23)

2009年(21)

2008年(24)

我的朋友

分类: 项目管理

2010-10-14 15:47:53

目前白盒测试的测试工具有许多种,现主要介绍Purify和Junit两种。
Purify:
 先补充一点内存泄漏的错误认识,认为泄漏的内存在程序退出后操作系统不能回收的认识是错误的,只要程序退出操作系统会回收一切它给程序分配的资源,一般操作系统都是用伙伴系统管理内存分配,每块分配出去的内存都是拥有操作系统的标记的,只要使用该块内存的程序退出,就能回收分配给程序的内存。内存泄漏最大的问题就是不断吞噬操作系统内存,如果程序一直运行最后可能导致操作系统再无内存可分配。
Rational Purify for Windows 能自动找出Visual C/C++和Java 代码中与内存有关( 如内存错误、内存泄漏等)的错误,确保整个应用程序的质量和可靠性。
用构件进行软件开发时,找出诸如内存未初始化、内存泄漏和内存覆盖等编程错误是特别困难的。必须对构件之间及构件内部的内存访问情况进行验证;使Purify 不但可以检查出编写的源代码中致命或破坏性的内存访问错误,而且还能检查出程序库中无权访问的源代码的错误。不论是否有权访问其源代码,Purify 都能检查Microsoft 构件的问题,包括ActiveX控件、COM/DCOM 构件、ODBC 构件、DLL 、第三方构件以及C++或Java 构件。
Rational Purify 除了能找出运行程序时发生的关键错误,还能告诉测试程序的代码覆盖率。如果安装了Rational PureCoverage,Purify 则可以自动收集每次运行的代码覆盖数据,并报告已检查过的代码数量。将Purify 的错误检测和 PureCoverage 的代码覆盖分析结合在一起。
Purify能检测的错误代码:
•ActiveX (OLE/OCX)控件
•COM 对象
•ODBC 构件
•Java 构件、applet 、类文件、JAR 文件
•DLL —包括MFC 和Microsoft Office插件
•Visual C/C++源代码
•Visual Basic应用程序内嵌的VisualC/C++构件
•第三方和系统DLL
•支持com 调用的应用程序中的所有Visual C/C++构件
Purify能检查的错误类型:
较常见的“数组越界”、“堆栈越界”、“空闲内存读取”、“非法指针读取”、“空指针读取”以及“未初始化内存读取”等内存问题都能检测,具体分为以下几大类:
•堆阵相关错误(例如:未初始化内存的读取和复制错误,以及数组越界读写错误)
•堆栈相关错误(例如:未初始化内存的读取和复制错误,以及堆栈越界读写错误)
•垃圾内存收集—Java 代码中相关的内存管理问题
•COM 相关错误(例如:COM API/接口调用失败)
•指针错误(例如:无效指针和空指针的读写错误)
•内存使用错误(例如:释放内存的读写错误、内存泄漏和释放内存匹配错误)
•Windows API 相关错误(例如:Windows API 函数参数错误和返回值错误)
•句柄错误(例如:泄漏和句柄使用错误)
JUnit:
JUnit 是 Java 社区中知名度最高的单元测试工具。麻雀虽小,五脏俱全。JUnit 设计的非常小巧,但是功能却非常强大。
下面首先用一段代码来演示JUnit3.8.1的快速使用,以便熟悉JUnit的原理:
1.首先安装JUnit插件,然后我们在Eclipse的项目中创建一个待测试的类Hello.java,代码如下:
public class Hello {
    public int abs(int num)
    {
        return num>0?num:-num;
    }
    public double division(int a,int b)
    {
        return a/b;
    }
}
2.右击该类,选择 新建->JUnit测试用例,选择JUnit3.8.1,setUp和tearDown方法,点击下一步,选择需要测试的方法,JUnit会自动生成测试的代码框架,手动添加自己的测试代码后如下:
import junit.framework.TestCase;
public class HelloTest extends TestCase {
    private Hello hello;
    public HelloTest()
    {
        super();
        System.out.println("a new test instance...");
    }
    //测试前JUnit会调用setUp()建立和初始化测试环境
    protected void setUp() throws Exception {
        super.setUp();                                    //注意:在Junit3.8.1中这里要调用父类的setUp()
        hello=new Hello();
        System.out.println("call before test...");
    }
    //测试完成后JUnit会调用tearDown()清理资源,如释放打开的文件,关闭数据库连接等等
    protected void tearDown() throws Exception {
        super.tearDown();                                //注意:在Junit3.8.1中这里要调用父类的tearDown()
        System.out.println("call after test... ");
    }
    //测试Hello类中的abs函数
    public void testAbs() {
        System.out.println("test the method abs()");
        assertEquals(16, hello.abs(16));
        assertEquals(11, hello.abs(-10));//在这里,会出现故障,应该把左边的参数改为10
        assertEquals(0, hello.abs(0));
       
    }
    //测试Hello类中的division函数
    public void testDivision() {
        System.out.println("test the method division()");
        assertEquals(3D, hello.division(6, 2));
        assertEquals(6D, hello.division(6, 1));
        assertEquals(0D, hello.division(6, 0));//在这里,会出现错误,java.lang.ArithmeticException: /by zero
       
    }
}
3.运行该测试类即可输出如下:
a new test instance...
a new test instance...
call before test...
test the method abs()
call after test...
call before test...
test the method division()
call after test...
阅读(816) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~