将测试ID添加到单元测试以进行报告

时间:2015-11-05 19:46:18

标签: javascript node.js unit-testing mocha

我正在使用mocha并尝试构建一个单独报告测试的测试系统。目标是在项目要求和单元测试中定义的测试之间具有可追溯性。因此,例如,测试'必须能够创建新的小部件'在ID为' 43'的需求数据库中,我希望测试该条件的单元测试报告类似Test 43, Must be able to create new widgets, pass的内容,然后更新相应的数据库条目(另一个服务可能负责这一点)。

可以在摩卡中完成吗?到目前为止我唯一发现的是将it()函数中的文本替换为测试ID,然后使用json报告器处理结果(但后来我没有得到文本)对于正在测试的内容,除非我将它们组合起来并进行某种解析)。注意:并非所有测试都有id。

以下是我希望

的功能示例
describe("Widget" function() {
  it("should allow creation of widgets", function() {
    this.id = 43;
    result = widget.create();
    expect.result.to.exist;
  });
});

然后是一个钩子,比如

afterEach(function(test) {
  if (test.hasOwnProperty('id')) {
    report(test.result);
  }
});

或自定义记者,或某种适配器。

runner.on('test end', function(test) {
  console.log(test.id); //doesn't exist, but i want it to
  report(test);
});

2 个答案:

答案 0 :(得分:0)

这取决于您的断言库。 使用Chai,您可以选择文字字段。

assert.should.exist(result, 'expect Result to exist (Id 43)');

使用Jasmine,您可以将测试引用添加到它():

describe("Widget" function() {
  it("should allow creation of widgets (Id 43)", function() {

要使用Mocha custom reporters,您可以尝试在测试套件中定义一个。

module.exports = MyReporter;

function MyReporter(runner) {
  var passes = 0;
  var failures = 0;

  runner.on('pass', function(test){
    passes++;
    console.log('pass: %s', test.fullTitle());
  });

  runner.on('fail', function(test, err){
    failures++;
    console.log('fail: %s -- error: %s', test.fullTitle(), err.message);
  });

  runner.on('end', function(){
    console.log('end: %d/%d', passes, passes + failures);
    process.exit(failures);
  });
}

这里有2条建议。第一个是最简单的,只是简单地将你的id添加到it()的描述中,然后它将显示已经通过和失败的内容。这将是达到目标的最快捷方式。

但是,如果你想拥有更高级的方法,并且可以测试以确保设置的东西,那么你可以使用自定义报告器,如果没有设置ID,这将允许你通过测试失败。

答案 1 :(得分:0)

我想要的和存在的是如此接近!我能够使用报告中的测试的ctx属性来解决这个问题。 test.ctx.id

test.js

describe("Widget" function() {
  it("should allow creation of widgets", function() {
    this.id = 43;
    result = widget.create();
    expect.result.to.exist;
  });
});

reporter.js

runner.on('test end', function(test) {
  console.log(test.ctx.id);
  report(test);
});