简介
产生原因
如果一个项目依赖的外部配置比较多,每次测试需要将项目依赖的环境服务启动,如果测试人员的开发环境不对还得修改环境,这不是测试人员应该考虑的问题,因此这里使用docker去除开发环境的影响
使用
docker启动
testcontainer需使用docker,windows直接启动docker-desktop就可以了。
demo
懒得看文档了,这里就以langchain的demo为例简单记录下使用方式。
引入pom依赖
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<version>1.19.7</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>elasticsearch</artifactId>
<version>1.19.6</version>
</dependency>
代码
@Testcontainers
class ElasticsearchEmbeddingStoreIT extends EmbeddingStoreWithFilteringIT {
@Container
private static final ElasticsearchContainer elasticsearch =
new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:8.9.0")
.withEnv("xpack.security.enabled", "false");
EmbeddingStore<TextSegment> embeddingStore = ElasticsearchEmbeddingStore.builder()
.serverUrl(elasticsearch.getHttpHostAddress())
.indexName(randomUUID())
.dimension(384)
.build();
EmbeddingModel embeddingModel = new AllMiniLmL6V2QuantizedEmbeddingModel();
@Override
protected EmbeddingStore<TextSegment> embeddingStore() {
return embeddingStore;
}
@Override
protected EmbeddingModel embeddingModel() {
return embeddingModel;
}
@Override
protected void ensureStoreIsEmpty() {
// TODO fix
}
@Override
@SneakyThrows
protected void awaitUntilPersisted() {
Thread.sleep(1000);
}
}
- Elasticsearch 容器准备:
- 在测试类的静态字段中定义了一个名为
elasticsearch
的 Testcontainers Elasticsearch 容器。该容器使用官方的 Elasticsearch 镜像版本 8.9.0,并且禁用了 X-Pack 安全特性。 - 在测试类运行之前,Testcontainers 会自动启动这个 Elasticsearch 容器。
- 在测试类的静态字段中定义了一个名为
- Embedding Store 和 Embedding Model 初始化:
- 在测试类中定义了一个
embeddingStore
,它是一个 ElasticsearchEmbeddingStore 实例。这个实例连接到运行在elasticsearch
容器中的 Elasticsearch 服务,并指定了一个随机的索引名称和维度为 384。 - 定义了一个
embeddingModel
,它是一个 AllMiniLmL6V2QuantizedEmbeddingModel 实例。
- 在测试类中定义了一个
- 测试方法重写:
embeddingStore()
方法返回了上面初始化的embeddingStore
实例。embeddingModel()
方法返回了上面初始化的embeddingModel
实例。ensureStoreIsEmpty()
方法是一个占位方法,需要被实现以确保存储空间为空。awaitUntilPersisted()
方法是一个占位方法,通过线程休眠来模拟等待数据持久化。
- 测试执行:
- 当你运行这个测试类时,Testcontainers 会自动启动 Elasticsearch 容器,并且测试方法会使用这个容器中的 Elasticsearch 服务来执行测试逻辑。
- 测试逻辑可能包括向 Elasticsearch 存储数据、查询数据或执行其他操作,以验证代码的正确性
- 测试的方法定义在父类中