有很多重构问题可能已经有人回答了。然而,我决定问自己的问题。我在下面的代码片段中将 Thread.sleep(1000) 重构为 countdownlatch 时遇到问题。在参加软件测试类(class)时,我看到一篇关于“测试气味真的有害吗:实证研究”的论文,我想了解有关该主题领域的更多信息。谁能帮帮我吗?
try (Socket client = new Socket("localhost", connector.getLocalPort()))
{
OutputStream output = client.getOutputStream();
for (ByteBuffer buffer : lease.getByteBuffers())
{
output.write(BufferUtil.toArray(buffer));
}
Parser parser = new Parser(byteBufferPool, new Parser.Listener.Adapter()
{
@Override
public void onHeaders(HeadersFrame frame)
{
try
{
// Close the connection just after
// receiving the response headers.
client.close();
closeLatch.countDown();
}
catch (IOException x)
{
throw new RuntimeIOException(x);
}
}
}, 4096, 8192);
parseResponse(client, parser);
// We need to give some time to the server to receive and process the TCP FIN.
Thread.sleep(1000);
Session session = sessionRef.get();
Assert.assertTrue(session.isClosed());
Assert.assertTrue(((HTTP2Session)session).isDisconnected());
}
最佳答案
恐怕在任何测试级别都无法避免等待。因为您无法知道被测系统何时会响应(有时甚至不会响应)。但您可以求助Explicit wait UI 测试中使用的。如果您不熟悉这个概念 - 显式等待是仅限于特定响应的智能等待。使用显式等待,您基本上是在告诉测试,在放弃之前最多需要等待 X 个单位(假设 50 毫秒)的时间。
针对完整答案 - 您还可以创建 Worker thread它将处理请求,一旦收到响应,将自动唤醒测试线程。
更新:
这里是Java example不 hibernate 测试多线程访问
@Test
public void concurrentAccessFromMultipleThreads() throws Exception {
final Counter counter = new Counter();
final CountDownLatch allThreadsComplete = #1
new CountDownLatch(threads); #1
final int callsPerThread = 100;
final Set values = new HashSet();
Runnable runnable = new Runnable() {
@Override
public void run() {
for (int i = 0; i < callsPerThread; i++) {
values.add(counter.getAndIncrement());
}
allThreadsComplete.countDown(); #2
}
};
int threads = 10;
for (int i = 0; i < threads; i++) {
new Thread(runnable).start();
}
allThreadsComplete.await(10, TimeUnit.SECONDS); #3
int expectedNoOfValues = threads * callsPerThread;
assertEquals(expectedNoOfValues, values.size());
}
关于java - 如何重构沉睡的蜗牛,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33723144/