并行程序是指控制计算机系统中两个或多个分别包含一系列指令序列的操作同时执行的程序,是对处理机上多个操作、或者任务同时执行的一种“规划”。处理机在运行并行程序时将同时工作于同一程序的不同方面,同时控制和运行分别包含一系列指令的两个或多个操作。并行程序设计的主要目的是节省大型和复杂问题的解决时间。
并行程序设计技术的发展已有 20 多年的历史了,高性能并行计算机系统正在进入越来越多的应用领域。但是与硬件的发展相比,并行软件的发展则显得有些滞后,影响了硬件效率的发挥,限制了并行机系统的广泛应用,因此并行程序的开发与研究也越来越多深入到现在软件的开发过程中。相比较串行程序的开发,当前并行程序的开发与研究存在很多的困难,其中主要是因为缺乏有效的并行程序设计方法和工具,使得编写正确并行程序、理解并行程序的行为、调试和优化并行程序的性能都很困难。
单元测试是对程序代码单元进行函数级的测试,是完成对最小软件设计单元的验证工作。
单元测试贯穿于软件开发的整个过程中,对于保证软件质量的重要性不言而喻。作为一种白盒测试,单元测试很多时候是与开发同时进行的。关于单元测试的工具也很多,其中包含著名的 xUnit 系列。本文将涉及到的多线程单元测试工具就是从 Java 单元测试工具 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。
具体将分为下面三个步骤来介绍:测试环境配置、测试用例生成向导、测试用例的运行和结果收集。
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, 双击进入下一个界面
2. 将你需要测试的程序类名填入对应位置,图中例子类名是 demo.CoverageDemo。点击 next,进入下一界面
3. 在 Methods List 栏目下面选择需要进行单元测试的方法;Threaded 栏目下面确定是否使用多线程的方式进行测试,选中为生成多线程,不选则为生成单线程测试用例;在标题为 Thread Numbers for launching the Threaded methods 的文本框中可以设置测试将使用的线程数目列表,图中所示,该单元测试会分别用 1、2、4、8、16、32 和 64 个线程执行需要并行测试的方法。
Unit Test for Multi-Thread 将根据设置向导自动生成测试用例的完整代码框架,用户可根据被测试代码直接在此框架下添加所需测试的内容,以此提高编写测试用例的效率。
package test; 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){ } } |
以上测试用例代码中各个 Annotation 的详细说明可以参考 这里。
Unit Test For Multi-Thread 从 JUnit 扩展而来,保留了 JUnit 运行和结果显示的方式,其运行方式和结果显示如下所示:
图 9:运行 Unit Test For Multi-Thread
和运行标准 JUnit 一样,运行 Unit Test for Multi-Thread 很简单,
测试通过时将会以绿色标识,
图 11:测试结果存存在 Errors 或 Failures
测试没有完全通过时将会以红色警告提示,
并生成错误或失败报告给出,整体风格和标准 JUnit 一致,但是其具备独有的生成多线程的测试用例和单元测试的内容,对于熟悉 JUnit 的用户来说使用此来进行并行程序的单元测试将会很方便。
随着多核处理器成为主流,并发程序越来越多的要求运用到软件开发和研究中,开发人员不可避免地需要开发和测试并行程序,本文介绍了一种在集成开发环境 Eclipse 中,创建符合用户要求的多线程单元测试用例的过程,这样开发者可以只关心测试本身的逻辑和结果,而不用去了解测试用例并行执行的琐碎细节,从而大大减少开发人员手工创建线程和同步来进行测试的繁琐工作,提高开发效率。
<!-- CMA ID: 494090 --><!-- Site ID: 10 --><!-- XSLT stylesheet used to transform this file: dw-article-6.0-beta.xsl -->
描述 | 名字 | 大小 | 下载方法 |
---|---|---|---|
本文中结果显示形式示例时用到的 Java 程序代码 | testMultiThread.zip | 10 KB | HTTP |
学习
- 如何安装 Unit Test for Multi-Thread。
- 阅读 developerWorks 文章:“扩展 JUnit 实现多线程单元测试”。
- 从 alphaWorks 上下载“多线程正确性分析工具”以检查程序中潜在的 deadlock 和 data race 错误。
- 从 SourceForge 下载文中 JUnit 并行测试扩展 的完整代码。
- 使用来自 IBM Haifa 实验的“ConTest”能更快的测试出并行相关的 Bug。
- p-unit:开源单元测试和性能测试框架。
- 技术书店:浏览关于这些和其他技术主题的图书。
- developerWorks Java 技术专区:数百篇关于 Java 编程各个方面的文章。
讨论
- 加入 developerWorks 社区。
- 查看 developerWorks 博客 的最新信息。