java - 如何重构沉睡的蜗牛

标签 java unit-testing refactoring

有很多重构问题可能已经有人回答了。然而,我决定问自己的问题。我在下面的代码片段中将 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/

相关文章:

java - 属性文件被卸载

unit-testing - 使用 vstest.console 和参数执行测试

javascript - 如何进一步重构 ctx.fillStyle 的列和行?

python - 重构以计算排序算法的运行时间 - python

java - 使用 lambda 表达式分割 csv 文件

java - 如果 hsqlbd 处于服务器模式,则无法在初始化数据库上创建模式

java - JPA 的 Mysql 中 ABS() 的替代方案

java - 无法读取 BroadcastReceiver 中的最后一条短信

c# - 检查类属性或方法是否声明为密封的

javascript - 如何对 Angular 1.5 组件中的函数进行单元测试