【发布时间】:2018-11-08 01:17:36
【问题描述】:
我正在创建一个 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>
}
}
分析中的关键取决于输入的数据类型,并且存在大量可能性。动态键的名称可以随运行而变化。从测试的角度来看,我对密钥的名称不感兴趣,但它的 analysisObj 是一致的。例如,如果我将相同的 data1 和 data2 传递给 utils.runCommand(),则表示两者之间的 delta 的部分 analysisObj 应该全为零。
直到我运行脚本之后我才得到 analysisObjs,如果我正在运行 100,000 个测试,我不想将所有这些预运行或预加载到内存或文件系统中。
【问题讨论】:
-
谢谢。很好读,但这并不能解决我的问题。我的问题在@sripberger 的评论中突出显示在该页面上“不幸的是,您将无法在输出中为每个项目进行完全独立的测试。如果您想要这个,您可以查看另一个测试运行器。我没有真的有足够的经验与其他人说他们是否支持这一点。不过,如果他们这样做,我会感到惊讶,因为这很不寻常。我知道我可以做单独的 expect()s,我想要的是延迟创建新的 it()s。
-
JSON 输出的一个例子可能会有所帮助——例如您在多大程度上真正动态地创建测试用例,是否可以将其硬塞到预定义的东西中?
-
我同意可能需要另一个测试运行器。我曾经在 Python 中使用
nose来做到这一点——只要你遇到一个测试用例yield,它就会被合并到套件中。 -
@JoshLee ,我已经更新了原始帖子以包含一个 json 对象和解释。