web-dev-qa-db-fra.com

Le coup d'envoi du moka décrit en parallèle

Je veux pouvoir faire en sorte que toutes mes déclarations en moka soient lancées en parallèle. Quelqu'un peut-il m'aider à comprendre comment faire cela?

14
Fizz

Vous ne pouvez pas le faire directement avec mocha car il crée une liste de rappels () et les appelle dans l’ordre. mocha-parallel-tests peut le faire si vous voulez déplacer votre décrit dans des fichiers .js séparés. Pour vous en convaincre, installez-le quelque part et invoquez-le avec un court -slow pour qu'il affiche chaque fois:

laptop:/tmp/delme$ npm install mocha-parallel-tests
laptop:/tmp/delme$ cd node_modules/mocha-parallel-tests
laptop:/tmp/delme/node_modules/mocha-parallel-tests$ ./bin/mocha-parallel-tests test/parallel/tests --timeout 10000 --slow 100

Vous verrez que trois suites de tests (très simples) ont été exécutées dans les délais les plus longs.

Si vos tests ne dépendent pas des effets secondaires des tests précédents, vous pouvez les rendre tous asynchrones. Une façon simple de procéder consiste à lancer les opérations qui prennent un certain temps avant de décrire et à utiliser le moka normal appareil pour l'évaluer. Ici, je crée un tas de promesses qui prennent un certain temps à résoudre, puis je répète à travers les tests, en examinant leurs résultats dans une fonction .then ():

var expect = require("chai").expect;

var SlowTests = [
  { name: "a" , time: 250 },
  { name: "b" , time: 500 },
  { name: "c" , time: 750 },
  { name: "d" , time:1000 },
  { name: "e" , time:1250 },
  { name: "f" , time:1500 }
];

SlowTests.forEach(function (test) {
  test.promise = takeAWhile(test.time);
});

describe("SlowTests", function () {
  // mocha defaults to 2s timeout. change to 5s with: this.timeout(5000);
  SlowTests.forEach(function (test) {
    it("should pass '" + test.name + "' in around "+ test.time +" mseconds.",
       function (done) {
         test.promise.then(function (res) {
           expect(res).to.be.equal(test.time);
           done();
         }).catch(function (err) {
           done(err);
         });
       });
  });
});

function takeAWhile (time) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      resolve(time);
    }, time);
  });
}
(Enregistrez ceci en tant que foo.js et appelez-le avec mocha foo.js.)

Meta Je ne suis pas d'accord avec l'affirmation selon laquelle les tests doivent être principalement synchrones. les pragmas avant et après sont plus faciles, mais il est rare qu'un test invalide tous les tests restants. Tous les tests asynchrones décourageants ne découragent que des tests approfondis des tâches réseau.

9
ericP

Mocha ne supporte pas ce que vous essayez de faire hors de la boîte. Il exécute les tests de manière séquentielle. Cela présente un gros avantage lorsqu'il s'agit d'une exception non gérée: Mocha peut être sûr que cela s'est produit lors du test. Donc, il attribue l'exception au test actuel. Il est certes possible de prendre en charge les tests en parallèle, mais cela compliquerait un peu Mocha.

Et j'ai tendance à être d'accord avec le commentaire de David . Je ne ferais pas ça. Au niveau où opère habituellement Mocha, le parallélisme ne me semble pas particulièrement souhaitable. Là où j’avais déjà utilisé des tests de parallélisme, c’est au niveau de l’exécution de suites de bout en bout. Par exemple, exécutez une suite contre Firefox dans Windows 8.1 tout en exécutant la même suite contre Chrome sous Linux.

10
Louis

Si vous utilisez karma pour démarrer vos tests, vous pouvez utiliser karma-parallel pour répartir vos tests sur plusieurs instances de navigateur. Il exécute les spécifications dans différentes instances de navigateur en parallèle et est très simple et facile à installer:

npm i karma-parallel

puis ajoutez le 'parallèle' à la liste des frameworks dans karma.conf.js

module.exports = function(config) {
  config.set({
    frameworks: ['parallel', 'mocha']
  });
};

karma-parallel

Divulgation: je suis l'auteur

1
Joel Jeske