`

对多线程进行测试

    博客分类:
  • Test
阅读更多
在junit下, 很难对多线程的代码进行测试, 因此需要借助其他的方式, 比如Executor service框架. 最近要对一个监控类的输出情况写一个测试, 简单的跑一下输出格式是否跟预期一致.我这里借助了ThreadPoolExecutor+CompletionService. 即在结束前, 需要从线程池中拿到最后的执行结果. 我觉得多线程测试模式都应该是类似的, 备忘一下

public class MonitorHelperTest {
    private Worker[] workers;
    ExecutorService pool;
    CompletionService<Boolean> completionPool;
    List<Future<Boolean>> futures;
    static int count = 100;
    static int countPreThread = 1000;

    private static class Worker implements Callable<Boolean> {
        @Override
        public Boolean call() throws Exception {
            for (int i = 0; i < countPreThread; i++) {
                Action action = Action.values()[i % Action.values().length];
                doFoo(i, action);
            }
            return true;
        }

        private void doFoo(int i, Action action) {
            long begin = MonitorHelper.addFetchAndGetNow(action, 1);
            try {
                foo(i);
                MonitorHelper.addTime(action, begin);
                MonitorHelper.addSuccess(action);
            } catch (Exception e) {
                MonitorHelper.addFailure(action);
            }
        }

    }

    @Before
    public void before() {
        pool = Executors.newFixedThreadPool(count, new ThreadFactory() {
            @Override
            public Thread newThread(Runnable r) {
                return new Thread(r, "worker");
            }
        });

        completionPool = new ExecutorCompletionService<Boolean>(pool);

        futures = new ArrayList<Future<Boolean>>(count);

        workers = new Worker[count];
        for (int i = 0; i < count; i++) {
            workers[i] = new Worker();
        }

    }

    @Test
    public void test() throws Exception {
        for (Worker worker : workers) {
            futures.add(completionPool.submit(worker));
        }

        for (int i = 0; i < count; i++) {
            completionPool.take().get();
        }
    }

    /**
     * @throws Exception 
     * 
     */
    private static void foo(int i) throws Exception {
        if (i % 3 == 0) {
            TimeUnit.MILLISECONDS.sleep(50);
            throw new Exception();
        } else {
            TimeUnit.MILLISECONDS.sleep(100);
        }
    }
}
分享到:
评论

相关推荐

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

    在进行多线程测试时,我们可能会关注以下方面: 1. 性能测试:测量不同线程数量对程序整体性能的影响。 2. 线程安全测试:检查代码是否正确地处理了多线程环境下的数据访问。 3. 资源消耗测试:分析多线程运行时...

    WEBAPI多线程并发测试工具

    标题"WEBAPI多线程并发测试工具"指出,这是一个专门针对Web API进行多线程并发测试的工具。Web API通常指的是应用程序接口,它们允许不同的服务之间进行通信,以实现数据交换和功能整合。多线程并发测试则是验证在多...

    多线程测试代码多线程测试代码

    在`mthread`这个压缩包中,可能包含了使用上述技术编写的测试代码示例,你可以通过查看和运行这些代码来更好地理解和学习多线程编程。 总的来说,多线程编程是现代软件开发中的关键技能,无论是在Win32 API、C运行...

    多线程性能测试工具(服务器压力测试)

    一、多线程测试 多线程是指在一个进程中同时执行多个独立的线程,以提高程序的执行效率和响应速度。在测试环境中,我们关注的是线程间的同步、竞争条件、死锁等问题,以及多线程环境下程序的稳定性和性能。这包括: ...

    JUNIT多线程测试

    本篇将深入探讨如何在JUnit中进行多线程测试,以及它的重要性。 首先,理解为什么需要进行多线程测试。在多线程环境中,不同的线程可能同时访问共享资源,这可能导致竞态条件、死锁或数据不一致等问题。因此,我们...

    delphi7 多线程测试(40个线程)

    本主题聚焦于Delphi 7中实现的多线程测试,特别是涉及40个并发线程的情况。Delphi是Embarcadero开发的一款集成开发环境(IDE),它以其高效的Pascal方言——Object Pascal,以及丰富的组件库闻名,适用于创建Windows...

    JAVA多线程测试工具

    首先,Java多线程测试工具能够模拟大量并发用户对应用程序进行访问,这对于评估和优化系统在高负载情况下的性能至关重要。在互联网时代,服务的稳定性和响应速度直接影响用户体验,因此开发者需要确保系统在面对大...

    QT+OPENGL 多线程测试

    QT+OpenGL多线程测试是将高性能图形渲染与Qt框架结合的一种技术应用,它通过利用多线程的优势来提升程序的运行效率。在本项目中,开发者采用了2D纹理贴图的方法,使得图像处理和显示更为高效。接下来,我们将深入...

    C#多线程测试程序

    这个名为"C#多线程测试程序"的示例项目,旨在帮助开发者更深入地理解C#中如何创建和管理多线程。下面我们将详细探讨C#多线程的相关知识点。 首先,我们要了解什么是线程。线程是操作系统分配CPU时间的基本单位,每...

    多线程测试程序

    总的来说,多线程测试程序通过`WaitForSingleObject`和`WaitForMultipleObjects`等API,不仅测试了线程同步的实现,还为理解和优化多线程应用提供了一个实际的平台。对于想要深入学习和提升多线程编程技能的开发者来...

    Qt多线程测试代码

    标题"Qt多线程测试代码"暗示了我们将探讨如何在Qt中使用多线程来执行耗时任务,以避免阻塞主线程导致用户界面(UI)无响应。在实际的软件开发中,这通常是提高用户体验的关键策略之一。 描述中提到,"Qt多线程多用于...

    现代多线程 JAVA和c++多线程实现 测试和调试

    本资源主要探讨了如何在JAVA和C++中实现多线程,以及相关的测试和调试技术。 在JAVA中,多线程的实现主要依赖于`Thread`类和`Runnable`接口。开发者可以通过直接继承`Thread`类或实现`Runnable`接口来创建新的线程...

    Python自动化多线程测试-单线程/多线程

    本文将深入探讨如何利用Python进行自动化多线程测试,以及如何在单线程和多线程环境中实现网页登录功能,包括账号密码的自动输入以及邮箱验证码的获取与验证。 首先,让我们了解单线程测试。在Python中,`threading...

    多线程测试

    在“Thread_test_plus”这个压缩包文件中,可能包含了用于测试多线程实现的代码示例。通过分析这些代码,我们可以学习如何在实际应用中创建、管理和同步线程,例如使用Java的`Thread`类、`ExecutorService`或者C++的...

    java多线程测试实例

    以下是对"java多线程测试实例"的详细解析: 1. **线程的创建方式** - 实现`Runnable`接口:创建一个类实现`Runnable`接口,然后将其实例传递给`Thread`类的构造函数创建线程。 - 继承`Thread`类:创建一个类直接...

    多线程,runtime测试demo

    在这个"多线程测试"Demo中,我们可以期待看到以下方面的内容: 1. **线程同步与通信**:可能会包含`synchronized`关键字、`wait()`, `notify()`, `notifyAll()`方法的使用,这些是Java中实现线程间同步和通信的基础...

    testHttp_多线程压力测试_压力测试_

    "testHttp_多线程压力测试_压力测试_"这个标题暗示我们将探讨如何使用Python进行HTTP接口的压力测试,特别是利用多线程和多进程技术来模拟大量并发请求。 首先,让我们了解什么是多线程和多进程。在计算机科学中,...

    有关Junit和多线程测试的问题

    在使用GroboUtils进行多线程测试时,开发者需要注意以下几点: 1. 设计测试:明确测试目标,确保测试覆盖到多线程交互的关键路径。 2. 使用适当的同步机制:根据需要使用GroboUtils提供的同步工具,避免死锁和竞态...

    Java多线程测试程序,

    在本项目中,“Java多线程测试程序”利用了这一特性,结合图形用户界面(GUI)框架JFrame,实现了企鹅在界面上的动态移动效果。 首先,我们来深入理解Java多线程。在Java中,每个运行的程序都有一个主线程,而多...

Global site tag (gtag.js) - Google Analytics