NodeJS Test Runner

Avec NodeJS v18, il est possible d’écrire ses tests sans librairie externe grâce au module node:test

Ce nouveau module permet de définir un jeu de test, que l’on pourra jouer via la commande [node --test](<https://nodejs.org/api/test.html#running-tests-from-the-command-line>).

Toujours dans l’idée d’utiliser le moins de dépendances externes, un bon module pour faire des assertions est [node:assert/strict](<https://nodejs.org/api/assert.html#strict-assertion-mode>).

En prenant un exemple

Dans un fichier index.js

export function canRegister({ age, country, job }) {
  return age >= 18 && country === 'US' && job === 'engineer';
}

En utilisant le test runner de Node, on peut écrire le test suivant dans le fichier index.test.js

import assert from 'node:assert/strict';
import { describe, it } from 'node:test';

import { canRegister } from './index.js';

describe('canRegister', () => {
  it('returns true when age is 18, country is US, and job is engineer', () => {
    const result = canRegister({ age: 18, country: 'US', job: 'engineer' });
    assert.strictEqual(result, true);
  });

  it('returns false when age is 17, country is US, and job is engineer', () => {
    const result = canRegister({ age: 17, country: 'US', job: 'engineer' });
    assert.strictEqual(result, false);
  });
});

À noter qu’il est possible de skip un test avec la syntaxe suivante it([name], { skip: true }[, fn]) ou en ajoutant it.skip

Et on exécute le test avec la commande node --test

node --test va chercher récursivement les fichiers dont le nom est test.js , monfichier.test.js ou encore test-monfichier.js (plus de détail dans la doc). Il est aussi possible de passer un fichier en argument à la commande node --test.

TAP version 13
# Subtest: /node-test-runner/index.test.js
ok 1 - /node-test-runner/index.test.js
  ---
  duration_ms: 44.544125
  ...
1..1
# tests 1
# pass 1
# fail 0
# cancelled 0
# skipped 0
# todo 0
# duration_ms 47.909458

On obtient un retour au format TAP (Test Anything Protocol) https://testanything.org/tap-specification.html ce qui nous permettra de pouvoir utiliser des reporters compatibles avec ce standard.

Par exemple, le module tap-spec permet d’obtenir le rendu suivant :

Il suffit de piper le résultat de node --test dans tape-spec : node --test | tap-spec

Une liste de reporters est disponible ici https://github.com/ljharb/tape#pretty-reporters

Spy, stub et mocks

Contrairement à jest, node:test ne permet pas de faire des spy ou mocks de modules.

Il est possible d’utiliser les librairies suivantes :

Laisser un commentaire