gpt4 book ai didi

node.js - 如何在 describe() 的 before() block 中动态生成 Mocha 测试?

转载 作者:搜寻专家 更新时间:2023-10-31 23:50:24 26 4
gpt4 key购买 nike

我正在创建一个 mocha 测试套件,它正在测试我们的 nwjs 应用调用的命令行实用程序,该实用程序获取文件并生成输出 json 文件。我有数千种输入文件组合,我想生成的测试 (it()s) 取决于 cmdline 实用程序输出的 json 内容。

Mocha 似乎要求我预先创建所有 it(),但这意味着这些脚本需要预先运行并捕获 json 输出。我希望这样做:

'use strict';
const path = require('path');
const glob = require('glob');
const expect = require('sharedjs/chai-wrapper').expect;
const utils = require('sharedjs/utils');

describe('Generated Tests:', function() {
let testNum = 0;
let globOpts = { nodir: true }
let type1files = glob.sync(path.join(filetype1_dir, '*'), globOpts);
let type2files = glob.sync(path.join(filetype2_dir, '*'), globOpts);
for (let i = 0; i < type1files.length; i++) {
for (let j = 0; j < type2files.length; j++) {
testNum++;
let testName = utils.mkTestName(testNum, i, j);

describe(testName, function() {
let run;
before(function() {
run = utils.runCommand(type1files[i], type2files[j]);
// run = { status: result.status, command: result.args.join(' '), output: fse.readJsonSync(outfile) }
if (run.status !== 0) {
throw new Error(run.status+'='+run.command);
}
});

for (let key in run.output.analysis) {
it(key+'=0', function() {
expect(run.output.analysis[key].value).to.be.equal('0', key+'=0');
}
}
});
}
}
});

我将在这里进行数千次命令行调用。我不想让它们全部预先缓存文件(或者更糟,将所有 json 对象加载到内存中)然后开始运行测试。

我知道我可以创建一个高级“验证 json”测试,然后在其中执行一堆 expect(),但这样做有两个问题。首先,它们不会是显示为失败的独立命名测试,其次,第一个预期失败将导致测试失败,因此我无法看到 json 中的其他错误。

想法?

-- 更新了来自 utils.runCommand() 的示例 JSON 输出--

{
data1: { ... },
data2: { ... },
analysis: {
dynamicKey1: <analysisObj>,
dynamicKey...: <analysisObj>,
dynamicKeyN: <analysisObj>
}
}

分析中的关键取决于输入的数据类型,并且有很多可能性。动态键的名称可以随运行而变化。从测试的角度来看,我对 key 的名称不感兴趣,但它的 analysisObj 是一致的。例如,如果我将相同的 data1 和 data2 传递给 utils.runCommand(),那么代表两者之间增量的 analysisObj 部分应该全面为零。

直到我运行脚本后我才得到 analysisObjs,如果我运行 100,000 个测试,我不想预运行或预加载所有这些到内存或文件系统中。

最佳答案

我要感谢@JoshLee 为我指明了一些有用的研究路径。

看完mocha代码,主要关注:

我知道了

  1. describe() 调用返回一个 Suite 对象
  2. Suite 对象包含要运行的测试 (suite.tests)
  3. 当套件的 before() 运行时,没有查看测试
  4. 我可以使用 suite.addTest() 在 before() 方法中添加任意数量的测试,它们都会运行
  5. 最重要的是,我的 utils.runCommand() 仅在每个测试套件开始时运行,并且每个测试套件按顺序运行。 (以前我添加的测试会在所有初始描述 block 运行一次之后进行)

输出符合预期,结果反射(reflect)了适当数量的测试。我已经使用 mochawesome 运行了这个自动生成的 50,000 多个测试,分布在 1980 个测试套件中不均匀对记者来说效果很好。

下面更新的代码片段中描述了完成此操作需要 5 个步骤。


'use strict';
const path = require('path');
const glob = require('glob');
const expect = require('sharedjs/chai-wrapper').expect;
const utils = require('sharedjs/utils');

// Step 1: Pull in Test class directly from mocha
const Test = require('mocha/lib/test');

// Step 2: Simulates it() from mocha/lib/interfaces/bdd.js
// I ignore the isPending() check from bdd.js. I don't know
// if ignoring it is required, but I didn't see a need to add
// it for my case to work
function addTest(suite, title, fn) {
let test = new Test(title, fn);
test.file = __filename;
suite.addTest(test);
return test;
}

let testNum = 0;
let globOpts = { nodir: true }
let type1files = glob.sync(path.join(filetype1_dir, '*'), globOpts);
let type2files = glob.sync(path.join(filetype2_dir, '*'), globOpts);
for (let i = 0; i < type1files.length; i++) {
for (let j = 0; j < type2files.length; j++) {
testNum++;
let testName = utils.mkTestName(testNum, i, j);

// Step 3: Save the suite object so that we can add tests to it.
let suite = describe(testName, function() {
let run;
before(function() {
run = utils.runCommand(type1files[i], type2files[j]);
// run = { status: result.status, command: result.args.join(' '),
// output: fse.readJsonSync(outfile) }
if (run.status !== 0) {
throw new Error(run.status+'='+run.command);
}

for (let key in run.output.analysis) {
// Step 4: Dynamically add tests
// suite is defined at this point since before() is always
// run after describe() returns.
addTest(suite, key+'=0', function() {
expect(run.output.analysis[key].value).to.be.equal('0', key+'=0');
});
}
});
});

// Step 5: Add dummy test in describe() block so that it will be run.
// Can be it() for a pass result or it.skip() for pending.
it('Placeholder for ' + testName, function () {
expect(true).to.be.true;
});
}
}

关于node.js - 如何在 describe() 的 before() block 中动态生成 Mocha 测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53200246/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com