⚠️ Traduction non officielle - Cette documentation est une traduction communautaire non officielle de Docker.

Exécuter les tests Node.js dans un conteneur

Prérequis

Terminez toutes les sections précédentes de ce guide, en commençant par Conteneuriser une application Node.js.

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 verrez comment exécuter vos tests unitaires dans Docker lors du développement et de la construction.

Exécuter les tests lors du développement local

L'application exemple dispose déjà du paquet Jest pour l'exécution des tests et contient des tests dans le répertoire spec. Lors du développement local, vous pouvez utiliser Compose pour exécuter vos tests.

Exécutez la commande suivante pour exécuter le script de test du fichier package.json à l'intérieur d'un conteneur.

$ docker compose run server npm run test

Pour en savoir plus sur la commande, consultez docker compose run.

Vous devriez voir une sortie similaire à la suivante.

> [email protected] test
> jest

 PASS  spec/routes/deleteItem.spec.js
 PASS  spec/routes/getItems.spec.js
 PASS  spec/routes/addItem.spec.js
 PASS  spec/routes/updateItem.spec.js
 PASS  spec/persistence/sqlite.spec.js
  ● Console

    console.log
      Using sqlite database at /tmp/todo.db

      at Database.log (src/persistence/sqlite.js:18:25)

    console.log
      Using sqlite database at /tmp/todo.db

      at Database.log (src/persistence/sqlite.js:18:25)

    console.log
      Using sqlite database at /tmp/todo.db

      at Database.log (src/persistence/sqlite.js:18:25)

    console.log
      Using sqlite database at /tmp/todo.db

      at Database.log (src/persistence/sqlite.js:18:25)

    console.log
      Using sqlite database at /tmp/todo.db

      at Database.log (src/persistence/sqlite.js:18:25)


Test Suites: 5 passed, 5 total
Tests:       9 passed, 9 total
Snapshots:   0 total
Time:        2.008 s
Ran all test suites.

Exécuter les tests lors de la construction

Pour exécuter vos tests lors de la construction, vous devez mettre à jour votre Dockerfile pour ajouter une nouvelle étape de test.

Voici le Dockerfile mis à jour.

# syntax=docker/dockerfile:1

ARG NODE_VERSION=18.0.0

FROM node:${NODE_VERSION}-alpine as base
WORKDIR /usr/src/app
EXPOSE 3000

FROM base as dev
RUN --mount=type=bind,source=package.json,target=package.json \
    --mount=type=bind,source=package-lock.json,target=package-lock.json \
    --mount=type=cache,target=/root/.npm \
    npm ci --include=dev
USER node
COPY . .
CMD npm run dev

FROM base as prod
RUN --mount=type=bind,source=package.json,target=package.json \
    --mount=type=bind,source=package-lock.json,target=package-lock.json \
    --mount=type=cache,target=/root/.npm \
    npm ci --omit=dev
USER node
COPY . .
CMD node src/index.js

FROM base as test
ENV NODE_ENV test
RUN --mount=type=bind,source=package.json,target=package.json \
    --mount=type=bind,source=package-lock.json,target=package-lock.json \
    --mount=type=cache,target=/root/.npm \
    npm ci --include=dev
USER node
COPY . .
RUN npm run test

Au lieu d'utiliser CMD dans l'étape de test, utilisez RUN pour exécuter les tests. La raison est que l'instruction CMD s'exécute lorsque le conteneur démarre, et l'instruction RUN s'exécute lors de la construction de l'image et la construction échouera si les tests échouent.

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.

$ docker build -t node-docker-image-test --progress=plain --no-cache --target test .

Vous devriez voir une sortie contenant ce qui suit.

...

#11 [test 3/3] RUN npm run test
#11 1.058
#11 1.058 > [email protected] test
#11 1.058 > jest
#11 1.058
#11 3.765 PASS spec/routes/getItems.spec.js
#11 3.767 PASS spec/routes/deleteItem.spec.js
#11 3.783 PASS spec/routes/updateItem.spec.js
#11 3.806 PASS spec/routes/addItem.spec.js
#11 4.179 PASS spec/persistence/sqlite.spec.js
#11 4.207
#11 4.208 Test Suites: 5 passed, 5 total
#11 4.208 Tests:       9 passed, 9 total
#11 4.208 Snapshots:   0 total
#11 4.208 Time:        2.168 s
#11 4.208 Ran all test suites.
#11 4.265 npm notice
#11 4.265 npm notice New major version of npm available! 8.6.0 -> 9.8.1
#11 4.265 npm notice Changelog: <https://github.com/npm/cli/releases/tag/v9.8.1>
#11 4.265 npm notice Run `npm install -g [email protected]` to update!
#11 4.266 npm notice
#11 DONE 4.3s

...

Résumé

Dans cette section, vous avez appris à exécuter des tests lors du développement local en utilisant Compose et comment exécuter des tests lors de la construction de votre image.

Informations connexes :

Prochaines étapes

Ensuite, vous apprendrez à mettre en place un pipeline CI/CD en utilisant GitHub Actions.