Exécuter vos tests Java
Prérequis
Terminez toutes les sections précédentes de ce guide, en commençant par Conteneuriser une application Java.
Aperçu
Les tests sont une partie essentielle du développement logiciel moderne. Les tests peuvent signifier beaucoup de choses pour différentes équipes de développement. Il y a les tests unitaires, les tests d'intégration et les tests de bout en bout. Dans ce guide, vous examinerez l'exécution de vos tests unitaires dans Docker.
Dockerfile multi-étapes pour les tests
Dans l'exemple suivant, vous allez intégrer les commandes de test dans votre Dockerfile. Remplacez le contenu de votre Dockerfile par ce qui suit.
# 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" ]
Tout d'abord, vous avez ajouté une nouvelle étape de base. Dans l'étape de base, vous avez ajouté des instructions communes dont les étapes de test et de dépendances auront besoin.
Ensuite, vous avez ajouté une nouvelle étape de test nommée test
basée на l'étape de base. Dans cette
étape, vous avez copié les fichiers sources nécessaires, puis spécifié RUN
pour exécuter
./mvnw test
. Au lieu d'utiliser CMD
, vous avez utilisé RUN
pour exécuter les tests. La
raison est que l'instruction CMD
s'exécute lorsque le conteneur s'exécute, et l'instruction RUN
s'exécute lors de la construction de l'image. Lorsque vous utilisez RUN
, la construction
échouera si les tests échouent.
Enfin, vous avez mis à jour l'étape de dépendances pour qu'elle soit basée sur l'étape de base et supprimé les instructions qui se trouvent maintenant dans l'étape de base.
Exécutez la commande suivante pour construire une nouvelle image en utilisant l'étape de test comme cible et afficher les résultats des tests. Incluez --progress=plain
pour afficher la sortie de la construction, --no-cache
pour vous assurer que les tests s'exécutent toujours, et --target test
pour cibler l'étape de test.
Maintenant, construisez votre image et exécutez vos tests. Vous exécuterez la commande docker build
et ajouterez l'indicateur --target test
pour exécuter spécifiquement l'étape de construction de test.
$ docker build -t java-docker-image-test --progress=plain --no-cache --target=test .
Vous devriez voir une sortie contenant ce qui suit
...
#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
Prochaines étapes
Dans la section suivante, vous examinerez comment configurer un pipeline CI/CD à l'aide de GitHub Actions.