Comment exécuter un seul test avec Mocha?

292

J'utilise Mocha pour tester mes trucs JavaScript. Mon fichier de test contient 5 tests. Est-il possible d'exécuter un test spécifique (ou un ensemble de tests) plutôt que tous les tests du fichier?

Misha Moroshko
la source

Réponses:

355

Essayez d'utiliser l' --grepoption de mocha :

    -g, --grep <pattern>            only run tests matching <pattern>

Vous pouvez utiliser toute expression rationnelle JavaScript valide en tant que <pattern>. Par exemple, si nous avons test/mytest.js:

it('logs a', function(done) {
  console.log('a');
  done();
});

it('logs b', function(done) {
  console.log('b');
  done();
});

Ensuite:

$ mocha -g 'logs a'

Pour exécuter un seul test. Notez que cela grince à travers les noms de tous describe(name, fn)et les it(name, fn)invocations.

Envisagez d'utiliser des describe()appels imbriqués pour l'espace de noms afin de faciliter la localisation et la sélection d'ensembles particuliers.

Asherah
la source
1
Merci! J'avais l'impression que --grepseulement filtré des @balises.
kumarharsh
5
Lorsque vous utilisez Mocha par programmation (par exemple depuis Grunt), il y a une option catch: grep doit être un objet «RegExp ()». S'il s'agit d'une chaîne, elle sera échappée.
h-kippo
1
c'est la seule solution qui a fonctionné pour moi. la spécification de fichiers sur la ligne de commande ( mocha some/test.js) ne fonctionnait pas du tout. Merci!
hraban
2
Y a-t-il un moyen d'éviter de courir également logs a bcdqui contient la logs asous-chaîne? Regexp ^$ne fonctionne pas sur 0.10.2.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Merci. J'obtiens des erreurs si je ne spécifie pas le répertoire car mocha -g 'enregistre a'.
kta
166

En fonction de votre modèle d'utilisation, vous pouvez simplement utiliser uniquement . Nous utilisons le style TDD; cela ressemble à ceci:

