2017-06-27 144 views
0

我是vert.x的新手。我試圖運行一些基本的測試和基準等來評估框架(所以我可能做很多錯誤!)Vert.x異步測試

我感興趣的一件事是運行'控制器'級別測試的性能成本。我建立了一個應該重複啓動並拆除httpclient的測試。

@Repeat(100) 
@Test 
public void testMyApplication(TestContext context) { 

    final Async async = context.async(1); 
    vertx.createHttpClient().getNow(8080, "localhost", "/", 
      response -> { 
       response.handler(body -> { 
        context.assertTrue(body.toString().contains("Hello")); 
        context.assertEquals(200, response.statusCode()); 
        async.complete(); 
       }); 
      }); 
    async.awaitSuccess(); 
} 

然而,這有時會失敗。

SEVERE: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/127.0.0.1:8080 

什麼是一個更好的方式來啓動多個客戶端,並確保測試運行順序或一些控制並行?

回答

4

OK,

這裏發生的事情是,由於異步調用,那麼在若干情況下一個新的測試可以async.complete被調用之前啓動。因此,已經有一個測試服務器在端口8080上運行。

解決方法是在via config中使用傳遞端口,並在測試中使用隨機端口。

 server.requestHandler(router::accept) 
      .listen(
        config().getInteger("http.port", 8080), 
     ... 

而且測試變得

@Before 
public void setUp(TestContext context) throws Exception { 
    ServerSocket socket = new ServerSocket(0); 
    port = socket.getLocalPort(); 
    socket.close(); 

    DeploymentOptions options = new DeploymentOptions() 
      .setConfig(new JsonObject().put("http.port", port) 
      ); 
    vertx = Vertx.vertx(); 
    vertx.deployVerticle(HelloVerticle.class.getName(), options, 
      context.asyncAssertSuccess()); 
} 
... 

@Repeat(100) 
@Test 
public void testMyApplication(TestContext context) { 

    final Async async = context.async(); 
    vertx.createHttpClient().getNow(port, "localhost", "/", 
      response -> { 
       response.handler(body -> { 
        context.assertTrue(body.toString().contains("Hello")); 
        context.assertEquals(200, response.statusCode()); 
        async.complete(); 
       }); 
      }); 
} 

本博客文章幫助了很多http://vertx.io/blog/vert-x-application-configuration/

0

錯誤說Connection refused,這意味着沒有服務器在端口8080在您的測試情況下運行,你需要開始在端口8080

@RunWith(VertxUnitRunner.class) 
public class VertxText { 
    Vertx vertx; 
    HttpServer server; 

    @Before 
    public void before(TestContext context) { 
     vertx = Vertx.vertx(); 
     server = 
       vertx.createHttpServer().requestHandler(req -> req.response().end("Hello")). 
         listen(8080, context.asyncAssertSuccess()); 
    } 

    @After 
    public void after(TestContext context) { 
     vertx.close(context.asyncAssertSuccess()); 
    } 

    @Repeat(100) 
    @Test 
    public void testMyApplication(TestContext context) { 
     final Async async = context.async(1); 
     vertx.createHttpClient().getNow(8080, "localhost", "/", 
       response -> { 
        response.handler(body -> { 
         context.assertTrue(body.toString().contains("Hello")); 
         context.assertEquals(200, response.statusCode()); 
         async.complete(); 
        }); 
       }); 
     async.awaitSuccess(); 
    } 
} 

一些服務器在面前,其中服務器是越來越初始化你將不得不通過你的請求處理器來測試你的路由。

+0

沒有,這裏的問題是,端口需要進行的測試,在測試過程中沒有回收。不管怎麼說,還是要謝謝你 –