对于给定的方法,我想编写测试用例来查看当多个线程同时运行时它的行为。可能听起来很愚蠢,但只是想知道是否有可能创建任何这样的场景?
问问题
7172 次
3 回答
2
这就是我最近在一些代码中实现这一点的方式:
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import static org.junit.Assert.*;
public class UtilTest
{
private final static int TEST_THREAD_COUNT = 10;
private volatile int threadsRun = 0;
private volatile List<String> nonUniqueIds = new ArrayList<>();
@Test
public void testUniqueIdGeneration()
{
final ExecutorService pool = Executors.newFixedThreadPool(TEST_THREAD_COUNT);
Runnable r = new Runnable()
{
@Override
public void run()
{
List<String> doneIds = new ArrayList<>();
for (int i = 1; i <= 100; i++)
{
String id = Util.generateId();
if (doneIds.contains(id))
{
nonUniqueIds.add(id);
break;
}
doneIds.add(id);
}
threadsRun++;
if (threadsRun >= TEST_THREAD_COUNT)
pool.shutdown();
}
};
for (int i = 0; i < TEST_THREAD_COUNT; i++)
{
pool.submit(r);
}
while (! pool.isShutdown())
{
//stay alive
}
if (nonUniqueIds.isEmpty() )
return;
for (String id: nonUniqueIds)
{
System.out.println("Non unique id: " + id);
}
assertTrue("Non unique ids found", false);
}
}
于 2014-08-11T19:41:18.540 回答
1
也将您的单元测试代码视为一个线程。当我尝试在多线程环境中测试某些东西时,一般来说我做了以下事情:
- 我在单元测试线程中手动启动了工作线程(包含测试方法和其他线程的线程),并且
- 让单元测试线程休眠给定的时间,或者等待其他线程,然后我检查我的结果。
问题是,the unit test thread may not give up execution to the others
这就是为什么你必须以某种方式强迫它。您不能“直接”控制如何将处理器时间分配给线程,这就是为什么您必须启动它们并让它们“解决”问题的原因。
于 2013-09-02T21:34:53.197 回答
1
你实际上可以在测试用例中启动你的线程,但我很确定它不会做你想要的。执行是不确定的。
似乎有一些并发测试框架可能会有所帮助。他们使用特殊技术来控制线程的行为,从而导致竞争条件和其他不好的事情。
我做了一个快速检查,发现MultithreadedTC。
也许这会让你走上正确的轨道。
于 2013-09-02T21:38:14.687 回答