java多线程

  • 格式:pdf
  • 大小:25.81 KB
  • 文档页数:3

收稿日期:2005-09-09;修返日期:2005-11-12基金项目:国家自然科学基金资助项目(69873040);河南省自然科学基金资助项目(0511011000);河南省高校青年骨干教师资助项目;河南省教育厅自然科学基础研究项目(2003520260);河南工业大学基础研究项目(0402003)Java 多线程测试策略及测试方法探讨*张雪萍1,2,鲍 丹2,王家耀1(1.解放军信息工程大学测绘学院,河南郑州450052; 2.河南工业大学计算机科学系,河南郑州450052)摘 要:在分析J ava 多线程特性的基础上,探讨了J ava 多线程的测试策略及测试方法,提出J ava 多线程测试由类测试、集成模块测试和系统测试三个层次组成,并讨论了多线程的继承测试、同步测试以及效率测试。

关键词:J ava 多线程;测试策略;继承测试;同步测试;效率测试中图法分类号:TP311 文献标识码: A 文章编号:1001-3695(2006)11-0012-03Resea rch on Testing St ra tegies and Met hods for J ava M ultit hreadZHAN G Xue-ping 1,2,BAO Dan 2,WAN G J ia-ya o1(1.Institute of Sur veying &M app ing,PLA Infor mation E ngineering University,Zhengzhou H enan 450052,China;2.Dept.of Computer Sci-ence,Henan Univer sity of Technology,Zhengzhou H enan 450052,China)Abst ract :Ba sed on analyz ing the feat ures of J ava m ultithrea d,t est ing stra tegies a nd m ethods a re dis cussed in this paper.J a-va m ult it hread testing is consis t of cla ss t est ing,int egration block t est ing and s yst emtes ting.The m a in test ing m ethods for J ava m ultithrea d are proposed,such as inherit t est ing,synchroniza tion testing and synchroniz at ion efficiency tes ting.Key wo rds:J a va Multithrea d;Tes ting S t rat egies;Inherit Test ing;S y nchroniza tion Tes ting ;Efficiency Test ing 面向对象软件测试是面向对象开发方法不可缺少的一环,是保证软件质量、提高软件可靠性的关键。

近年来,随着J a va 语言的广泛应用,针对J ava 的软件测试已成为软件工程领域中的一个重要研究课题,国内外研究机构不断推出各种J a va 软件测试工具,如J unit[1],C actus,J Meter,S afepro /J av a 等。

J ava 的多线程机制使应用程序能够并行执行,而且同步机制保证了对共享数据的正确操作。

通过使用多线程,程序设计者可以分别用不同的线程完成特定的行为,而不需要采用全局的事件循环机制,这样就很容易实现网络上的实时交互行为。

多线程带来的最大好处是更好的交互性能和实时控制性能。

J ava 多线程广泛应用于网络,在当今的网络环境下,研究对于J ava 多线程的测试是很有必要的。

从现有公开发表的国内外文献来看,专门针对J av a 多线程软件测试的研究不多。

国内方艳等人在文献[2]中介绍了S a fepro/J a va 的多线程测试技术,其他深入、具体的研究还未见报道。

1 Java 多线程特点J ava 作为一种纯面向对象语言,其优越性是不言而喻的[3,4]。

1.1 Java 多线程继承由于J ava 引入了“包”的概念,从而使类的继承更加简便,线程的创建是一个最好的例子。

J av a 多线程的实现方法有两种:①通过Threa d 继承。

为创建一个线程,最简单的方法就是从Thread 类继承。

②通过Runnable 接口。

该方式主要是用来实现特殊功能,如复杂的多重继承功能等。

Runnable 接口的应用虽然提高了软件开发的灵活度,但是同时也是造成BU G 的根源之一[3,4]。

1.2 Java 多线程同步J av a 应用程序的多个线程共享同一进程的数据资源,多个用户线程在并发运行过程中可能同时访问具有敏感性的内容。

在J ava 中定义了线程同步的概念,实现对共享资源的一致性维护。

线程同步是多线程编程的一个非常重要的技术。

1.3 Java 多线程消息控制J av a 多线程的另外一个特点就是可以实现进程间的通信。

进程间的通信是以消息为形式的,如何进行消息的控制是多线程设计的一个重点。

1.4 Java 多线程流程控制J av a 线程之间的通信机制由线程同步和消息控制共同作用。

J av a 多线程流程控制中既涉及到了多线程继承的问题,又涉及到同步控制和消息控制[5]。

多线程流程控制方法有以下几个:(1)通过sleep()来实现J a va 多线程流程控制,可以用于多线程流程控制演示。

(2)通过int errupt()函数对J a va 多线程进行流程控制。

这种控制方法比sleep()函数要精确得多,但在用法上与sleep()函数不太相同。

(3)通过w ait()和notify()来进行流程控制。

