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.