web-dev-qa-db-fra.com

Comment générer dynamiquement des cas de tests en javascript/node?

Le framework de test de nez (pour python) prend en charge la génération dynamique de scénarios de test au moment de l'exécution (les éléments suivants, issus de la documentation, génèrent cinq scénarios de test distincts):

def test_evens():
    for i in range(0, 5):
        yield check_even, i, i*3

def check_even(n, nn):
    assert n % 2 == 0 or nn % 2 == 0

Comment puis-je obtenir ce résultat en utilisant des frameworks javascript tels que mocha ou qunit? (Je ne suis pas attaché à un cadre particulier à ce stade.)

Mon cas d'utilisation est l'écriture d'un exécuteur de test pour surveiller plusieurs éléments sur un serveur externe. Je fournirais une liste d'URL de ressources. Chaque test tente d'interroger cette ressource et renvoie le succès ou l'échec en fonction de ce qu'il trouve. J'ai un prototype construit en python (en utilisant nose) mais j'aimerais l'implémenter dans node.js si je peux. Finalement, cela serait inclus dans une configuration de CI.

17
Benj

Oui, vous pouvez créer dynamiquement des suites de tests avec des cas utilisant Mocha . J'ai installé mocha globalement npm install -g mocha et j'utilise devrait .

var should = require('should');

var foo = 'bar';

['nl', 'fr', 'de'].forEach(function(arrElement) {
  describe(arrElement + ' suite', function() {
    it('This thing should behave like this', function(done) {
      foo.should.be.a.String();
      done();
    });
    it('That thing should behave like that', function(done) {
      foo.should.have.length(3);
      done();
    });
  });
});
28

Si vous souhaitez créer dynamiquement des tests It() en utilisant des données obtenues de manière asynchrone, vous pouvez (ab) utiliser le hook before() avec un test de paramètre fictif It() pour vous assurer que mocha attend que la fonction before() soit exécutée. Voici l'exemple de ma réponse à une question connexe , par commodité:

before(function () {
    console.log('Let the abuse begin...');
    return promiseFn().
        then(function (testSuite) {
            describe('here are some dynamic It() tests', function () {
                testSuite.specs.forEach(function (spec) {
                    it(spec.description, function () {
                        var actualResult = runMyTest(spec);
                        assert.equal(actualResult, spec.expectedResult);
                    });
                });
            });
        });
});

it('This is a required placeholder to allow before() to work', function () {
    console.log('Mocha should not require this hack IMHO');
});
19
rob3c

Il convient de noter qu’en plus de la réponse acceptée ci-dessus, les documents de de Mocha incluent à présent un exemple de la manière de réaliser cela . Je l'ai reproduit ci-dessous pour la postérité.

var assert = require('assert');

function add() {
  return Array.prototype.slice.call(arguments).reduce(function(prev, curr) {
    return prev + curr;
  }, 0);
}

describe('add()', function() {
  var tests = [
    {args: [1, 2],       expected: 3},
    {args: [1, 2, 3],    expected: 6},
    {args: [1, 2, 3, 4], expected: 10}
  ];

  tests.forEach(function(test) {
    it('correctly adds ' + test.args.length + ' args', function() {
      var res = add.apply(null, test.args);
      assert.equal(res, test.expected);
    });
  });
});
9
Tom Spencer

Avec Mocha 1.21.4, vous pouvez créer une suite/un test lors de l'exécution de la manière suivante.

require('chai').should()

Mocha = require 'mocha'
Test = Mocha.Test
Suite = Mocha.Suite


mocha = new Mocha
suite = Suite.create mocha.suite, 'I am a dynamic suite'
suite.addTest new Test 'I am a dynamic test', ->
  true.should.equal true

mocha.run () ->
  console.log("done")

Voir https://Gist.github.com/cybertk/fff8992e12a7655157ed pour plus de détails

7
Quanlong

Oui! Brilliant conseil de Quanlong !

Voici mon exemple de génération de test dynamique avec le module readline module de Node:

const Mocha = require('mocha');
var Test = Mocha.Test;
var Suite = Mocha.Suite;

var mocha = new Mocha();
var suite = Suite.create(mocha.suite, 'My test suite with dynamic test cases');

lineReader.on('line', function (line) {
    suite.addTest(new Test(line, function () {
        return true;
    }));
})
    .on('close', function () {
        mocha.run();
    });
4
Michael Yurin

J'aime la réponse de @ rob3c, mais j'ai essayé de la simplifier un peu:

describe("Master test suite", function () {
  before(async function () {
    const rows = await mySQLQuery();

    describe(`Testing ${rows.length} rows`, function () {
      rows.forEach(function (row, index) {
        it(`Test row ${index}`, async function() {
          console.log("your row assertions go here")
        });
      });
    });
  });


  it("stub", async function(){})  // this is important!
});
0
Jeff Lowery