wa it()方式与s leep()方式有相同之处,都是从线程内部对线程进行中断的;不同的是,它没有提供中断时间,其唤醒方式就是notify()和notifyAll()。

・21・计算机应用研究 2006年(4)通过join()来进行流程控制,join()方式结合了int er-rupt和sleep方式的优点。

在实际设计当中应注意使用join方式的时机,过多的join方式会打乱线程的流程。

2 Java多线程测试策略2.1层次划分对于传统程序设计语言书写的软件,软件测试人员普遍接受三个级别的测试,即单元测试、集成测试和系统测试。

对面向对象程序以及J ava多线程测试应当分为多少级别尚未达成共识。

M.D.S m ith和D.J.Robson认为面向对象的程序测试应当分为四个级别:①方法级,考查一个方法对数据进行的操作;②类级,考查封装在一个类中的方法与数据之间的相互作用;③簇级,考查一组协同操作的类之间的相互作用;④系统级,考查由所有类和主程序构成的整个系统。

P.C.J or Gensen和C.E ricks on认为面向对象的测试应该分为五个层次,即方法测试、方法/信件路径(MMPa th)测试、系统基本功能测试、线程测试、线程间相互作用测试。

其中方法测试对应于单元测试;方法/信件路径测试和系统基本功能测试对应于集成测试;线程测试与线程间相互作用测试对应于系统测试。

J ava作为一种面向对象语言,对它的测试自然继承了面向对象的类测试的特性,即最小的可测试单位是封装的类[1]。

因此,我们提出的测试策略中将对类层的测试作为单元测试,将J a va多线程测试划分为三个层次:J ava多线程类测试、J a va 多线程集成模块测试和J a va多线程系统测试。

J ava多线程测试的测试层划分如表1所示。

表1测试层的划分Java多线程测试面向对象软件测试Java多线程类测试类测试Java多线程类集成模块测试类集成测试Java多线程系统测试系统测试2.2Java多线程测试的内容及技术2.2.1 J ava多线程类测试J ava多线程类测试关注模块的算法细节和模块间流动的数据。

J ava是一种纯面向对象语言,所有模块之间的数据流动均是通过Int erface(实例化)来实现的。

在算法细节问题上,J a-va函数的调用基本都是通过继承Package中的父类得到的(官方Pa ckage包都是经过S un公司严格测试过的,虽然不能保证100%的完美,但考虑到测试效率问题,此处不再赘述对于其父类的测试)。

J ava多线程是依靠继承Threa d类或通过Runna-ble接口来实现的。

在实际应用中,Runna lbe接口使程序设计的灵活度大大提高,但这也是Bug的温床。

因此对J ava多线程的类测试重点应是方法的重载、类的继承、Runna lbe接口的测试。

J ava多线程类的测试最重要的部分是程序逻辑的测试。

由于J ava语言结构与编译顺序的关系,声明在前面的Cla ss不一定就是先执行的,所以在C la ss内经常出现一些陌生的对象或者变量。

为了不出现逻辑错误,在测试时应当将类中所涉及的所有对象、方法和变量(本类中的除外)列出其父类属性列表(其中包括其父类的名称,并判断是否为官方Packa ge中的类)及父类中所有可以调用的方法和变量。

同时,在J ava多线程类测试中,应当将定义了Runnable接口的父类或者块特别列出,并列出其父类的方法和变量。

2.2.2 J a va多线程集成模块测试面向对象软件的集成测试有两种不同的策略:①基于线程的测试(T hread-based Testing)。

集成对应系统的一个输入或事件所需的一组类,每个线程被集成并分别测试,应用回归测试以保证没有产生副作用。

②基于使用的测试(Use-bas ed Test ing)。

通过测试独立类开始构造系统,独立类测试完成后,依赖类被测试。

前面已经讨论J ava多线程的特点及其潜在的问题,为了便于对多线程的测试,在J a va多线程继承模块测试策略中主要采用基于线程的测试。

多线程继承模块测试主要针对多线程同步和多线程消息控制特点。

对于多线程同步的特点,在测试过程中必须纵览整个程序代码,作出线程内部流程图,列出线程中(包括Runna-ble接口)会引起变化的对象、方法和变量,并列出其中的同步部分,测试其中的同步部分是否均是本类中的内容。

对比表2各分量的数量、内容,并记录线程同步测试中各分量的值域,将所有与线程有关的类都进行上述的线程同步测试后,其中的结果以表3的形式列出。

列出相关联的类和线程,计算出总共的类个数(拥有线程的类的个数)和类中的线程数,并结合表2进行分析。

表2 同步测试类名1:对象2:方法3:变量4:接口线程同步测试1:对象2:方法3:变量4:接口表3 测试结果类/线程类1线程类2线程类3线程合计类1类2类3合计2.2.3 J av a多线程系统测试J av a虽然是单根继承的,但由于Runna ble接口的使用可以实现复杂的多重继承。