フロントエンドコードオーバーライドツールistanbul
7512 ワード
テストの時、私たちはいつもすべてのコードがテストされたかどうかに関心を持っています.
この指標を「コードオーバーライド率」(code coverage)と呼ぶ.測定次元は4つあります.行オーバーライド率(line coverage):各行が実行されましたか? 関数オーバーライド率(function coverage):各関数が呼び出されましたか? ブランチオーバーライド率(branch coverage):ifコードブロックごとに実行されましたか? 文オーバーライド率(statement coverage):各文が実行されましたか?
IstanbulはJavaScriptプログラムのコードオーバーライドツールであり,その使い方を紹介する.
このソフトウェアはトルコ最大の都市イスタンブールで命名されています.トルコのカーペットは世界で有名で、カーペットはカバーするために使われています.
Istanbulはnpmモジュールで、インストールは非常に簡単で、1行のコマンドです.
$ npm install -g istanbul
一例として、Istanbulの使い方を見てみましょう.次はスクリプトファイルsimpleです.js .
istanbul coverコマンドを使用すると、オーバーライド率が得られます.
結果を返すsimple.jsには4つの文(statement)があり、3つ実行されています.2つのブランチ(branch)があり、1つ実行された.0個の関数があり、0個呼び出されました.4行のコードがあり、3行実行されました.
このコマンドは同時にcoverageサブディレクトリを生成し、その中のcoverage.jsonファイルにはオーバーライド率の元のデータが含まれており、coverage/lcov-reportはブラウザで開くことができるオーバーライド率レポートで、どのコードがオーバーライドされていないかの詳細があります.
完璧なカバー率はもちろん100%ですが、現実的には達成しにくいです.カバー率が基準に達しているかどうかを測定する敷居が必要です.
istanbul check-coverageコマンドは、現在のコードが基準に達しているかどうかを確認しながら、敷居を設定します.
ERROR: Coverage for statements (75%) does not meet global threshold (90%)
上記のコマンドで文のオーバーライド率を設定する敷居は90%で、実際のオーバーライド率は75%しかないため、結果は間違っています.
パーセンテージ敷居に加えて、絶対値敷居を設定することもできます.たとえば、文が上書きされていないことを許可します.
上のコマンドは負の数を使用して、絶対値の敷居を表します.これにより、上記の例はカバー率テストに合格し、間違いを報告することはありません.
パーセンテージ敷居と絶対値敷居は、組み合わせて使用できます.
上のコマンドでは、5文、3 ifコードブロック、100%関数の3つのオーバーライド敷居が設定されています.注意して、この3つの敷居は「と」(and)の関係で、1つが基準に達していない限り、間違って報告されます.
実際の開発では,istanbulは常にテストフレームワークと組み合わせて使用されているが,以下ではよく用いられるMochaフレームワークを例に挙げる.
sqrt.jsは平方根を計算するスクリプトです.
そのテストスクリプトtest.sqrt.jsはtestサブディレクトリに配置されます.
次に、次のコマンドを実行してコードオーバーライド率を取得します.
上のコマンドで、istanbul coverコマンドの後ろに付いているのは_mochaコマンドは、前の下線は省略できません.
だって、mochaと_mochaは2つの異なるコマンドで、前者は新しいプロセス実行テストを作成し、後者は現在のプロセス(すなわちistanbulが存在するプロセス)でテストを実行します.これにより、istanbulはオーバーライド率データをキャプチャします.他のテストフレームワークも同様で、同じプロセスでテストを実行する必要があります.
mochaにパラメータを入力する場合は、次のように書くことができます.
上のコマンドでは、2つの単語線の後ろの部分が、Mochaにパラメータとして渡されます.その2本の連語線を付けないとistanbulのパラメータとして扱われます(リンク1,2参照).
ブラウザでIstanbulを実行したい場合は、この記事を参考にしてください.
istanbulは注釈構文を提供し、一部のコードがオーバーライド率に計上されないことを許可します.
上のコードはobjectのデフォルト値(空のオブジェクト)を指定します.様々な理由でobjectが空のオブジェクトでない場合にテストを書く場合は、コメントで上書き率に計上しないことができます.注記は、「または」演算子の後に書きます.
上のコードのif文ブロックは、オーバーライド率を計算するときに無視されます.
この指標を「コードオーバーライド率」(code coverage)と呼ぶ.測定次元は4つあります.
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文ブロックは、オーバーライド率を計算するときに無視されます.