gotwarlost / istanbul

Yet another JS code coverage tool that computes statement, line, function and branch coverage with module loader hooks to transparently add coverage when running tests. Supports all JS coverage use cases including unit tests, server side functional tests and browser tests. Built for scale.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Configuring istanbul with mocha

dankohn opened this issue · comments

Istanbul works flawlessly with jasmine-node, using the command: `istanbul cover jasmine-node test'

Is it possible to use istanbul with mocha, in a similar way. I get the following:

$ istanbul cover mocha -u exports -R spec

fs.js:684
  return binding.stat(pathModule._makeLong(path));
                 ^
Error: ENOENT, no such file or directory 'exports.js'
    at Object.fs.statSync (fs.js:684:18)
    at lookupFiles (/usr/local/share/npm/lib/node_modules/mocha/bin/_mocha:390:17)
    at spinner (/usr/local/share/npm/lib/node_modules/mocha/bin/_mocha:268:24)
    at Array.forEach (native)
    at Object.<anonymous> (/usr/local/share/npm/lib/node_modules/mocha/bin/_mocha:267:6)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:901:3
No coverage information was collected, exit without writing coverage information

I tried using https://github.com/arikon/mocha-istanbul as the reporter but got a similar error.

So there are two issues with the command you are running:

  • The -u exports and -R spec are considered to be istanbul flags rather than mocha flags and are silently ignored.

To fix this, use:

istanbul cover mocha -- -u exports -R spec # note the double-dash between mocha and options
  • mocha forks for running tests and istanbul will not hook require in the sub-process

At this point, mocha will at least honor the options but it still won't provide coverage. That's because the mocha executable forks the _mocha executable to run tests (to be able to support node options etc.)

So what you need is:

istanbul cover _mocha -- -u exports -R spec # note the leading underscore 

At this point everything should work. Let me know how it goes.

Yes, this worked perfectly. Thanks so much. istanbul is amazing.

Thank you for adding this, been trying to find a good guide on how to achieve this combo

I have another issue similar with this. How to send --harmony flag to _mocha. I tried many options, but nothing to work. With mocha --harmony flag work perfectly, but istanbul stops working.

You can't directly do this with the istanbul command (because that runs node implicitly).

Assuming the original command was:

istanbul cover _mocha -- -u exports -R spec 

turn it into:

node --harmony node_modules/istanbul/lib/cli.js cover _mocha -- -u exports -R spec

Thanks, it helped partially, but now I get SyntaxError: Unexpected strict mode reserved word.

/Users/simonenko/Sites/projects/yamb/lib/yamb/proto/methods/save.js:9
XiYtwg.b['10'][0]++;__cov_H$BUi8TOdhvMxeE7XiYtwg.s['37']++;let data=yield asyn
                                                                    ^^^^^

I tried to run istanbul with node --harmony --use_strict, but now I've got istanbul error.

/Users/simonenko/Sites/projects/yamb/node_modules/istanbul/node_modules/mkdirp/index.js:9
        mode = 0777 & (~process.umask());
               ^^^^
Octal literals are not allowed in strict mode.
SyntaxError: Octal literals are not allowed in strict mode.

Did you try adding a "use strict";' at the top of the file where you are usinglet`? (instead of globally turning on strict I mean)

Yeah, but the feeling that it disappears. All my files have "use strict" at the top of the file.

You are most likely using a version of istanbul that does not handle file level strict mode correctly. Please use the harmony branch of this source tree to get the correct version. This also depends on the harmony branch of the esprima source tree so you will get a consistent set of dependencies. Not all es6 constructs are supported by the tools at this point so you may still have issues. Let me know what you find.

All this time I used the harmony branch. And all my files have "use strict" at the top of the file. If I run mocha without istanbul all tests passed. See my dependency versions:

  , "devDependencies": {
        "mocha": "~1.16"
      , "should": "~2.1"
      , "coveralls": "~2.6"
      , "istanbul": "git://github.com/gotwarlost/istanbul.git#harmony"
    }

