AVA-テスト用の未来的なJavaScriptライブラリ

この記事では、 AVAをテストするための新しいライブラリを紹介します。 比較的新しく、すでに2年以上が経過しており、多数のプラグインと、もちろんそれを開発するコミュニティを取得しています。 ライブラリの機能を見ていきます。 環境をセットアップし、いくつかのテストを作成して、動作中のライブラリを調べます。







AVAは何を提供しますか?



まず第一に、ライブラリは速度を提供します。 テストは並行して実行され、テストの実行が高速になります。 一例として、 Pageresプロジェクトがあります。このプロジェクトでは、 テストがAVAに移行され 、ほぼ3倍に増加しました(31秒で11秒になりました)。 テストは、グローバルステータスや他のテストから独立しているため、もちろんテストが簡素化されます。 es2015はすぐに使用できます。







今すぐAVAの使用を開始するには、何をする必要がありますか?



適切なnpmモジュールをインストールします。 特定のフォルダーで作業するための依存関係としてインストールします。







// package.json ..., "scripts": { "test": "ava" }, ...
      
      





 npm install -D ava npm test
      
      





またはグローバルに







 npm i -g ava ava
      
      





テストを実行する



最初のテストを書く時が来ました。公式リポジトリから例を見てみましょう。 そして、my-tests.jsとして保存します







 import test from 'ava'; test('foo', t => { t.pass(); }); test('bar', async t => { const bar = Promise.resolve('bar'); t.is(await bar, 'bar'); });
      
      





すぐに、矢印関数、letおよびasyncでes2015を使用することがわかります。 私の意見では、本当に最小限の構文はだまされていません。







テストを実行する







 npm test my-tests.js // or ava my-tests.js
      
      





そして結果が得られます







 2 passed
      
      





各テストの詳細情報を確認したい場合は、モジュールのパラメーターを使用できます







 ava my-tests.js --verbose // or ava my-tests.js -v
      
      





  foo bar 2 tests passed
      
      





また、ウォッチャーを実行してTDDスタイルで開発することもできます。







 ava my-tests.js --watch // or ava my-tests.js -w
      
      





オプションの全リストをご覧ください。







 ava --help
      
      





ライブラリAPI



簡単なテスト:







 test('description', t => { });
      
      





すべてのテストを1つだけ実行する必要がある場合の最も一般的な状況の1つ:







 test.only('test only', t => { t.pass(); });
      
      





エラーを検索してリファクタリングする場合、テストをスキップする必要がある場合があります。







 test.only('test only', t => { t.fail(); });
      
      





生地プラグ



非常に興味深いAPIレベルで行われます。 テストでリマインダーを直接作成できます。







 test.todo('');
      
      





コードの非同期部分をテストする必要がある場合は、「cb」を使用できます。







 test.cb('callback', t => { setTimeout(function() { console.log('time'); t.end(); }, 3000); });
      
      





テストの整然とした実行



シリアルパラメータを使用すると、特定の順序でテストを実行できます。 たとえば、構成ファイルの存在を確認したいとします。 そうでない場合は、作成する必要があります。 2つのテストを行い、1つはファイルを作成し、もう1つはチェックします。







そして、それらを順番に実行する方が便利です。







 import test from 'ava'; import fs from 'fs'; const path = 'serial-test-one.txt'; test.cb('serial 1: create file', t => { fs.writeFile(path, 'test', function(err) { if (err) { t.fail(); } else { t.pass(); } t.end(); }); }); test.cb('serial 2: is file exists', t => { fs.access(path, fs.F_OK, function(err) { if (err) { t.fail(); } else { t.pass(); } t.end(); }); });
      
      





そのようなコードを書いたら、







  serial-one › serial 2 serial-one › serial 1 2 tests passed
      
      





そして、テストが正常に開始および終了したことがわかります。 しかし、これは正しくありません。データコードは、必要な順序での実行を保証しません。 まだファイルがない状況をシミュレートする場合、作成テストをスキップすると、エラーが発生します







  - serial-oneserial 1 serial-oneserial 2 Test failed via t.fail() 1 test failed 1 test skipped 1. serial-oneserial 2 AssertionError: Test failed via t.fail() serial-one.js:19:9 FSReqWrap.oncomplete (fs.js:123:15)
      
      





一貫性を確保するために、-serialまたは-sオプションを使用できます







 ava serial-one.js -s serial-one › serial 1 serial-one › serial 2 2 tests passed
      
      





または使用する







 test.cb.serial('serial 1', t => { ... });
      
      





テストは落ち、私たちはそれについて知っています。 これを明示的に示すことができます。







 test.failing('failing', t => { t.fail(); });
      
      





