我已经把java集成测试移到使用elasticsearch测试容器而不是嵌入式elasticsearch。测试已经慢了1个小时,这是一个巨大的生产力打击。我正在寻找加快速度的方法。
我试过在Elasticsearch容器上使用reuse
这样的参数,但是没有效果。
private static final String ELASTICSEARCH_VERSION = "7.11.2";
private static ElasticsearchContainer elasticsearchContainer;
private static final DockerImageName ELASTICSEARCH_IMAGE =
DockerImageName
.parse("docker.elastic.co/elasticsearch/elasticsearch")
.withTag(ELASTICSEARCH_VERSION);
elasticsearchContainer = new ElasticsearchContainer(ELASTICSEARCH_IMAGE)
.withEnv("foo", "bar").withSharedMemorySize(1000000000L);
elasticsearchContainer.addExposedPorts(9200, 9300);
elasticsearchContainer.withStartupTimeout(Duration.of(5, ChronoUnit.MINUTES));
elasticsearchContainer.start();
private static RestHighLevelClient getRestHighLevelClient(ElasticsearchContainer container) {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(ELASTICSEARCH_USERNAME,
ELASTICSEARCH_PASSWORD));
RestClientBuilder restClientBuilder = RestClient.builder(HttpHost.create(container.getHttpHostAddress()))
.setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
.setDefaultCredentialsProvider(credentialsProvider)
.setKeepAliveStrategy((response, context) -> 3 * 60 * 1000));
// Try to prevent SocketTimeoutException when fetching larger batch size
restClientBuilder.setRequestConfigCallback(
requestConfigBuilder -> requestConfigBuilder.setSocketTimeout(2 * 60 * 1000));
return new RestHighLevelClient(restClientBuilder);
}
Gradle配置(Gradle守护程序崩溃一次,因此增加到2g)
org.gradle.jvmargs=-Xms2g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
有什么建议能让测试更快吗?
1条答案
按热度按时间guykilcj1#
对任何性能工作或优化的一般建议是在引入更改之前进行测量。我建议在得出结论之前分析测试运行。
这里有几个指标可以在不大量使用分析器的情况下进行估计。
对于我来说需要8.2秒(我使用
elasticsearch-oss:7.10.2
):您可以阅读更多关于Testcontainers in the docs管理的容器的生命周期的信息。
例如,如果使用JUnit,则可以检查是否在
@BeforeEach
或@BeforeAll
中启动了新容器,或者是否在整个测试套件中使用了单例容器。其中一个因素是允许Docker使用多少资源。默认情况下,Docker配置为2G内存,这可能是一个瓶颈。如果容器中没有足够的内存,Elastic可能会比它应该的速度慢(如果开始交换等,甚至会更慢)。请为它提供足够的CPU和内存以获得最快的结果。
如果查看这三件事没有帮助,那么也许您可以分析测试运行以检查瓶颈是什么。