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