我是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();
}
Run Code Online (Sandbox Code Playgroud)
然而,这偶尔会失败.
SEVERE: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: localhost/127.0.0.1:8080
Run Code Online (Sandbox Code Playgroud)
什么是更好的方法来启动多个客户端并确保测试按顺序运行或具有一些受控制的并行性?
好,
这里发生的是由于异步调用,有时可以在调用async.complete之前启动新测试.因此,已经有一个测试服务器在端口8080上运行.
解决方案是使用via config中的pass端口并在测试中使用随机端口.
server.requestHandler(router::accept)
.listen(
config().getInteger("http.port", 8080),
...
Run Code Online (Sandbox Code Playgroud)
而且测试成了
@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();
});
});
}
Run Code Online (Sandbox Code Playgroud)
这篇博文有很多帮助http://vertx.io/blog/vert-x-application-configuration/