執行您的 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 管道。