執行您的 Java 測試

先決條件

完成本指南中的所有先前部分,從 容器化 Java 應用程式 開始。

概述

測試是現代軟體開發的重要組成部分。測試對於不同的開發團隊可能意味著很多事情。有單元測試、整合測試和端到端測試。在本指南中,您將瞭解如何在 Docker 中執行單元測試。

用於測試的多階段 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/. ./
ENV JAVA_TOOL_OPTIONS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:8000"
CMD [ "java", "-Dspring.profiles.active=postgres", "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" ]

首先,您添加了一個新的基礎階段。在基礎階段,您添加了測試和 deps 階段都需要用到的通用指令。

接下來,您添加了一個新的測試階段,名為test,它基於基礎階段。在這個階段,您複製了必要的原始檔,然後指定了RUN 來執行./mvnw test。您使用RUN 而不是CMD 來執行測試。原因是CMD 指令在容器執行時執行,而RUN 指令在映象構建時執行。使用RUN 時,如果測試失敗,構建也會失敗。

最後,您將 deps 階段更新為基於基礎階段,並刪除了現在位於基礎階段中的指令。

執行以下命令以使用測試階段作為目標構建一個新映象並檢視測試結果。包含--progress=plain 來檢視構建輸出,--no-cache 來確保始終執行測試,以及--target-test 來定位測試階段。

現在,構建您的映象並執行您的測試。您將執行docker build 命令並新增--target test 標誌,以便您專門執行測試構建階段。

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

您應該看到包含以下內容的輸出

...

#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 管道。