mocha、chai、sinon、istanbul 100%ユニットテストカバー率を実現
敏捷なソフトウェア開発の中で、最も重要な実践はテスト駆動開発であり、ユニットテストの面では、重要な指標がテストカバー率であることを実現してみましょう.テストオーバーライド率は、私たちのコードがすべてテストされたかどうかを測定します.
しかし、指標自体は目的ではありません.テストオーバーライド率の検査を借りて、テストオーバーライドされていないコードを発見し、コードの論理をどのようにテストするかを考え、コードをよりよく設計して再構築し、コードの品質を高めることを望んでいます.
テストといえば、ちょうど最近「数学の美しさ」を読んでいて、本の中で情報について話しています.コードの挙動を不確実性から確定性に変えなければならないのも同じだ.ブラックボックスからホワイトボックスになると、不思議な力はなく、十分な情報を提供するしかないが、テスト中の断言は情報であり、テストカバー率も情報であり、テストカバー率は間接的な情報と考えられ、一部の不確実性を解消することができ、十分な断言は、より直接的な情報を提供している.テストオーバーライド率チェックを加えると,コードの挙動が所望に合致するか否かを断言するのに十分な情報を提供することができる.
テスト関連技術
Istanbul
はJavaScript
プログラムのコードカバー率ツールで、トルコ最大の都市イスタンブールに命名されています.Istanbulはコードを変換し、構文ツリーを生成し、対応する位置に統計コードを注入し、実行後に注入されたグローバル変数の値に基づいて、コードの実行回数を統計する.コードの変換が完了すると、Istanbulはtest runner
、例えばmocha
を呼び出し、変換後のコードのテストを実行し、テストレポートを生成する.Mocha
は、Jasmine、Karma、Avaのようなテストフレームワーク、すなわちテストを実行するツールです.JUnitの注記と同様にmochaはアクチュエータとしてdescibe
とit
の方法でtest suitを定義し,異なるテストパケットとする.mocha自体はassert
の断言を提供していないので、より表現力のある断言を提供するには、chai
と組み合わせて使用することができ、もちろんnodejsが提供するassert
を使用することもできます.私たちのコードには、常に複雑な論理やio、ネットワークに依存する非同期コードがあり、直接的な方法ではテストしにくい場合があります.この場合、
sinon
を通じて複雑なコードのテストを簡略化することができます.SinonはTest Double、すなわち
を作成することによって、私たちのコードに依存するいくつかの関数またはクラスをテストの代替に置き換え、私たちはテストの代替の行為を設定し、私たちのコードに必要な結果をシミュレートし、テストしにくいコードロジックを実行することができます.Nodejsプロジェクトのテスト環境の構成
1依存パッケージのインストール
mochaとistanbulはグローバルにインストールするか、現在のプロジェクトのみにインストールすることができます.
npm install --save-dev mocha chai sinon istanbul
インストールが完了したら、
package.json
ファイルのscriptsの下に、テストとテストオーバーライド率チェックを実行するコマンドを追加します.{
...
"scripts":{
"coverage": "istanbul cover _mocha -- -R spec --timeout 5000 --recursive",
"coverage:check": "istanbul check-coverage", } ... }
npm run coverage
とnpm run coverage:check
を実行すると、テストレポートを生成できます.前者はテストレポートを生成し、後者はテストカバー率が要求に達しているかどうかを確認します.2 Istanbulの構成
istanbul関連の実行パラメータは、コマンドラインの下で実行するときにパラメータを渡して作成したり、yaml形式の.istanbul.yml
ファイルで構成したりすることができます.重要な構成項目
instrumentation:
root: . #
extensions:
- .js # excludes: ['**/benchmark/**'] ... ... reporting: print: summary reports: [lcov, text, html, text-summary] # dir: ./coverage # watermarks: # statements: [80, 95] ... ... check: global: statements: 100 branches: 100 lines: 100 functions: 100
最後のcheckは、プロジェクトがオーバーライド率を検査するために達成する必要があるテストオーバーライド率であり、テストオーバーライド率は、文オーバーライド率、ブランチオーバーライド率、行オーバーライド率、関数オーバーライド率の4つの次元を含む.設定された指標に達しないと、実行時にエラーが発生し、プロジェクトのテストは自動化された継続的な統合に合格できません.
テストコードの作成
敏捷なソフトウェア開発におけるテスト駆動開発は、まずテストを書くことによって、呼び出し者の契約に基づいて、どのようにコードを実現するかを設計し、それによってよりテストしやすいコードを書き、コードの品質を高めることを意図している.私たちがテストを練習する上で考慮すべき方向でもあります.
1簡単なmochaテストコード
chaiが提供するexpect断言を用いて,BDD方式で,コードの予想される挙動により適合するテスト例を書くことができる.p>
var chai = require('chai')
chai.should()
var expect = chai.expect
var assert = chai.assert describe('basic test', function () { describe('simple', function () { it('data check', function () { var data = { name: "test" } assert.isNotNull(data, 'data should not be null') expect(data).to.be.an('object') expect(data).to.have.all.keys(['name']) expect(data).to.deep.include({name: 'test'}); }); }); });
2 Sinonでファイルの読み書きをシミュレートする
... ...
var sinon = require('sinon')
var fs = require('fs') describe('sinon', function () { it("should mock readFile", function(done){ sinon.stub(fs, 'readFile').callsFake(function (path, callback) { callback(new Error('read error')) }) fs.readFile("any file path", function(err,data){ assert.isNotNull(err) done() }) assert(fs.readFile.calledOnce) }); });
mochaテストフレームワークでは、非同期のコードを呼び出す場合は、itコールバック関数を呼び出すdoneメソッドを表示し、mocha非同期呼び出しがいつ終了するかを示す必要があります.そうでない場合、設定したタイムアウト時間が終わるまでテストは停止します.
Sinonはテストの代替をspy、stub、mockに分け、そのうち:
- Spyは、関数呼び出しの情報を提供することができるが、関数の動作は変更されない
- Stubは、関数の呼び出し情報を提供し、サンプルコードのようにstubbedされた関数に必要な動作を返すことができます.
- Mockは、spiesとstubsを組み合わせることで、完全なオブジェクトを置き換えるのが容易になります.
本稿の議論は紙面が限られているので,しばらくは各種sinonの使い方を詳しく紹介しないが,後で他の文章で専門的に紹介する.
継続的な統合
すべてのコードを完了したら、githubにコードをパブリッシュし、持続的な統合ツールtravisを使用してコードをチェックし、生成されたテストレポートをcoverallにアップロードします.これにより、プロジェクトのステータスとテストオーバーライド率のbadgesをプロジェクトに表示できます.
具体的な使用方法は、公式サイトを参照してください.coverallsを使用するには、プロジェクトに依存パッケージnpm i -D coveralls
をインストールする必要があります.パッケージを追加します.json実行スクリプトistanbul cover ./node_modules/mocha/bin/_mocha --report lcovonly -- -R spec && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js
通常のnodejsプロジェクト.travis.yml
は、
language: node_js
node_js:
- "7.6.0"
install: - npm install script: - npm test after_script: - npm run coverall
原文住所:http://www.51test.space/archives/2543
その他のソフトウェアテストに関する情報:www.51 test.space
公衆番号へようこそ