2017-06-27 14 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

溶液を設定経由でポートを渡す使用し、試験中にランダムいずれかを使用するポート上で実行しているテスト・サーバが存在します。

 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

エラーはあなたが前に、サーバーがあなたを初期化取得された場合にはポート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(); 
    } 
} 

でいくつかのサーバを起動する必要なしサーバーがないことを意味Connection refusedは、あなたのテストケースにはポート8080で実行されていることを述べていますあなたのルートをテストするリクエストハンドラを渡さなければなりません。ここで何が起こっている

+0

いいえ助けとなり、ここでの問題は、ポートがテストを実行するために必要とされ、テスト中に再利用されていないということです。とにかくありがとう –

関連する問題