その結果、このテストは落ちていることがわかりますが、それについては知っています。理想的には、すでに何かをしているのです。







 1 known failure
      
      





パラメータを組み合わせることができるのは非常に素晴らしいことです。 これにより、複雑なテストを実行し、必要な順序でのみ実行できます。







 test.only.cb test.cb.only
      
      





前後



テスト環境のセットアップの前後にあります。 これらは、テスト実行の開始時と終了時にそれぞれ1回実行されます。







 test.before(t => { }); test.after(t => { });
      
      





このような関数をいくつか宣言することもでき、それらは追加する順に呼び出されます







 test.before(t => { console.log('before'); }); test.before(t => { console.log('before#2'); }); before before#2
      
      





あとで動作します。







テキストが該当する場合、afterは呼び出されません。 状況を修正するには、always修飾子を使用する必要があります。







 test.after.always(t => { });
      
      





beforeEachおよびafterEach



各テストの前に環境を構成する必要がある場合、beforeEachとafterEachを使用します。







 test.beforeEach(t => { }); test.afterEach(t => { });
      
      





それらの場合、動作はbeforeおよびafterと同じです。宣言の順序、およびafterテストでエラーが発生したときは呼び出されません(常にではない場合)。







アサーション



 test('test', t => { t.pass(); t.skip.fail(); t.truthy(true); t.truthy('unicorn'); t.falsy(false); t.falsy(1 === 0); t.true(true); t.false(false); t.is(1, 1); t.not(1, 0); t.deepEqual([0, 1, 2], [0, 1, 2]); t.notDeepEqual([0, 2, 2], [0, 1, 2]); });
      
      





非常に便利なdeepEqual、およびチェックをスキップする機能。

エラー出力を個別に検討しますが、非常に詳細です。







 test(t => { const a = /foo/; const b = 'bar'; const c = 'baz'; t.true(a.test(b) || b === c); });
      
      





 t.true(a.test(b) || b === c) | | | | | "bar" "bar" "baz" false
      
      





これは確かにデバッグに役立ちます。







プラグイン



AVAに会う前に、 Jasmineでテストを書きました。 行動駆動型が好きです。 これを行うために、AVAにはava-specプラグインがあります。







 npm i -D ava-spec
      
      





次に、このようなテストを書くことができます







 import {describe} from 'ava-spec'; describe('module#1', it => { it('can look almost like jasmine', t => { t.deepEqual([1, 2], [1, 2]); }); it.todo('todo'); it.skip('fail', t => { t.fail(); }); });
      
      





TAP-何でもプロトコルをテスト



テストに関する情報をカスタマイズできます。 tap-summaryが気に入りました。







 npm i -D tap-summary
      
      





使用する







 ava ava-spec.js -t | tap-summary
      
      





テスト用の実際のモジュール



関数を作成し、別のファイルに入れて、接続してテストしましょう。







 // ./test/sum.spec.js import { describe } from 'ava-spec'; import sum from '../src/sum'; describe('sum', it => { it('should return 10', t => { const expected = 10; const actual = sum(3, 7); t.is(actual, expected); }); });
      
      





 // ./src/sum.js function sum(x, y) { return x + y; } module.exports = sum;
      
      





 ava test/sum.spec.js
      
      





すべてが機能し、ファイルからのコードが接続され、テストされます。 しかし、問題があります。コードはES5およびES6テストで作成されました。 この状況を修正しましょう。 AVAはそのままでBabeljsを使用します 。 また、コードにも使用します。 構成を構成します。







 // .babelrc { "presets": [ "es2015" ] }
      
      





およびAVA用。 AVA設定は、package.jsonに直接配置されています。







 // ./package.json ..., "ava": { "babel": "inherit", "require": [ "babel-register" ] }, ...
      
      





変更なしで開始します。







 ava test/sum.spec.js
      
      





まとめ



AVAは、優れたテスト開発プラットフォームを提供します。 このライブラリには、ミニマルなスタイル、高速実行、テスト記述の柔軟性、テストとそれらの環境の操作、有益なエラー出力が含まれます。 全体として、プリファレンスと必要性に基づいてテストコード自体をカスタマイズし、テストに関する情報の出力をカスタマイズできます。







図書館の著者について



このライブラリの作者について少しお話ししたいと思います。 これはおそらく、JSコミュニティで最も有名な人物の1人であるSindre Sorhusです。 彼のgithubページでは、彼のプロジェクトとコミュニティの宝物を見ることができます。 そして/またはあなたは、インターネット上で可能な限り人として彼を知るようになるか、 amaを通して質問をすることができます-何でも聞いてください!







PS





便利なリンク:










All Articles