上班途中想到的,到公司后一测,果然如此。看 test.js:

function testFn(a, b, c) {
    var ret = 0;
    if(a || b || c) {
        ret++;
    }
    return ret;
}
testFn(1);

JSCoverage 覆盖率 100%:jscoverage.html?test.html

实际上,testFn(0, 1); testFn(0, 0, 1); 等情形都没覆盖到。原因很简单, if 语句中存在或,但 jscoverage 生成的代码,是以代码行为单位的:

_$jscoverage['test.js'][6]++;
if ((a || b || c)) {
    _$jscoverage['test.js'][7]++;
    (ret++);
}

能想到的一种完善方式:对于逻辑表达式,要进一步插入监测代码:

if (((_jsc() && a && _jsc()) || (_jsc() && b && _jsc()) || (_jsc() && c && _jsc()))) {
    // ...
}
// _jsc() 是 _$jscoverage['test.js'][n]++ 的示意写法

不过貌似把问题搞复杂了。

总之目前我们要知道:在 JSCoverage 里,100% != 100%.