# Ejecuta tus pruebas de Java


## Prerrequisitos

Completa todas las secciones anteriores de esta guía, comenzando con [Contenerizar una aplicación Java](/guides/java/run-tests/containerize/).

## 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.

```dockerfile {hl_lines="3-19"}
# 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.

```console
$ docker build -t java-docker-image-test --progress=plain --no-cache --target=test .
```

Deberías ver una salida que contenga lo siguiente:

```console
...

#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.

