标签: testcontainers

如何覆盖 testcontainers 中的 jna.tmpdir 和 java.io.tmpdir 属性?

TestContainers 有 Native.java 类,它从“jna.tmpdir”键获取 JNA 属性。如何覆盖该键的值?喜欢:

\n\n
jna.tmpdir=/data/builds/compose-tmp \njava.io.tmpdir=/data/builds/compose-tmp\n
Run 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}\n
Run Code Online (Sandbox Code Playgroud)\n

testcontainers

5
推荐指数
0
解决办法
1260
查看次数

无法获取 Docker 镜像

我有 5 个春季批量测试,正在使用 testcontainers 在 Jenkins 管道上运行。我仅在其中一项测试中收到以下错误:

\n\n
12: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)

java spring jenkins-pipeline testcontainers

5
推荐指数
1
解决办法
2万
查看次数

SpringBootTest、Testcontainers、容器启动 - 容器启动后才能获取映射端口

我正在使用 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)

junit spring-boot testcontainers

5
推荐指数
1
解决办法
1万
查看次数

Gitlab 中的测试容器

我想在 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)

gitlab spring-boot docker-in-docker testcontainers

5
推荐指数
1
解决办法
4662
查看次数

TestContainers 和错误:“无法验证连接 org.postgresql.jdbc.PgConnection”(为所有测试类引发单个容器)

当我尝试逐一运行测试时遇到问题。\n数据库连接已关闭。

\n

根据文档(声明为静态字段的容器...),我试图确保我的容器在所有测试中都被引发一次。

\n

我专门使用它来获得Spring应用程序上下文和一次引发并用于所有测试的测试容器。

\n

确实如此,因为我在每个测试中都会进行检查:

\n
      boolean running = getPostgreSQLContainer().isRunning();\n\n        System.out.println(running);\n
Run Code Online (Sandbox Code Playgroud)\n

也就是说,测试是一项一项自动运行的。

\n
    \n
  • pom.xml
  • \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

5
推荐指数
1
解决办法
1万
查看次数

Testcontainers 在 Spring boot 项目中启动两个容器而不是一个

我将 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)

java flyway spring-boot junit5 testcontainers

5
推荐指数
1
解决办法
3050
查看次数

如何覆盖 testcontainer 使用的图像注册表 URL

尝试通过测试容器拉取图像时出现错误 [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)

go testcontainers go-testing

5
推荐指数
1
解决办法
1727
查看次数

来自 @Transactional 测试的数据在测试之间保持不变

我有一个小问题。我已经开始为我的小项目编写测试。该项目使用 SpringBoot、Spring 的标准 JpaRepository 作为测试框架,我使用 Spock,为了测试数据库,我使用 TestContainers 的 PostgreSQL 容器。问题是,尽管每个测试都使用了@Transacional,但测试之间的数据仍然被保留。最奇怪的部分是,在我可以看到的日志中,该事务被回滚。我将不胜感激任何帮助。

所以,这些是文件:

  1. 包含用于测试的共享容器的文件,所有集成测试都应从以下位置扩展:
@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)
  1. 包含配置的文件:
@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)

java spring-transactions spock spring-boot testcontainers

5
推荐指数
1
解决办法
1297
查看次数

测试容器和 Rancher

我有一个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 中是否需要额外的配置才能使其工作?

intellij-idea rancher testcontainers

5
推荐指数
2
解决办法
6742
查看次数

如何从 AWS ECR 中提取私有 docker 映像以与 Java/Kotlin 中的 Testcontainers 库一起使用?

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 存储库结合使用?

java kotlin docker amazon-ecr testcontainers

5
推荐指数
1
解决办法
2073
查看次数