web-dev-qa-db-fra.com

Comment définir l'ordre d'exécution des cas de test mocha dans plusieurs fichiers

J'ai deux fichiers javascript qui contiennent des cas de test mocha.

//----------abc.js -------------

describe("abc file", function(){
  it("test 1" , function(){
    assert.equal(20 , 20); 
  });
}); 

//---------xyz.js--------------
describe("xyz file", function(){
      it("test 1" , function(){
        assert.equal(10 , 10); 
      });
    });

Je les ai placés dans un dossier appelé test et lorsque j'exécute la commande mocha, le premier fichier (abc.js) est toujours exécuté avant xyz.js. J'ai pensé que cela pouvait être dû à un ordre alphabétique et j'ai renommé les fichiers en

abc.js => xyz.js
xyz.js => abc.js

mais quand même, le contenu de xyz.js (anciennement abc.js) est exécuté en premier. Comment puis-je modifier l'ordre d'exécution de ces fichiers de test?

38
tnishada

Mocha a un --sort (court -S) option qui trie les fichiers de test:

$ mocha --help

[...]
    -S, --sort                              sort test files
[...]
23
Louis

Dans le deuxième fichier, exigez le premier:

--- two.js ---
require("./one")

Mocha exécutera les tests dans l'ordre d'exécution des appels describe.

47
Peter Lyons

Je poursuis une solution totalement distincte pour cela.

Mettez tous vos tests dans un dossier nommé test/et créez un fichier tests.js dans le répertoire racine dans l'ordre d'exécution

--- tests.js ---
require('./test/one.js')
require('./test/two.js')
require('./test/three.js')

Et dans les fichiers de tests one.js, two.js et ainsi de suite, écrivez vos tests mocha simples

de cette façon, si vous souhaitez les exécuter dans l'ordre que vous avez défini, exécutez simplement mocha tests.js

35
Priyanshu Jindal

Étant donné que mocha trie les fichiers par ordre alphabétique, je préfixe généralement les noms de mes fichiers de test avec des nombres, comme:

  • 0 - util.js
  • 1 - something low level.js
  • 2 - something more interesting.js

etc.

En plus d'être vraiment facile à entretenir (pas de grognement de gorgée ou de n'importe quoi de non-sens, pas de modification de votre package.json ...), il offre l'avantage que:

  • les personnes qui lisent votre code source ont une idée de la structure de votre programme, en commençant par les parties les moins intéressantes et en passant à la couche métier
  • lorsqu'un test échoue, vous avez une indication de causalité (si quelque chose a échoué dans 1 - something.js mais il n'y a pas d'échecs dans 0 - base.js alors c'est probablement la faute de la couche couverte par 1 - something.js

Si vous faites de vrais tests unitaires, l'ordre des cours ne devrait pas avoir d'importance, mais je suis rarement en mesure d'aller avec des tests unitaires jusqu'au bout.

13
djfm

Si vous préférez un ordre particulier, vous pouvez lister les fichiers (dans l'ordre) comme arguments de ligne de commande dans mocha, par exemple:

$ mocha test/test-file-1.js test/test-file-2.js

Pour éviter de trop taper chaque fois que vous voulez l'exécuter, vous pouvez transformer ceci en un script npm dans votre package.json:

{
  // ...
  "scripts": {
    "test": "mocha test/test-file-1.js test/test-file-2.js"
  }
  // ...
}

Exécutez ensuite votre suite à partir de la ligne de commande:

$ npm test

Ou si vous utilisez Gulp, vous pouvez créer une tâche dans votre gulpfile.js:

var gulp = require('gulp');
var mocha = require("gulp-mocha");

gulp.task("test", function() {
  return gulp.src([
      "./test/test-file-1.js",
      "./test/test-file-2.js"
    ])
    .pipe(mocha());
});

Exécutez ensuite $ gulp test.

5
David Schneider

La façon dont cela a fonctionné pour que mes tests soient exécutés dans un ordre spécifique était de créer un fichier test.js distinct, puis d'ajouter un describe pour chaque fichier de test mocha que je voulais exécuter.

test.js:

describe('test file 1', function() {
  require('./test1.js')
})

describe('test file 2', function() {
  require('./test2.js')
})

Ensuite, exécutez simplement mocha test.js

1
André Marcelino