この記事では、 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
ライブラリ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-one › serial 1 serial-one › serial 2 Test failed via t.fail() 1 test failed 1 test skipped 1. serial-one › serial 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-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
- 有用なリンクには、記事の例と最新のリポジトリが含まれます。
- 自分から:AVAに会った後、AVAで新しいホームプロジェクトに切り替えました。 次の作業ドラフトは、このライブラリで開発されます。 おそらく、古いプロジェクトの一部をAVAに転送すると同時に、実行の速度と移行の複雑さを測定します。
便利なリンク: