在所有类中的所有测试运行之后,Mocha运行

时间:2014-11-05 15:53:15

标签: node.js mocha

所以我使用的是mocha,我有超过10个JS类的测试。我已经构建了一个日志变量,该变量适用于这10个类的整个测试运行。现在我想做的是在最后一次测试运行之后,我想把这个日志写到一个文件中。

所以我做的第一件事就是在每个班级写下这样的东西

test.afterEach(function() {
    currentTest = this.currentTest;

    if(currentTest.state === 'failed') {
        common.takeScreenshot(driver, common.getTestName() + " - Failed.jpg");
    }

    common.writerLoggerToFile(this.currentTest.title+ ".json");

    driver.quit();
});

这将为每个测试创建一个文件。我知道我可以做test.after会将它减少到每个类一个文件。我在上一个创建的文件中注意到的事情包含来自所有测试的所有数据。所以我希望它是一个文件。

注意:这些文件正在json中存储数据,因此我不能简单地将文件附加到文件中。如果摩卡有解决方案或者我需要构建解决方案吗?感谢

3 个答案:

答案 0 :(得分:1)

您也可以将您的测试包装到一个套件中,在根套件中您可以初始化必要的内容,例如数据库连接等。然后,您可以使用 global variable 在套件之间传递必要的信息。

测试套件 1 (suite1.test.js):

describe("Root of Suite 1", function () {

    describe("Function of Suite 1", function () {
        it("should do ..", async function () {
            ...
        });
    });
});

测试套件 2 (suite2.test.js):

describe("Root of Suite 2", function () {

    // This will inform root suite about the completion of tests
    after(function () {
        global.isTestsCompleted = true;
    });

    describe("Function of Suite 2", function () {
        it("should do ..", async function () {
            ...
        });
    });
});

根套件(root.test.js):

const { isReady } = require("../db");

describe("Root Suite", function () {
    this.timeout(60000);

    // Wait until the DB connection is ready
    before(function (done) {
        isReady().then(() => done());
        global.isTestsCompleted = false;
    });

    // Check the variable every 500ms to see if all test suites executed
    after(function () {
       setInterval(() => {
           if (global.isTestsCompleted) {
               process.exit(1);
           }
       }, 500); 
    });

    require("./suite1.test.js");
    require("./suite2.test.js");
});

在上面,套件的顺序很重要。它们将按照我们导入的顺序执行。因此,我们将控制机制放在最后一个套件 suite2.test.js 中。

更新 还有一个内部选项可以在所有测试运行后终止 mocha 进程:mocha --exit。 因此,在这种情况下我们不需要使用全局变量,根套件将如下所示:

const { isReady } = require("../db");

describe("Root Suite", function () {
    this.timeout(60000);

    // Wait until the DB connection is ready
    before(function (done) {
        isReady().then(() => done());
    });

    require("./suite1.test.js");
    require("./suite2.test.js");
});

答案 1 :(得分:0)

考虑使用jsonjson-stream记者。

mocha -R json >> your-file.json

答案 2 :(得分:0)

我最近遇到了类似的问题。我已经通过嵌套套件解决了它。

这是我的根套件:

import utils from './utils'

describe('ROOT SUITE', function () {

  before(async function(){    
    await utils.before()    
    console.log('ROOT BEFORE')
  })

  // Require specs to consume
  require('require-dir')('./specs')

  after(async function(){
    await utils.after()
    console.log('ROOT AFTER')
  })  
})

这是我的套房之一

import utils from '../utils'

describe('General tests', function() {
  
  let app = null
  
  before(function(){
    app = utils.app
    console.log('local before')
  })
  after(function(){
    console.log('local after')
  })

  beforeEach(function(){
    console.log('local beforeEach')
  })
  afterEach(function(){
    console.log('local afterEach')
  })

  it('shows the proper application title', function () {
    return app.client.getTitle()
      .then(title => {
        expect(title).to.equal('electron-vue-testing-project')
      })
  }),
  it('is true', function () {
    return expect(true).to.be.true
  })
})