Expérimenter avec le testeur Node.js
La sortie de Node.js 18 est venue avec une surprise : un test runner, bien que derrière un drapeau expérimental.
Avec Mocha et Jest comblant ce vide au cours de la dernière décennie, est-il temps de passer à ce testeur natif ? Plus de dépendances de développement juste pour exécuter la suite de tests ?
Cela semble intrigant !
Premier essai
J'ai commencé par remplacer l' testétape dans le package.jsonfichier par:
{
"scripts": {
"test": "node --test test/**/*.js"
}
}
Des tonnes d'erreurs dans la console :
not ok * - <test path>
---
duration_ms: 1028.112875
failureType: 'subtestsFailed'
exitCode: 1
stdout: ''
stderr: |-
<test path>
^
ReferenceError: describe is not defined
at Object.<anonymous> (<test path>)
at Module._compile (node:internal/modules/cjs/loader:1159:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1213:10)
at Module.load (node:internal/modules/cjs/loader:1037:32)
at Module._load (node:internal/modules/cjs/loader:878:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:23:47
Node.js v18.12.1
error: 'test failed'
code: 'ERR_TEST_FAILURE'
...
const { describe, it, beforeEach, afterEach } = require('node:test');
// package.json
{
"scripts": {
"test": "node --test -r test.setup.js test/**/*.js"
}
}
// test.setup.js
global.describe = require('node:test').describe;
global.it = require('node:test').it;
global.beforeEach = require('node:test').beforeEach;
global.afterEach = require('node:test').afterEach;
global.before = require('node:test').before;
global.after = require('node:test').after;
Unable to resolve path to module 'node:test'. eslint(import/no-unresolved)
// .eslintrc.yml
settings:
import/core-modules: [ node:test ]
Encore plein d'erreurs :
# Subtest: Errors thrown should be handled
not ok 3 - Errors thrown should be handled
---
duration_ms: 0.116958
failureType: 'hookFailed'
error: 'failed running beforeEach hook'
code: 'ERR_TEST_FAILURE'
stack: |-
checkWrappedMethod (node_modules/sinon/lib/sinon/util/core/wrap-method.js:67:21)
wrapMethod (node_modules/sinon/lib/sinon/util/core/wrap-method.js:132:13)
stub (node_modules/sinon/lib/sinon/stub.js:130:44)
node_modules/sinon/lib/sinon/util/core/walk-object.js:41:17
node_modules/sinon/lib/sinon/util/core/walk.js:28:22
Array.forEach (<anonymous>)
walkInternal (node_modules/sinon/lib/sinon/util/core/walk.js:20:5)
walk (node_modules/sinon/lib/sinon/util/core/walk.js:48:12)
walkObject (node_modules/sinon/lib/sinon/util/core/walk-object.js:26:5)
Function.stub (node_modules/sinon/lib/sinon/stub.js:103:16)
extendObjectWithWrappedMethods (node_modules/sinon/lib/sinon/util/core/wrap-method.js:167:34)
wrapMethod (node_modules/sinon/lib/sinon/util/core/wrap-method.js:155:5)
stub (node_modules/sinon/lib/sinon/stub.js:130:44)
node_modules/sinon/lib/sinon/util/core/walk-object.js:41:17
node_modules/sinon/lib/sinon/util/core/walk.js:28:22
Array.forEach (<anonymous>)
walkInternal (node_modules/sinon/lib/sinon/util/core/walk.js:20:5)
walk (node_modules/sinon/lib/sinon/util/core/walk.js:48:12)
walkObject (node_modules/sinon/lib/sinon/util/core/walk-object.js:26:5)
Function.stub (node_modules/sinon/lib/sinon/stub.js:103:16)
...
Deuxième essai
Cette fois, j'utilisais la v18.16.0version LTS de Node.js. Plus d'erreurs cryptiques ! C'était un soulagement.
A couru le rapport de couverture. 45 % de couverture ! Hein? Attendez. 60% de nos tests n'ont même pas été exécutés !
Faire des recherches m'a amené à ce problème GitHub - un problème avec l'analyse globale pour le testeur. Cela semblait être une fonctionnalité de base, mais oui, manquante ! Nous ne pouvons donc pas utiliser le test/**/*.jsmodèle glob.
Si un répertoire nommé testest rencontré, l'exécuteur de test le recherchera de manière récursive pour tous les fichiers .js, .cjset .mjs.
https://nodejs.org/docs/latest-v18.x/api/test.html#test-runner-execution-model
Heureusement, notre répertoire de test s'appelait bien test. Donc plus de glob.
// package.json
{
"scripts": {
"test": "node --test -r test.setup.js"
}
}
Troisième essai ?
La suite de tests était enfin verte. La couverture était également verte.
Ensuite, il fallait migrer de sinon.assertvers le natif node:asserten remplaçant tous les appels vers :
sinon.assert.pass(condition);
sinon.assert.match(expected, received);
const assert = require('node:assert/strict');
assert.ok(condition);
assert.equal(expected, received);
La suite de tests est toujours verte. La couverture est également verte. Mais les performances étaient à la baisse. Hmm, c'est quelque chose que je n'avais pas vérifié auparavant.
Il a fallu plus de 16 secondes pour exécuter la suite de tests, tandis que Mocha a terminé en moins d'une seconde ! Même Jest a eu des moments similaires à Mocha.
Mon impression d'utiliser un testeur natif était qu'il pouvait surpasser les outils tiers comme Mocha et Jest. Mais cela ne semble pas être le cas, comme en témoigne ce problème GitHub .
Il faudra donc attendre la prochaine version mineure de Node.js pour faire un troisième essai !
Dernières pensées
Pouvoir exécuter une suite de tests sans installer de dépendance tierce a certainement ses mérites. De plus, la prise en charge de la syntaxe de type Mocha facilite la migration.
Il y a beaucoup d'autres fonctionnalités que je voulais essayer : les simulations, les instantanés, la couverture du code, les observateurs, etc.
Mais la performance était en effet un rebut. En attente d'un correctif avec impatience !
![Qu'est-ce qu'une liste liée, de toute façon? [Partie 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































