フロントエンドコードオーバーライドツールistanbul


テストの時、私たちはいつもすべてのコードがテストされたかどうかに関心を持っています.
この指標を「コードオーバーライド率」(code coverage)と呼ぶ.測定次元は4つあります.
  • 行オーバーライド率(line coverage):各行が実行されましたか?
  • 関数オーバーライド率(function coverage):各関数が呼び出されましたか?
  • ブランチオーバーライド率(branch coverage):ifコードブロックごとに実行されましたか?
  • 文オーバーライド率(statement coverage):各文が実行されましたか?

  • IstanbulはJavaScriptプログラムのコードオーバーライドツールであり,その使い方を紹介する.
    このソフトウェアはトルコ最大の都市イスタンブールで命名されています.トルコのカーペットは世界で有名で、カーペットはカバーするために使われています.

    一、据付


    Istanbulはnpmモジュールで、インストールは非常に簡単で、1行のコマンドです.
    $ npm install -g istanbul

    二、カバー率テスト


    一例として、Istanbulの使い方を見てみましょう.次はスクリプトファイルsimpleです.js .
    var a = 1;
    var b = 1;
    if ((a + b) > 2) {
    console.log('more than two');
    }

    istanbul coverコマンドを使用すると、オーバーライド率が得られます.
    $ istanbul cover simple.js
    ===== Coverage summary =====
    Statements : 75% ( 3/4 )
    Branches : 50% ( 1/2 )
    Functions : 100% ( 0/0 )
    Lines : 75% ( 3/4 )
    =============================

    結果を返すsimple.jsには4つの文(statement)があり、3つ実行されています.2つのブランチ(branch)があり、1つ実行された.0個の関数があり、0個呼び出されました.4行のコードがあり、3行実行されました.
    このコマンドは同時にcoverageサブディレクトリを生成し、その中のcoverage.jsonファイルにはオーバーライド率の元のデータが含まれており、coverage/lcov-reportはブラウザで開くことができるオーバーライド率レポートで、どのコードがオーバーライドされていないかの詳細があります.

    三、カバー率敷居


    完璧なカバー率はもちろん100%ですが、現実的には達成しにくいです.カバー率が基準に達しているかどうかを測定する敷居が必要です.
    istanbul check-coverageコマンドは、現在のコードが基準に達しているかどうかを確認しながら、敷居を設定します.
    $ istanbul check-coverage --statement 90

    ERROR: Coverage for statements (75%) does not meet global threshold (90%)
    上記のコマンドで文のオーバーライド率を設定する敷居は90%で、実際のオーバーライド率は75%しかないため、結果は間違っています.
    パーセンテージ敷居に加えて、絶対値敷居を設定することもできます.たとえば、文が上書きされていないことを許可します.
    $ istanbul check-coverage --statement -1

    上のコマンドは負の数を使用して、絶対値の敷居を表します.これにより、上記の例はカバー率テストに合格し、間違いを報告することはありません.
    パーセンテージ敷居と絶対値敷居は、組み合わせて使用できます.
    $ istanbul check-coverage --statement -5 --branch -3 --function 100

    上のコマンドでは、5文、3 ifコードブロック、100%関数の3つのオーバーライド敷居が設定されています.注意して、この3つの敷居は「と」(and)の関係で、1つが基準に達していない限り、間違って報告されます.

    四、テストフレームワークとの結合


    実際の開発では,istanbulは常にテストフレームワークと組み合わせて使用されているが,以下ではよく用いられるMochaフレームワークを例に挙げる.
    sqrt.jsは平方根を計算するスクリプトです.
    var My = {
    sqrt: function(x) {
    if (x < 0) throw new Error(" ");
    return Math.exp(Math.log(x)/2);
    }
    };
    module.exports = My;

    そのテストスクリプトtest.sqrt.jsはtestサブディレクトリに配置されます.
    var chai = require('chai');
    var expect = chai.expect;
    var My = require('../sqrt.js');
    describe("sqrt", function() {
        it("4 2", function() {
            expect(My.sqrt(4)).to.equal(2);
        });
        it(" ", function() {
            expect(function(){ My.sqrt(-1); }).to.throw(" ");
        });
    });

    次に、次のコマンドを実行してコードオーバーライド率を取得します.
    $ istanbul cover _mocha
    // or
    $ istanbul cover _mocha test/test.sqrt.js
    sqrt
    ✓ 4 2
    ✓  
    2 passing (7ms)
    ===== Coverage summary =====
    Statements : 100% ( 5/5 )
    Branches : 100% ( 2/2 )
    Functions : 100% ( 1/1 )
    Lines : 100% ( 4/4 )
    =============================

    上のコマンドで、istanbul coverコマンドの後ろに付いているのは_mochaコマンドは、前の下線は省略できません.
    だって、mochaと_mochaは2つの異なるコマンドで、前者は新しいプロセス実行テストを作成し、後者は現在のプロセス(すなわちistanbulが存在するプロセス)でテストを実行します.これにより、istanbulはオーバーライド率データをキャプチャします.他のテストフレームワークも同様で、同じプロセスでテストを実行する必要があります.
    mochaにパラメータを入力する場合は、次のように書くことができます.
    $ istanbul cover _mocha -- tests/test.sqrt.js -R spec

    上のコマンドでは、2つの単語線の後ろの部分が、Mochaにパラメータとして渡されます.その2本の連語線を付けないとistanbulのパラメータとして扱われます(リンク1,2参照).
    ブラウザでIstanbulを実行したい場合は、この記事を参考にしてください.

    五、一部のコードを無視する


    istanbulは注釈構文を提供し、一部のコードがオーバーライド率に計上されないことを許可します.
    var object = parameter || /* istanbul ignore next */ {};

    上のコードはobjectのデフォルト値(空のオブジェクト)を指定します.様々な理由でobjectが空のオブジェクトでない場合にテストを書く場合は、コメントで上書き率に計上しないことができます.注記は、「または」演算子の後に書きます.
    /* istanbul ignore if */
    if (hardToReproduceError)) {
    return callback(hardToReproduceError);
    }

    上のコードのif文ブロックは、オーバーライド率を計算するときに無視されます.