I can't seem to get --harmony working either. I tried node --harmony node_modules/.bin/_mocha and it worked fine, but using node --harmony node_modules/.bin/istanbul cover _mocha on the harmony branch just gives me this long error. Not entirely sure how that qualifies as an unexpected identifier...

/apps/test-app/app/controllers/users.js:9
sole.log('before user');__cov_82tiDfzAM405_Tb8tPefzw.s['3']++;yield next;};__c
                                                                    ^^^^
No coverage information was collected, exit without writing coverage information
SyntaxError: Unexpected identifier
    at exports.runInThisContext (vm.js:69:16)
    at Module._compile (module.js:432:25)
    at Object.Module._extensions..js (/apps/test-app/node_modules/istanbul/lib/hook.js:99:20)
    at Module.load (module.js:349:32)
    at Function.Module._load (module.js:305:12)
    at Module.require (module.js:357:17)
    at require (module.js:373:17)
    at Object.<anonymous> (/apps/test-app/test/controllers.users.js:1:82)
    at Module._compile (module.js:449:26)
    at Module._extensions..js (module.js:467:10)
    at Object.Module._extensions..js (/apps/test-app/node_modules/istanbul/lib/hook.js:101:13)
    at Module.load (module.js:349:32)
    at Function.Module._load (module.js:305:12)
    at Module.require (module.js:357:17)
    at require (module.js:373:17)
    at /apps/test-app/node_modules/mocha/lib/mocha.js:172:27
    at Array.forEach (native)
    at Mocha.loadFiles (/apps/test-app/node_modules/mocha/lib/mocha.js:169:14)
    at Mocha.run (/apps/test-app/node_modules/mocha/lib/mocha.js:356:31)
    at Object.<anonymous> (/apps/test-app/node_modules/mocha/bin/_mocha:359:16)
    at Module._compile (module.js:449:26)
    at Module._extensions..js (module.js:467:10)
    at Object.Module._extensions..js (/apps/test-app/node_modules/istanbul/lib/hook.js:101:13)
    at Module.load (module.js:349:32)
    at Function.Module._load (module.js:305:12)
    at Function.Module.runMain (module.js:490:10)
    at runFn (/apps/test-app/node_modules/istanbul/lib/command/common/run-with-cover.js:110:16)
    at /apps/test-app/node_modules/istanbul/lib/command/common/run-with-cover.js:213:17
    at /apps/test-app/node_modules/istanbul/lib/util/file-matcher.js:52:16
    at /apps/test-app/node_modules/istanbul/lib/util/file-matcher.js:35:9
    at Object.next (/apps/test-app/node_modules/istanbul/node_modules/fileset/lib/fileset.js:41:14)
    at Fileset.EventEmitter.emit (events.js:101:17)
    at Fileset.Glob._processEmitQueue (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:313:10)
    at Fileset.Glob._pushMatch (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:287:8)
    at Fileset.Glob.emitMatch (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:292:10)
    at Fileset.Glob._finish (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:220:8)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:178:27)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:447:32)
    at Fileset.cb (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:334:11)
    at Fileset.<anonymous> (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:414:14)
    at Fileset.Glob._afterReaddir (/apps/test-app/node_modules/istanbul/node_modules/fileset/node_modules/glob/glob.js:657:17)
    at Object.oncomplete (fs.js:97:15)

@Qard - that actually looks like the instrumenter emitted some bad code. Is there a way you can share the users.js file with me? Or if you could provide a reproducible test case that would be great too.

Awesome!

Hi, I am trying to use Istanbul but I am getting following error:-
istanbul cover _mocha -- -u exports -R spec

