【IT168 文档】
前言: 随着多核处理器成为主流,开发并行程序随之成为一种必然要求。但是我们都知道并行程序存在着很大的不确定性,这使得开发和测试并行程序有一定的难度,因此对于并行程序的单元测试变得尤为重要。但是,创建多线程的单元测试并不容易,测试需要考虑测试线程间的同步,数据共享等。针对 Java 并行程序的测试,结合扩展 JUnit 的多线程测试工具,本文介绍了一种在集成开发环境中,创建符合用户要求的多线程单元测试用例的完整过程,使得用户只用关心测试本身的逻辑和结果,而不用去了解测试用例并行执行的琐碎细节,从而将大大方便并行程序员运行并行测试用例,提高并行程序的开发效率和质量。
背景
并行程序
并行程序是指控制计算机系统中两个或多个分别包含一系列指令序列的操作同时执行的程序,是对处理机上多个操作、或者任务同时执行的一种“规划”。处理机在运行并行程序时将同时工作于同一程序的不同方面,同时控制和运行分别包含一系列指令的两个或多个操作。并行程序设计的主要目的是节省大型和复杂问题的解决时间。
并行程序设计技术的发展已有 20 多年的历史了,高性能并行计算机系统正在进入越来越多的应用领域。但是与硬件的发展相比,并行软件的发展则显得有些滞后,影响了硬件效率的发挥,限制了并行机系统的广泛应用,因此并行程序的开发与研究也越来越多深入到现在软件的开发过程中。相比较串行程序的开发,当前并行程序的开发与研究存在很多的困难,其中主要是因为缺乏有效的并行程序设计方法和工具,使得编写正确并行程序、理解并行程序的行为、调试和优化并行程序的性能都很困难。
单元测试
单元测试是对程序代码单元进行函数级的测试,是完成对最小软件设计单元的验证工作。
单元测试贯穿于软件开发的整个过程中,对于保证软件质量的重要性不言而喻。作为一种白盒测试,单元测试很多时候是与开发同时进行的。关于单元测试的工具也很多,其中包含著名的 xUnit 系列。本文将涉及到的多线程单元测试工具就是从 Java 单元测试工具 JUnit 中扩展而来的。
扩展 JUnit 实现多线程单元测试
对于 Java 来说,JUnit 是备受开发人员喜爱的单元测试工具。它甚至还影响了其他语言的测试框架。这点,我们从繁多的 xUnit 框架就可以看出来。随着多核时代的到来,开发人员将需要进行越来越多的并行程序测试。得益于 JUnit 的可扩展性,我们可以使用 Annotation 让 JUnit 更好地支持并行测试。
得益于 JUnit 良好的可扩展性,扩展 JUnit 实现多线程单元测试这里主要是通过生成实现多线程测试过程中所需 Annotation 的定义并实现运行自定义测试逻辑来实现的。
关于扩展 JUnit 实现多线程单元测试,我们在另一篇文章《扩展 JUnit 测试并行程序》里有专门的介绍,下面我们将主要针对这一扩展说明如何在集成开发环境中创建和运行测试用例。
在集成开发环境中安装并行单元测试插件
在使用集成开发环境创建多线程的测试用例之前,首先需要在环境中安装扩展 JUnit 的插件,在本文中我们主要介绍名为 Unit Test for Multi-Thread 的扩展 JUnit 在集成开发环境 Eclipse 下的安装与使用。
Unit Test for Multi-Thread 是 IBM 多核软件开发工具 Multicore SDK 下开发的一款用于并行开发中构建多线程测试用例以此来对代码进行单元测试的插件,其是伴随 Multicore SDK 一起发布的,我们可以通过 eclipse 插件安装的方式来安装它。需要注意的是 Unit Test for Multi-Thread 目前仅支持 Eclipse3.5.x ,其安装过程简述如下:
首先运行开发工具 Eclipse3.5.x,在打开界面上点击‘Help’>‘Install New Software...’>‘Add... ’,然后会跳出一个‘Add Site’对话框,在其上面的‘Location’文本框里添加将要安装插件的地址:http://awwebx04.alphaworks.ibm.com/ettktechnologies/updates,点击‘OK’,等待加载,选择‘Multicore SDK’下的‘Unit Test for Multi-Thread’,点击‘Next’进行安装即可。
在集成开发环境中创建测试用例
下面将介绍在集成开发环境 Eclipse 中创建多线程测试用例的过程,首先需要安装上文提到的 Eclipse 插件 Unit Test For Multi-Thread。
具体将分为下面三个步骤来介绍:测试环境配置、测试用例生成向导、测试用例的运行和结果收集。
在集成开发环境中创建测试用例
下面将介绍在集成开发环境 Eclipse 中创建多线程测试用例的过程,首先需要安装上文提到的 Eclipse 插件 Unit Test For Multi-Thread。
具体将分为下面三个步骤来介绍:测试环境配置、测试用例生成向导、测试用例的运行和结果收集。
测试环境配置
Unit Test for Multi-Thread 安装好之后,还需要一些简单的配置才能使用,具体步骤可以通过 Eclipse 环境里对项目的 Build Path 下添加 add libraries 设置完成,具体如下所示:
第一步 : 添加 JUnit 到项目 Build Path 中,使用版本为 JUnit 4.5 以上
图 1:右键单击项目,在 Build Path 菜单下选择 Add Libraries
图 2:选择 JUnit,单击 Next 进入下一页面
图 3:选定 JUnit4,单击完成
第二步:类似地,添加 Unit Test for Multi-Thread library 到项目 Build Path 中
图 4: 选定 Unit Test for Multi-Thread,单击 Next 完成添加过程
图 5:配置完成后的页面
测试用例生成向导
Unit Test for Multi-Thread 为用户提供了测试用例生成向导,通过此向导,用户可以很方便地构建自己的多线程测试用例,具体使用过程如下:
1. 在 Eclipse 中,选择 File -> New -> Others,选定图中所示:Unit Test for Multi-Thread, 双击进入下一个界面
图 6:测试用例生成向导界面
2. 将你需要测试的程序类名填入对应位置,图中例子类名是 demo.CoverageDemo。点击 next,进入下一界面
图 7: 使用生成测试用例面板创建新的测试用例
3. 在 Methods List 栏目下面选择需要进行单元测试的方法;Threaded 栏目下面确定是否使用多线程的方式进行测试,选中为生成多线程,不选则为生成单线程测试用例;在标题为 Thread Numbers for launching the Threaded methods 的文本框中可以设置测试将使用的线程数目列表,图中所示,该单元测试会分别用 1、2、4、8、16、32 和 64 个线程执行需要并行测试的方法。
图 8:选择需要进行多线程测试的方法和设定测试线程数
Unit Test for Multi-Thread 将根据设置向导自动生成测试用例的完整代码框架,用户可根据被测试代码直接在此框架下添加所需测试的内容,以此提高编写测试用例的效率。
自动生成的测试用例形式如下:
import static org.junit.Assert.*;
import org.amino.util.msdk.unit.Parallelized;
import org.amino.util.msdk.unit.annotation.CheckFor;
import org.amino.util.msdk.unit.annotation.InitFor;
import org.amino.util.msdk.unit.annotation.ParallelSetting;
import org.amino.util.msdk.unit.annotation.Threaded;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.runner.RunWith;
@RunWith(Parallelized.class)
@ParallelSetting(threadNumber = { 1, 2, 4, 8, 16, 32, 64 })
public class TestUnitExtensionSample1 {
@BeforeClass
public static void setUpBeforeClass() throws Exception {}
@AfterClass
public static void tearDownAfterClass() throws Exception {}
@Before
public void setUp() throws Exception {}
@After
public void tearDown() throws Exception {}
@InitFor("testAdd")
public void initfortestAdd(int threadNum){}
@CheckFor("testAdd")
public void checkfortestAdd(int threadNum){}
@Threaded
public void testAdd(int rank, int threadNum){
}
}
测试用例的运行和结果收集
Unit Test For Multi-Thread 从 JUnit 扩展而来,保留了 JUnit 运行和结果显示的方式,其运行方式和结果显示如下所示:
图 9:运行 Unit Test For Multi-Thread
和运行标准 JUnit 一样,运行 Unit Test for Multi-Thread 很简单,
图 10:测试结果无异常
测试通过时将会以绿色标识,
图 11:测试结果存存在 Errors 或 Failures
测试没有完全通过时将会以红色警告提示,
图 12:测试报出的失败信息
并生成错误或失败报告给出,整体风格和标准 JUnit 一致,但是其具备独有的生成多线程的测试用例和单元测试的内容,对于熟悉 JUnit 的用户来说使用此来进行并行程序的单元测试将会很方便。
结论
随着多核处理器成为主流,并发程序越来越多的要求运用到软件开发和研究中,开发人员不可避免地需要开发和测试并行程序,本文介绍了一种在集成开发环境 Eclipse 中,创建符合用户要求的多线程单元测试用例的过程,这样开发者可以只关心测试本身的逻辑和结果,而不用去了解测试用例并行执行的琐碎细节,从而大大减少开发人员手工创建线程和同步来进行测试的繁琐工作,提高开发效率。