`
hyw520110
  • 浏览: 221074 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

轻松构建和运行多线程的单元测试

    博客分类:
  • java
阅读更多

背景


并行程序

并行程序是指控制计算机系统中两个或多个分别包含一系列指令序列的操作同时执行的程序,是对处理机上多个操作、或者任务同时执行的一种“规划”。处理机在运行并行程序时将同时工作于同一程序的不同方面,同时控制和运行分别包含一系列指令的两个或多个操作。并行程序设计的主要目的是节省大型和复杂问题的解决时间。

并行程序设计技术的发展已有 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。

具体将分为下面三个步骤来介绍:测试环境配置、测试用例生成向导、测试用例的运行和结果收集。

测试环境配置

Unit Test for Multi-Thread 安装好之后,还需要一些简单的配置才能使用,具体步骤可以通过 Eclipse 环境里对项目的 Build Path 下添加 add libraries 设置完成,具体如下所示:


第一步 : 添加 JUnit 到项目 Build Path 中,使用版本为 JUnit 4.5 以上

图 1:右键单击项目,在 Build Path 菜单下选择 Add Libraries
图 1:右键单击项目,在 Build Path 菜单下选择 Add Libraries

图 2:选择 JUnit,单击 Next 进入下一页面
图 2:选择 JUnit,单击 Next 进入下一页面

图 3:选定 JUnit4,单击完成
图 3:选定 JUnit4,单击完成

第二步:类似地,添加 Unit Test for Multi-Thread library 到项目 Build Path 中

图 4: 选定 Unit Test for Multi-Thread,单击 Next 完成添加过程
图 4: 选定 Unit Test for Multi-Thread,单击 Next 完成添加过程

图 5:配置完成后的页面
图 5:配置完成后的页面

测试用例生成向导

Unit Test for Multi-Thread 为用户提供了测试用例生成向导,通过此向导,用户可以很方便地构建自己的多线程测试用例,具体使用过程如下:

1. 在 Eclipse 中,选择 File -> New -> Others,选定图中所示:Unit Test for Multi-Thread, 双击进入下一个界面


图 6:测试用例生成向导界面
Sample figure containing an image

2. 将你需要测试的程序类名填入对应位置,图中例子类名是 demo.CoverageDemo。点击 next,进入下一界面


图 7: 使用生成测试用例面板创建新的测试用例
Sample figure containing an image

3. 在 Methods List 栏目下面选择需要进行单元测试的方法;Threaded 栏目下面确定是否使用多线程的方式进行测试,选中为生成多线程,不选则为生成单线程测试用例;在标题为 Thread Numbers for launching the Threaded methods 的文本框中可以设置测试将使用的线程数目列表,图中所示,该单元测试会分别用 1、2、4、8、16、32 和 64 个线程执行需要并行测试的方法。


图 8:选择需要进行多线程测试的方法和设定测试线程数
Sample figure containing an image

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
Sample figure containing an image

和运行标准 JUnit 一样,运行 Unit Test for Multi-Thread 很简单,


图 10:测试结果无异常
Sample figure containing an image

测试通过时将会以绿色标识,


图 11:测试结果存存在 Errors 或 Failures
Sample figure containing an image

测试没有完全通过时将会以红色警告提示,


图 12:测试报出的失败信息
Sample figure containing an image

并生成错误或失败报告给出,整体风格和标准 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

关于下载方法的信息

 

参考资料

学习

讨论

 

分享到:
评论

相关推荐

    多线程测试(是多线程的测试,对学习多线程的朋友有用)

    在编程领域,多线程是一种常见的技术,它...总之,多线程测试是确保软件在并发环境中正确、高效运行的关键步骤。通过深入理解C#的多线程机制,并利用各种测试工具和方法,开发者可以构建出强大且可靠的多线程应用程序。

    Nunit单元测试视频(共六个视频)

    10. 多线程测试:NUnit支持多线程测试,可以并发运行测试,提高测试效率。 在Visual Studio中,可以安装NUnit扩展来方便地集成和运行NUnit测试。VS的测试探索器窗口会列出所有测试,并提供运行、调试和筛选测试的...

    C++11 多线程

    #### 十、多线程程序的测试和调试 - **并发测试**:并发测试是为了验证程序在多线程环境下的行为是否符合预期。这通常涉及到模拟不同的并发场景。 - **死锁检测**:检测并避免程序中的死锁情况是非常重要的,因为...

    labview AMC多线程框架模板学习研究

    我们将深入探讨LabVIEW如何利用AMC(Advanced Modular Control)框架来实现多线程编程,以及如何在LabVIEW 2017 32位环境中通过VIPM(VI Package Manager)进行相关组件的安装和使用。 AMC框架是LabVIEW社区中创建...

    Android多线程断点续传

    在Android开发中,多线程断点续传技术是一种提高应用程序性能和用户体验的重要手段,尤其在处理大文件下载时...通过理解和实践以上知识点,开发者可以构建出稳定、高效且用户体验良好的Android多线程断点续传下载功能。

    Junit单元测试(很经典)

    6. **并发测试**:使用`@Test.concurrent`(来自Junit Jupiter)或第三方库,可以进行并发测试,检验代码在多线程环境下的正确性。 综上所述,Junit作为一个强大的单元测试工具,不仅覆盖了基础的断言和异常测试,...

    单元测试工具nUnit2007

    2. **测试套件**:用户可以组织多个测试为一个测试套件,方便管理和运行一组相关的测试。 3. **测试框架集成**:nUnit可以轻松地与IDE(如Visual Studio)或其他构建工具(如NAnt或MSBuild)集成,实现自动化测试。...

    ThreadServer_多线程多任务

    在描述中提到,这个实例已经被测试过其稳定性,这意味着它可能包含了错误处理、同步机制以及资源管理,这些都是确保多线程系统可靠运行的关键要素。 在实现多线程时,开发者需要考虑以下几个关键知识点: 1. **...

    多线程控件 BMDThread.rar

    在编程领域,多线程技术是提升程序执行效率和用户体验的重要手段。BMDThread是一款专为简化多线程编程设计的控件,尤其适用于那些需要处理大量并发任务或者希望提高程序响应速度的应用。这款控件以其稳定性和易用性...

    多线程应用

    总之,MFC提供的多线程支持使得开发者能够在Windows平台上轻松地构建多任务应用程序。理解和掌握MFC中的线程管理,对于提升软件性能、优化用户体验以及解决复杂并发问题具有重要意义。通过实践和学习,我们可以更好...

    Go-dcrawl是一个简单但智能的多线程Web爬虫程序

    Go语言的并发模型基于goroutine和channel,非常适合构建高效的多线程爬虫,能够轻松处理大量并发请求,同时保持代码简洁易读。 二、dcrawl的特点 1. **多线程**:dcrawl利用Go的并发特性实现多线程爬取,可以同时...

    QNX下的多线程编程

    4. **测试和调试**:多线程程序的测试尤为重要,因为并发错误往往很难捕捉。 ##### 2.3 线程基本程序结构 一个典型的多线程程序通常包括以下几个部分: - **初始化线程**:使用`pthread_create()`函数创建新线程。 ...

    多线程DNS测试仪

    【多线程DNS测试仪】是一款专为网络诊断和性能评估设计的应用程序,它扩展了Charles Putney的DNS测试工具,引入了多线程技术,从而提高了查询速度和效率。这款工具特别适用于需要同时处理大量DNS请求的场景,如网络...

    INDY10 多线程通信中文支持

    通过多线程,服务器可以避免因为一个长时间运行的任务阻塞其他客户端的响应,从而提升整体性能和用户体验。 2. **中文支持**:在INDY10中,通信过程中显示中文字符时,不会出现乱码问题。这得益于其对Unicode编码的...

    PythonPySide6多线程艺术二维码生成器项目.zip

    该项目是基于Python编程语言和PySide6库构建的,旨在创建一个高效的、多线程的艺术二维码生成器。PySide6是Qt库的一个Python绑定,提供了丰富的图形用户界面(GUI)功能,支持跨平台开发。在本项目中,它被用于设计...

    proactive 多线程并发解决方案

    ### Proactive多线程并发解决方案知识点详解 #### 一、ProActive编程简介 ProActive作为一个开源中间件,专为并行、分布式以及多核计算设计。它提供了丰富的API和工具,帮助开发人员轻松地实现复杂任务的并行处理...

    pb多线程串口库(satserial)

    5. `test.pbt`:可能是测试项目的工程文件,包含了关于如何构建和运行测试应用的信息。 6. `test.pbw`:PowerBuilder工作区文件,定义了项目中的各种源文件和库之间的关系,帮助开发者管理和组织他们的代码。 总的...

    Java线程 学习

    - **单元测试与集成测试**:编写针对线程安全性的单元测试和集成测试,确保线程能够正确地协同工作。 #### 十、总结 通过上述内容的学习,我们可以了解到Java线程不仅可以提高程序的执行效率,还能改善用户体验。...

Global site tag (gtag.js) - Google Analytics