Skip to content

在 Docker 中运行您的 Java 测试

原文:https://docs.docker.com/language/java/run-tests/

先决条件

完成本指南的所有前面部分,从将 Java 应用程序容器化开始。

概览

测试是现代软件开发不可或缺的一部分。对不同的开发团队来说,测试可能意味着很多事情。有单元测试、集成测试和端到端测试。在本指南中,您将了解如何在 Docker 中运行您的单元测试。

用于测试的多阶段 Dockerfile

在以下示例中,您将把测试命令引入到您的 Dockerfile 中。 用以下内容替换您的 Dockerfile。

dockerfile
# syntax=docker/dockerfile:1

FROM eclipse-temurin:17-jdk-jammy as base
WORKDIR /build
COPY --chmod=0755 mvnw mvnw
COPY .mvn/ .mvn/

FROM base as test
WORKDIR /build
COPY ./src src/
RUN --mount=type=bind,source=pom.xml,target=pom.xml \
    --mount=type=cache,target=/root/.m2 \
    ./mvnw test

FROM base as deps
WORKDIR /build
RUN --mount=type=bind,source=pom.xml,target=pom.xml \
    --mount=type=cache,target=/root/.m2 \
    ./mvnw dependency:go-offline -DskipTests

FROM deps as package
WORKDIR /build
COPY ./src src/
RUN --mount=type=bind,source=pom.xml,target=pom.xml \
    --mount=type=cache,target=/root/.m2 \
    ./mvnw package -DskipTests && \
    mv target/$(./mvnw help:evaluate -Dexpression=project.artifactId -q -DforceStdout)-$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout).jar target/app.jar

FROM package as extract
WORKDIR /build
RUN java -Djarmode=layertools -jar target/app.jar extract --destination target/extracted

FROM extract as development
WORKDIR /build
RUN cp -r /build/target/extracted/dependencies/. ./
RUN cp -r /build/target/extracted/spring-boot-loader/. ./
RUN cp -r /build/target/extracted/snapshot-dependencies/. ./
RUN cp -r /build/target/extracted/application/. ./
CMD [ "java", "-Dspring.profiles.active=postgres", "-Dspring-boot.run.jvmArguments='-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000'", "org.springframework.boot.loader.launch.JarLauncher" ]

FROM eclipse-temurin:17-jre-jammy AS final
ARG UID=10001
RUN adduser \
    --disabled-password \
    --gecos "" \
    --home "/nonexistent" \
    --shell "/sbin/nologin" \
    --no-create-home \
    --uid "${UID}" \
    appuser
USER appuser
COPY --from=extract build/target/extracted/dependencies/ ./
COPY --from=extract build/target/extracted/spring-boot-loader/ ./
COPY --from=extract build/target/extracted/snapshot-dependencies/ ./
COPY --from=extract build/target/extracted/application/ ./
EXPOSE 8080
ENTRYPOINT [ "java", "-Dspring.profiles.active=postgres", "org.springframework.boot.loader.launch.JarLauncher" ]

首先,您添加了一个新的基础阶段。在基础阶段中,您添加了测试和依赖阶段都需要的通用指令。

接下来,您添加了一个基于基础阶段的新测试阶段,标记为test。在这个阶段中,您复制了必要的源文件,然后指定RUN来运行./mvnw test。您使用了RUN而不是CMD来运行测试。原因是CMD指令在容器运行时执行,而RUN指令在构建镜像时执行。使用RUN时,如果测试失败,构建将会失败。

最后,您更新了基于基础阶段的依赖阶段,并删除

了现在在基础阶段中的指令。

运行以下命令构建一个新镜像,并使用测试阶段作为目标查看测试结果。包括--progress=plain以查看构建输出,--no-cache以确保测试总是运行,并且使用--target=test来定位测试阶段。

现在,构建您的镜像并运行您的测试。您将运行docker build命令并添加--target test标志,以便您专门运行测试构建阶段。

console
docker build -t java-docker-image-test --progress=plain --no-cache --target=test .

您应该看到包含以下内容的输出:

console
...

#15 101.3 [WARNING] Tests run: 45, Failures: 0, Errors: 0, Skipped: 2
#15 101.3 [INFO]
#15 101.3 [INFO] ------------------------------------------------------------------------
#15 101.3 [INFO] BUILD SUCCESS
#15 101.3 [INFO] ------------------------------------------------------------------------
#15 101.3 [INFO] Total time:  01:39 min
#15 101.3 [INFO] Finished at: 2024-02-01T23:24:48Z
#15 101.3 [INFO] ------------------------------------------------------------------------
#15 DONE 101.4s

总结

在本节中,您了解了如何在构建镜像时运行测试。

相关信息:

下一步

在下一节中,您将了解如何使用 GitHub Actions 设置 CI/CD 流水线。