test.only('Date part of valid Partition Key', function (done) {
    //...
}

Seul ce test s'exécutera à partir de tous les fichiers / suites.

J Burnett
la source
5
BDD fonctionne de la même manière. C'est idéal lorsque vous travaillez sur un seul test. Il peut également être utilisé au niveau de la suite / description
andyzinsser
14
Avec chai et attendez-vous à une syntaxe it.only.
elkelk
4
Cette réponse est meilleure car elle fonctionnera également lorsque le moka est utilisé à l'intérieur du karma, etc.
Vivek Kodira
2
it.onlyne fonctionne pas avec givende mocha-testdata . Et il est facile d'oublier de le retirer plus tard.
Tr1et
4
eslint-plugin-mochaa une règle no-exclusive-testsqui vous rattrapera si vous oubliez de supprimer .only.
dostu
84

Si vous utilisez npm test(à l'aide de scripts package.json), utilisez un-- pour passer le paramètre à mocha

par exemple npm test -- --grep "my second test"

EDIT : On dirait que --greppeut être un peu difficile (probablement en fonction des autres arguments). Vous pouvez:

Modifiez le package.json:

"test:mocha": "mocha --grep \"<DealsList />\" .",

Ou bien utiliser --bailce qui semble moins difficile

npm test -- --bail
Ashley Coolman
la source
3
A travaillé pour moi. Merci :)
Jill-Jênn Vie
1
@Andy --grep peut être un peu difficile - essayez de le mettre juste après mocha dans l'entrée de script npm. Sinon, npm test -- --bailc'est utile pour écoper après le premier test qui a échoué
Ashley Coolman
1
passer des tirets supplémentaires avant de --grepsauver ma journée! Merci beaucoup. PS. Je suis sous Windows, en cours d'exécutionnpm test -- --grep @tag
Mykola
18

exécuter un seul test - par nom de fichier -

En fait, on peut également exécuter un seul test mocha par nom de fichier (pas seulement par "it () - string-grepping") si vous supprimez le motif glob (par exemple ./test/**/*.spec.js) de vos mocha.opts, créez respectivement une copie, sans:

node_modules/.bin/mocha --opts test/mocha.single.opts test/self-test.spec.js

Voici mon mocha.single.opts (c'est seulement différent en manquant la ligne glob susmentionnée)

--require ./test/common.js
--compilers js:babel-core/register
--reporter list
--recursive

Contexte: Bien que vous puissiez remplacer les divers commutateurs du fichier opts (en commençant par --), vous ne pouvez pas remplacer le glob . Ce lien contient également quelques explications.

Astuce: si node_modules/.bin/mochavous êtes confus, utilisez le paquet local mocha. Vous pouvez également écrire simplement mocha, si vous l'avez installé à l'échelle mondiale.


Et si vous voulez le confort de package.json: Toujours: retirez le **/*glob -ish de votre mocha.opts, insérez-les ici, pour tous les tests, laissez-les de côté pour le seul test:

"test": "mocha ./test/**/*.spec.js",
"test-watch": "mocha -R list -w ./test/**/*.spec.js",
"test-single": "mocha $1",
"test-single-watch": "mocha -R list -w $1",

usage:

> npm run test

respectivement

> npm run test-single -- test/ES6.self-test.spec.js 

(attention --!)

Frank Nocke
la source
1 $ n'était pas nécessaire dans ma configuration, au lieu de cela, il a conduit à des avertissements comme: Warning: Could not find any test files matching pattern: $1
Merijn Vogel
15

Utilisez simplement .only avant «décrire», «il» ou «contexte». Je lance en utilisant "$ npm run test: unit", et il exécute uniquement les unités avec .only.

describe.only('get success', function() {
 // ...
});

it.only('should return 1', function() {
  // ...
});
QauseenMZ
la source
11

Les solutions ci-dessus ne fonctionnaient pas pour moi. L'autre façon d'exécuter un seul test est

mocha test/cartcheckout/checkout.js -g 'Test Name Goes here'

Cela permet d'exécuter un scénario de test à partir d'un seul fichier et avec un nom spécifique.

Ruthreshwar
la source
1
Utilisez une expression suffisamment sélective -get vous n'aurez pas besoin de spécifier un nom de fichier. Si vous ne pouvez pas écrire une expression suffisamment sélective, cela signifie que vous ne nommez pas correctement vos tests.
Louis
10
npm test <filepath>

par exemple :

npm test test/api/controllers/test.js

ici 'test / api / controllers / test.js' est chemin de fichier.

Jitendra Pawar
la source
8

Vous pouvez essayer "it.only"

 it.only('Test one ', () => {

            expect(x).to.equal(y);
        });
it('Test two ', () => {

            expect(x).to.equal(y);
        });

en cela, le premier seulement exécutera

Bikesh M
la source
2
Dangereux si les tests ne sont pas exécutés via --forbid-onlysur le serveur CI / build. .onlya tendance à se faufiler dans la branche principale et à rendre les autres tests muets car ils ne s'exécuteront plus. J'en suis venu à penser au workflow de changer le code pour exécuter différents tests et une anti-fonctionnalité. Le lanceur de test doit déterminer quels tests doivent être exécutés (alias tests balisés) et non le développeur.
k0pernikus
Je l'ai utilisé pour tester une fonctionnalité dans mon local, Remarque: ne pas valider le code avec it.onlyle repo
Bikesh M
0

Je ne sais pas pourquoi la méthode grep ne fonctionne pas pour moi lors de l'utilisation du test npm. Cela fonctionne cependant. Je dois également spécifier le dossier de test également pour une raison quelconque.

test npm - test / someest.js

Andy N
la source
0

Consolidez tous vos tests dans un fichier test.js et votre package json ajoute des scripts comme:

  "scripts": {
  "api:test": "node_modules/.bin/mocha --timeout 10000 --recursive api_test/"
},

Tapez la commande sur votre répertoire de test:

npm run api:test
Shahin
la source