執行您的 Java 測試

先決條件

完成本指南的所有先前章節,從 將 Java 應用程式容器化 開始。

概述

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

用於測試的多階段 Dockerfile

在以下範例中,您會將測試指令拉入您的 Dockerfile 中。將 Dockerfile 的內容替換為以下內容。

# syntax=docker/dockerfile:1

FROM eclipse-temurin:21-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:21-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` 旗標,以便您專門執行測試建構階段。

$ 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 流程。