TestContainers 有 Native.java 类,它从“jna.tmpdir”键获取 JNA 属性。如何覆盖该键的值?喜欢:
\n\njna.tmpdir=/data/builds/compose-tmp \njava.io.tmpdir=/data/builds/compose-tmp\nRun Code Online (Sandbox Code Playgroud)\n\n获取 jna 属性的部分代码:\xc2\xa0
\n\n\npackage com.sun.jna;\n\npublic final class Native implements Version {\n\n...\n\n static File getTempDir() throws IOException {\n File jnatmp;\n String prop = System.getProperty("jna.tmpdir");\n if (prop != null) {\n jnatmp = new File(prop);\n jnatmp.mkdirs();\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n 我有 5 个春季批量测试,正在使用 testcontainers 在 Jenkins 管道上运行。我仅在其中一项测试中收到以下错误:
\n\n12:51:53 17 Mar 2020;17:51:41.498 [user:] [request:] [main] INFO \n12:51:53 o.testcontainers.DockerClientFactory - Ryuk started - will monitor and terminate Testcontainers containers on JVM exit\n12:51:53 [37m[1m\xe2\x84\xb9\xef\xb8\x8e Checking the system...[0m[0m\n12:51:53 [32m\xe2\x9c\x94 Docker version should be at least 1.6.0[0m\n12:51:53 17 Mar 2020;17:51:41.508 [user:] [request:] [main] DEBUG\n12:51:53 c.g.d.core.command.AbstrDockerCmd - Cmd: f6fc0588843eb76a458bdc25cdc942fed474945aa3cfe7b635220dd1935dbfaa,<null>,true,<null>,<null>,<null>,<null>,{df,-P},<null>,<null>,com.github.dockerjava.core.exec.ExecCreateCmdExec@5cbe877d\n12:51:53 17 Mar 2020;17:51:41.644 [user:] [request:] [tc-okhttp-stream-2116511124] DEBUG\n12:51:53 c.g.d.c.c.ExecStartResultCallback - STDOUT: Filesystem 1024-blocks Used Available Capacity Mounted on\n12:51:53 overlay 314561516 62506464 252055052 20% /\n12:51:53 tmpfs 65536 0 …Run Code Online (Sandbox Code Playgroud) 我正在使用 docker/testcontainers 运行 postgresql 数据库进行测试。我已经有效地完成了单元测试,即测试数据库访问。然而,我现在已经将 springboot 测试纳入其中,这样我就可以使用嵌入式 Web 服务进行测试,但我遇到了问题。
问题似乎是在容器启动之前请求 dataSource bean。
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [com/myproject/integrationtests/IntegrationDataService.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Mapped port can only be obtained after the container is started
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Mapped port can …Run Code Online (Sandbox Code Playgroud) 我想在 Gitlab 中运行 Testontainers 来测试 Spring Boot 应用程序。创建 Gitlab 运行程序后(更改了 URL 和令牌):
sudo gitlab-runner register -n \
--url https://gitlab.com/ \
--registration-token REGISTRATION_TOKEN \
--executor docker \
--description "My Docker Runner" \
--docker-image "docker:19.03.12" \
--docker-privileged \
--docker-volumes "/certs/client"
Run Code Online (Sandbox Code Playgroud)
我写了一个简单的 ci 管道:
stages:
- test
services:
- docker:19.03.12-dind
variables:
DOCKER_HOST: tcp://docker:2376
DOCKER_TLS_CERTDIR: "/certs"
test:
stage: test
image: amazoncorretto:11
script:
- java -version
- chmod +x gradlew
- ./gradlew test
tags:
- docker-dind
Run Code Online (Sandbox Code Playgroud)
测试看起来像:
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait; …Run Code Online (Sandbox Code Playgroud) 当我尝试逐一运行测试时遇到问题。\n数据库连接已关闭。
\n根据文档(声明为静态字段的容器...),我试图确保我的容器在所有测试中都被引发一次。
\n我专门使用它来获得Spring的应用程序上下文和一次引发并用于所有测试的测试容器。
\n确实如此,因为我在每个测试中都会进行检查:
\n boolean running = getPostgreSQLContainer().isRunning();\n\n System.out.println(running);\nRun Code Online (Sandbox Code Playgroud)\n也就是说,测试是一项一项自动运行的。
\n <parent>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-parent</artifactId>\n <version>2.4.1</version>\n <relativePath/> <!-- lookup parent from repository -->\n </parent>\n\n....\n\n<properties>\n <java.version>11</java.version>\n <testcontainers.version>1.15.1</testcontainers.version>\n <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\n <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\n <version.mapstruct>1.4.1.Final</version.mapstruct>\n <version.maven.compiler.plugin>3.8.1</version.maven.compiler.plugin>\n <version.embedded.postgresql.testcontainers>1.86</version.embedded.postgresql.testcontainers>\n <version.spring.cloud.starter>2.2.6.RELEASE</version.spring.cloud.starter>\n </properties>\n\n <dependencies>\n <dependency>\n <groupId>org.testcontainers</groupId>\n <artifactId>postgresql</artifactId>\n <scope>test</scope>\n </dependency>\n\n <dependency>\n <groupId>org.mapstruct</groupId>\n <artifactId>mapstruct</artifactId>\n <version>${version.mapstruct}</version>\n </dependency>\n\n <dependency>\n <groupId>org.mapstruct</groupId>\n <artifactId>mapstruct-processor</artifactId>\n <version>${version.mapstruct}</version>\n <scope>provided</scope>\n </dependency>\n\n <dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-data-jpa</artifactId>\n </dependency>\n <dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-data-rest</artifactId>\n </dependency>\n <dependency>\n <groupId>org.springframework.boot</groupId>\n <artifactId>spring-boot-starter-web</artifactId>\n </dependency>\n\n <dependency>\n <groupId>org.liquibase</groupId>\n <artifactId>liquibase-core</artifactId>\n …Run Code Online (Sandbox Code Playgroud) postgresql integration-testing docker spring-boot testcontainers
我将 Testcontainers 1.15.3 与 Spring Boot 2.4 和 Junit5 一起使用。当我运行测试时, testcontainers 启动第一个容器并执行 Flyway 脚本,然后停止第一个容器。立即启动第二个容器(不启动 Flyway 脚本)。我的测试失败,因为第二个容器不包含数据。
抽象类:
@ExtendWith({RestDocumentationExtension.class, SpringExtension.class})
@TestPropertySource(locations = "classpath:application-test.properties")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public abstract class AbstractIntegrationTest {
//...
}
Run Code Online (Sandbox Code Playgroud)
测试类:
class ClassTest extends AbstractIntegrationTest{
@Test
void getById () throws Exception {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
用于测试的属性文件(jdbc url 包含 jdbc: tc来启动 testcontainer):
spring.flyway.locations = classpath:database/structure,classpath:database/data
spring.datasource.url=jdbc:tc:postgresql:13.3:///databasename?TC_INITSCRIPT=file:src/test/resources/database/dataset/add_user.sql
Run Code Online (Sandbox Code Playgroud)
启动测试后的日志:
...
...
2021-06-21 12:56:52 [main] INFO [postgres:13.3] - Creating container for image: postgres:13.3
2021-06-21 12:56:52 [main] INFO [postgres:13.3] …Run Code Online (Sandbox Code Playgroud) 尝试通过测试容器拉取图像时出现错误 [ERROR]。原因 您组织中的 CI 计算机可以访问公共注册表服务器,但不允许与外部 Web 通信。Testcontainer java对于这个用例有类似的东西
Private registry image name
// Referring directly to an image on a private registry - image name will vary
final MySQLContainer<?> mysql = new MySQLContainer<>(
DockerImageName.parse("registry.mycompany.com/mirror/mysql:8.0.24")
.asCompatibleSubstituteFor("mysql")
)
Run Code Online (Sandbox Code Playgroud)
相当于 testcontainer-go 使用的覆盖图像注册表 url 的 go 是什么?
代码
req := testcontainers.ContainerRequest{
Image: "amazon/dynamodb-local:1.15.0",
ExposedPorts: []string{"8000" + "/tcp"},
ReaperImage: artifact_path,
}
container, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{
ContainerRequest: req,
// auto-start the container
Started: true,
})
Run Code Online (Sandbox Code Playgroud)
[错误]
2021/09/28 20:21:11 Failed to pull image: Error response …Run Code Online (Sandbox Code Playgroud) 我有一个小问题。我已经开始为我的小项目编写测试。该项目使用 SpringBoot、Spring 的标准 JpaRepository 作为测试框架,我使用 Spock,为了测试数据库,我使用 TestContainers 的 PostgreSQL 容器。问题是,尽管每个测试都使用了@Transacional,但测试之间的数据仍然被保留。最奇怪的部分是,在我可以看到的日志中,该事务被回滚。我将不胜感激任何帮助。
所以,这些是文件:
@SpringBootTest(classes = DatabaseMain.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@Testcontainers
class BaseTestIT extends Specification {
private static final Logger LOG = LoggerFactory.getLogger(BaseTestIT.class);
@Shared
private static final PostgreSQLContainer POSTGRES_CONTAINER = new PostgreSQLContainer("postgres")
.withDatabaseName('test').withUsername(
'test').withPassword('test');
...
}
Run Code Online (Sandbox Code Playgroud)
@Configuration
@PropertySource("database.properties")
public class ConfigurationIT {
private final String databaseUrl;
private final String databaseDialect;
private final String databaseType;
@Autowired
public ConfigurationIT(@Value("${test.database.url}") String databaseUrl,
@Value("${test.database.dialect}") String databaseDialect,
@Value("${test.database.type}") String databaseType) {
this.databaseDialect = databaseDialect;
this.databaseUrl = …Run Code Online (Sandbox Code Playgroud) 我有一个Spring Boot带有集成测试的应用程序,该测试使用testContainers.
直到最近,我还在使用 Docker Desktop,并且能够轻松地从 Intellij 或 CLI 中运行测试。
最近我将我的 Windows 机器更改为Rancher 桌面。
现在,当尝试运行集成测试时,gradle integrationTest我收到此错误:
原因:java.lang.IllegalStateException:之前尝试查找 Docker 环境失败。不会重试。请查看日志并检查配置 org.testcontainers.dockerclient.DockerClientProviderStrategy.getFirstValidStrategy(DockerClientProviderStrategy.java:109) org.testcontainers.DockerClientFactory.getOrInitializeStrategy(DockerClientFactory.java:136) org.testcontainers.DockerClientFactory.client(DockerClientFactory.java) :178)在org.testcontainers.LazyDockerClient.getDockerClient(LazyDockerClient.java:14)在org.testcontainers.LazyDockerClient.authConfig(LazyDockerClient.java:12)在org.testcontainers.containers.GenericContainer.start(GenericContainer.java:310)
Intellij 或 Rancher 或 Windows 中是否需要额外的配置才能使其工作?
GenericContainer我正在尝试以编程方式从托管在私有 AWS ECR 存储库中的 docker 映像创建并启动 Testcontainers 。这将用于自动化集成测试,将在本地和 CICD 管道内运行。我知道我需要进行身份验证才能下载映像,但我不清楚如何最好地从 AWS 获取身份验证信息并将其传递到 Testcontainers 上下文。我已阅读 Testcontainers 文档,但尚未找到有关如何对私有 docker 容器存储库进行身份验证的详细信息。
到目前为止我的代码是:
import org.testcontainers.containers.GenericContainer
import org.testcontainers.utility.DockerImageName
const val imageName = "<account>.dkr.ecr.<region>.amazonaws.com/<imageName>:<version>"
val testContainer = GenericContainer(DockerImageName.parse(imageName))
testContainer.start()
Run Code Online (Sandbox Code Playgroud)
当然,这会产生错误:
at org.testcontainers.shaded.com.github.dockerjava.core.DefaultInvocationBuilder.execute(DefaultInvocationBuilder.java:247)
at org.testcontainers.shaded.com.github.dockerjava.core.DefaultInvocationBuilder.lambda$executeAndStream$1(DefaultInvocationBuilder.java:269)
at java.base/java.lang.Thread.run(Thread.java:833)
com.github.dockerjava.api.exception.InternalServerErrorException: Status 500: {"message":"Head \"https://<account>.dkr.ecr.<region>.amazonaws.com/v2/<imageName>/manifests/<version>\": no basic auth credentials"}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我发现 Testcontainers 对于所有事情来说都很直观,但这个问题让我难住了。如何将 Testcontainers 与私有 AWS ECR 存储库结合使用?
testcontainers ×10
spring-boot ×5
java ×4
docker ×2
amazon-ecr ×1
flyway ×1
gitlab ×1
go ×1
go-testing ×1
junit ×1
junit5 ×1
kotlin ×1
postgresql ×1
rancher ×1
spock ×1
spring ×1