Ejecuta tus pruebas de Java
Prerrequisitos
Completa todas las secciones anteriores de esta guía, comenzando con Contenerizar una aplicación Java.
Descripción general
Las pruebas son una parte esencial del desarrollo de software moderno. Las pruebas pueden significar muchas cosas para diferentes equipos de desarrollo. Existen pruebas unitarias, pruebas de integración y pruebas de extremo a extremo (end-to-end). En esta guía verás cómo ejecutar tus pruebas unitarias en Docker.
Dockerfile multi-etapa para pruebas
En el siguiente ejemplo, incorporarás los comandos de prueba en tu Dockerfile. Reemplaza el contenido de tu Dockerfile con el siguiente.
# 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" ]Primero, agregaste una nueva etapa base. En la etapa base, agregaste las instrucciones comunes que necesitarán tanto la etapa test como la etapa deps.
A continuación, agregaste una nueva etapa de pruebas llamada test basada en la etapa base. En esta
etapa copiaste los archivos fuente necesarios y luego especificaste RUN para ejecutar
./mvnw test. En lugar de usar CMD, utilizaste RUN para ejecutar las pruebas. La
razón es que la instrucción CMD se ejecuta cuando el contenedor se inicia, mientras que la instrucción RUN
se ejecuta cuando se construye la imagen. Al usar RUN, la construcción
fallará si las pruebas fallan.
Finalmente, actualizaste la etapa deps para basarse en la etapa base y eliminaste las instrucciones que ahora están en la etapa base.
Ejecuta el siguiente comando para construir una nueva imagen utilizando la etapa de pruebas como objetivo (target) y ver los resultados de las pruebas. Incluye --progress=plain para ver la salida de la construcción, --no-cache para asegurar que las pruebas siempre se ejecuten, y --target test para apuntar a la etapa de pruebas.
Ahora, construye tu imagen y ejecuta tus pruebas. Ejecutarás el comando docker build y agregarás la opción --target test para ejecutar específicamente la etapa de construcción de pruebas.
$ docker build -t java-docker-image-test --progress=plain --no-cache --target=test .
Deberías ver una salida que contenga lo siguiente:
...
#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
Próximos pasos
En la siguiente sección, verás cómo configurar un flujo de trabajo (pipeline) de CI/CD utilizando GitHub Actions.