Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何为多线程支持添加测试?_Java_Multithreading_Testing - Fatal编程技术网

Java 如何为多线程支持添加测试?

Java 如何为多线程支持添加测试?,java,multithreading,testing,Java,Multithreading,Testing,我有一个Java服务,现在将以批处理模式执行。服务中添加了多线程支持,因此对于每个批处理请求,都会有一个线程池专门用于执行批处理。问题是我如何测试这一点?我在服务的线程版本下通过了功能测试,但不知何故,我觉得必须有一个习惯用法来测试它 真的没有一个“好”的方法来做到这一点。我建议最好的方法是TestNG,它允许您对测试方法进行注释,并使它们在n个线程中并发执行。例如: @Test(invocationCount=10, threadPool=10) public void testSomethi

我有一个Java服务,现在将以批处理模式执行。服务中添加了多线程支持,因此对于每个批处理请求,都会有一个线程池专门用于执行批处理。问题是我如何测试这一点?我在服务的线程版本下通过了功能测试,但不知何故,我觉得必须有一个习惯用法来测试它

真的没有一个“好”的方法来做到这一点。我建议最好的方法是TestNG,它允许您对测试方法进行注释,并使它们在n个线程中并发执行。例如:

@Test(invocationCount=10, threadPool=10)
public void testSomethingConcurrently() {
    ...
}
我的TestNG知识充其量是生锈的,但我认为应该同时调用
testsomething
方法10次。这是对代码运行多线程测试的一种很好的声明方式

当然,您可以在JUnit中通过在循环中手动生成线程来执行类似的操作,但这非常难看,而且很难处理。我不得不为我正在做的一个项目这样做一次;这些测试是一场噩梦,因为它们的失败并不总是可重复的


由于并发测试的不确定性,它很难进行,并且容易受到挫折。这就是为什么现在有如此大的推动力来使用更好的并发抽象,这些抽象更容易“推理”并说服自己正确性。

我同意Daniel的观点,并发测试确实非常困难

我没有并发测试的解决方案,但是当我想测试涉及多线程的代码时,我会告诉你我该怎么做。 我的大部分测试都是使用JUnit和JMock完成的。由于JMock不能很好地处理多个线程,因此我使用了JMock的扩展,它提供了Executor和ScheduledExecutorService的同步版本。这些允许我测试目标代码,以便在单个线程中由多个线程运行,同时我还能够控制执行流。正如我之前所说,这并不测试并发性。它只以单线程的方式检查代码的行为,但它减少了切换到多线程执行器时出现的错误数量


无论如何,我建议使用新的Java并发API。它使事情变得更加简单。

通常,使多线程应用程序崩溃的是时间问题。我怀疑,要在完整的多线程环境中执行单元测试,需要对代码库进行巨大的更改

不过,您可能能够做的是单独测试线程池的实现

通过用测试代码替换线程体,您应该能够构造锁定和资源使用的病态条件

然后,在单线程环境中对功能元素进行单元测试,您可以忽略计时

虽然这并不完美,但它确实保证了可重复性,这对于单元测试非常重要。(正如丹尼尔·斯皮瓦克的回答中提到的)

我使用了

    @Test(threadPoolSize = 100, invocationCount = 100)
    @DataProvider(parallel = true)
并行执行100个线程100次