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



便利なリンク:




Source: https://habr.com/ru/post/J313468/


All Articles