我如何dynamic生成JavaScript /节点中的testing用例?

鼻子testing框架(用于python)支持在运行时dynamic生成testing用例 (以下是从文档中得出的五个不同的testing用例):

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 

我怎样才能达到这个结果使用JavaScript框架,如摩卡或qunit? (在这一点上我没有附加任何特定的框架)

我的用例是编写一个testing运行器来监视外部服务器上的多个项目。 我会提供一个资源URL列表。 每个testing都会尝试轮询该资源,并根据find的内容返回成功或失败。 我有一个使用Python创build的原型(使用鼻子),但是如果可以的话,我想在node.js中实现。 最终,这将包括在CI设置中。

是的,你可以使用Mochadynamic创buildtesting套件。 我已经安装了摩卡全球npm install -g mocha和我使用应该 。

 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(); }); }); }); 

如果要使用asynchronous获取的数据dynamic创buildIt()testing,可以(ab)使用带有占位符的before()钩子来testing以确保mocha等待before()运行。 为了方便起见,下面是我对相关问题的答案 。

 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'); }); 

值得注意的是,除了上面所接受的答案之外, 摩卡的文档现在还包含了一个如何实现这个目标的例子 。 我已经在后面转载了后人。

 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); }); }); }); 

使用Mocha 1.21.4,您可以按照以下方式在运行时创build套件/testing。

 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") 

有关详情,请参阅https://gist.github.com/cybertk/fff8992e12a7655157ed

是的! 来自泉龙的精彩build议!

下面是我使用Node的readline模块生成dynamictesting的例子:

 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(); });