C:\Users\asrivastava1\AppData\Roaming\npm_mocha.CMD:1
(function (exports, require, module, __filename, __dirname) { @if EXIST "%~dp0
^
No coverage information was collected, exit without writing coverage information

SyntaxError: Unexpected token ILLEGAL
at Module._compile (module.js:439:25)
at Module._extensions..js (module.js:474:10)
at Object.Module._extensions..js (C:\Users\asrivastava1\AppData\Roaming\npm
node_modules\istanbul\lib\hook.js:102:13)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at runFn (C:\Users\asrivastava1\AppData\Roaming\npm\node_modules\istanbul\li
b\command\common\run-with-cover.js:114:16)
at C:\Users\asrivastava1\AppData\Roaming\npm\node_modules\istanbul\lib\comma
nd\common\run-with-cover.js:232:17
at C:\Users\asrivastava1\AppData\Roaming\npm\node_modules\istanbul\lib\util
file-matcher.js:56:16
at C:\Users\asrivastava1\AppData\Roaming\npm\node_modules\istanbul\lib\util
file-matcher.js:35:9

Can you please guide me what am I doing wrong

Using _mocha directly does not work on windows. Please use the full path to the JS file instead

Yeah I just figured that if I use following command then it does run :-
"./node_modules/.bin/istanbul" cover "./node_modules/mocha/bin/mocha" -- server/*/_.js -R spec

Thank you, #44 also solved my problem. In Windows 7, I just use
istanbul cover {my_npm_path}\node_modules\mocha\bin_mocha

hey @gotwarlost, i'm on osx 10 and running the following script for a simple express app via npm test results in "No coverage information was collected, exit without writing coverage information" even though the tests run successfully:

istanbul cover _mocha -- -R tap \"test/*-test.js\"

what's the best way to debug the reason that coverage.json is not being generated?

curious b/c the following does generate a coverage.json, as well as, the CLI summary output:

istanbul cover app.js

Hi Team,
Even we tried with full path in windows 7 m/c ,it doesn't works. All Tests were executed and passed ,No coverage information was collected, exit without writing coverage information.

istanbul cover C:\Users\user_sam\AppData\Roaming\npm\node_modules\mocha\bin\mocha -- -R spec

D:\BaseRepo3\FirstNodejsWebApp>istanbul cover D:\KBaseRepo3\FirstNodejsWebApp\node_modules\mocha\bin_mocha -- -R spec

KB unit test
V should return all article (91ms)
V should return home Page (173ms)
V should return article by TagName
V should return article by ID
UnitTestTag added to the article with id = 564d9eddd33338af2dd709d
V should add newtag by iD AND TAG
V should list all the available TAGs
V should list of top 5 articles
V should list articles matching all tags

8 passing (785ms)

No coverage information was collected, exit without writing coverage information

Please help!!

@Om-sudhir try linking to the _mocha file instead of mocha

Just saying - it would be a lot cooler if mocha tests could be run with the plain old Node executable.

@ORESoftware you can use https://github.com/bcoe/nyc for that and it works really well!

@xjamundx thanks.

My problem with istanbul is it does not return any coverage info. "No coverage information was collected, exit without writing coverage information."

I've just installed nyc and it works for me. Now I got needed info within ".nyc_output", and if I run nyc report --reporter=lcov it will generate "coverage" folder like what istanbul should does.

I'm stumped. I'm running istanbul@0.4.3 and mocha@2.4.5. My mocha.opts file includes the --harmony_destructuring flag. Running npm test executes this script:

sudo -u www-data NODE_ENV=test mocha

The tests execute exactly as expected. When I execute the coverage script, though, I always get an unknown option error:

error: unknown option `--harmony_destructuring'

I've tried each of the following:

$ NODE_ENV=test node --harmony_destructuring node_modules/istanbul/lib/cli.js cover node_modules/.bin/_mocha
$ NODE_ENV=test istanbul cover node_modules/.bin/_mocha

What am I doing wrong here?

Argh. Punitive headslap. I just realized someone had put the flag back in mocha.opts and the flag sent to mocha was throwing the error, of course. Apologies for any confusion. The following works just fine as long as the harmony flags are removed from mocha.opts:

NODE_ENV=test node --harmony_destructuring node_modules/istanbul/lib/cli.js cover node_modules/.bin/_mocha