home

article

`cluster` code coverage with istanbul

[istanbul] is already supported Multiple Process Coverage.

cluster code coverage with istanbul

istanbul is already supported Multiple Process Coverage.

I want to show you how to create code coverage using istanbul.

master.js

const cluster = require("cluster");
const path = require("path");

const workerPath = path.join(__dirname, "worker.js");

// setup cluster if running with istanbul coverage
if (process.env.running_under_istanbul) {
  // use coverage for forked process
  // disabled reporting and output for child process
  // enable pid in child process coverage filename
  cluster.setupMaster({
    exec: "./node_modules/.bin/istanbul",
    args: [
      "cover",
      "--report",
      "none",
      "--print",
      "none",
      "--include-all-sources",
      "--include-pid",
      workerPath,
    ],
  });
} else {
  cluster.setupMaster({
    exec: workerPath,
  });
}

// fork two workers
cluster.fork();
cluster.fork();

worker.js

const koa = require("koa");

const app = koa();

app.use(function* () {
  if (this.query.uid) {
    return (this.body = {
      uid: this.query.uid,
    });
  }

  this.status = 403;
  this.body = {
    error: "please login first",
  };
});

app.listen(1984);
console.log("[%s] start listening on 1984", process.pid);

test/all.test.js

Using mocha and supertest.

const request = require("supertest");

describe("cluster coverage unittest", function () {
  before(function (done) {
    require("../master");
    const port = 1984;
    const app = {
      port: port,
      url: "http://127.0.0.1:" + port,
      address: function () {
        return {
          port: port,
        };
      },
      // mock koa api
      callback: function () {
        return app;
      },
    };
    this.app = app;
    setTimeout(done, 1500);
  });

  it("should 200 when user login", function (done) {
    request(this.app.callback())
      .get("/?uid=123")
      .expect({
        uid: "123",
      })
      .expect(200, done);
  });

  it("should 403 when anonymous user request", function (done) {
    request(this.app.callback())
      .get("/")
      .expect({
        error: "please login first",
      })
      .expect(403, done);
  });
});

run test

Run the unittest and create coverage report

$ npm run cov

> cluster-coverage@ cov /Users/mk2/git/fengmk2.github.com/blog/2015/cluster-coverage
> npm run clean && npm run test-cov && istanbul report


> cluster-coverage@ clean /Users/mk2/git/fengmk2.github.com/blog/2015/cluster-coverage
> rm -rf coverage


> cluster-coverage@ test-cov /Users/mk2/git/fengmk2.github.com/blog/2015/cluster-coverage
> istanbul cover --include-all-sources node_modules/.bin/_mocha -- --check-leaks test/*.test.js

> istanbul report

See the cluster-coverage report

Thank you for reading, and have a great day!

Comments