[ブックマーク] JavaScriptプロジェクトをテストするためのツール

本書の翻訳者であり、今日翻訳を行っているWelldone Softwareの従業員は、JavaScriptプロジェクトのテストツールについて簡単に説明する場合、単体テストと統合テストにはJestを、ユーザーインターフェイステストにはTestCafeを使用することをお勧めします。 ただし、特定のプロジェクトごとに特別なものが必要になる場合があります。 必要なものを正確に見つける最良の方法は、機能していると思われるいくつかのツールを使用して、それらを実際にテストすることです。 実験により、正確に何をやめるかがわかります。



2018年に注目する価値のあるJSプロジェクトで最も広く使用されているテストツールの概要をご紹介します。

汎用テストツール


▍Jsdom


Jsdomは、WHATWG DOMおよびHTML標準のJavaScript実装です。 言い換えれば、jsdomは通常のJS以外のことを行わずにブラウザー環境を模倣します。

このような環境では、テストを非常に迅速に実行できます。 jsdomの欠点は、すべてが実際のブラウザーの外部でシミュレートできるわけではない(たとえば、このアプローチではスクリーンショットを撮ることができない)ため、このツールを使用するとテストの可能性が制限されます。

JSコミュニティがjsdomに集中的に取り組んでおり、このツールを改善していることに言及する価値があります。 現在のバージョンの機能は、実際のブラウザに非常に近いものです。

▍イスタンブール


イスタンブールのツールを使用すると、単体テストでコードカバレッジを分析できます。 彼は詳細なレポートを表示します。このレポートに焦点を当てると、プロジェクトでまだテストされていないものを正確に把握し、状況を改善するために必要な作業量を評価できます。

▍カルマ


Karmaを使用すると、ブラウザーおよびjsdomを含むブラウザーに似た環境でテストを実行できます。
Karmaは、テストが実行される環境で特別なWebページを持つテストサーバーをサポートします。 このページは多くのブラウザで開くことができます。 さらに、これはBrowserStackなどのサービスを使用してテストをリモートで実行できることを意味します。

▍チャイ


チャイは、最も人気のあるクレーム作成ライブラリです。

▍予期しない


Unexpectedは、構文がChaiとわずかに異なるアサーションライブラリです。 さらに、このライブラリは拡張可能であるため、より高度なステートメントを作成できます。 特に、 unexpected-reactなどの予期しないことに基づいてライブラリを使用することについて話しています。詳細については、こちらを参照してください。

▍Sinon.JS


Sinon.JSは、いわゆるスパイ、スタブ、およびモックアップを使用してJavaScriptプロジェクトをテストする機能を提供する強力なスタンドアロンシステムです。 このシステムは、単体テストのフレームワークと連携できます。

▍Testdouble.js


Testdouble.jsは、Sinonと同じ機能を実行するあまり人気のないライブラリですが、開発者は、Sinonよりも同様の問題をよりよく解決すると述べています。 これは、一連の機能、いくつかのアーキテクチャ機能、およびテストへのアプローチによって区別され、多くの状況で役立つことができます。 testdoubleの詳細については、 こちらこちらこちらご覧ください

▍ワラビー


Wallabyも注目すべきツールです。 それは無料ではありませんが、多くのユーザーは、彼らがそれを求めるお金の価値があると信じています。 WallabyはIDEで実行され(すべての主要なIDEがサポートされています)、コードの変更と一致するテストを実行します。 テスト結果のデータは、コードと同じ場所にリアルタイムで表示されます。


ワラビー

▍キュウリ


Cucumberは、開発者がBDDでテストを作成するのに役立ちます。 テストは、Gherkin構文を使用して準備された受け入れ基準ファイルと、それに対応する実際のテストファイルに分けられます。 テストは、JSを含むフレームワークがサポートするさまざまな言語で作成できます。

like-article.feature例を次に示しlike-article.feature

 Feature: A reader can share an article to social networks As a reader I want to share articles So that I can notify my friends about an article I liked Scenario: An article was opened   Given I'm inside an article   When I share the article   Then the article should change to a "shared" state 

like-article.steps.js例を次に示しlike-article.steps.js

 module.exports = function() { this.Given(/^I'm inside an article$/, function(callback) {   //     }) this.When(/^I share the article$/, function(callback) {   //     })   this.Then(/^the article should change to a "shared" state$/, function(callback) {       //     }) } 

多くのチームは、この構文がTDDよりも便利だと感じています。

ユニットおよび統合テストフレームワーク


適切なテストツールを検索するときにおそらく最初に選択する必要があるのは、それをサポートするフレームワークとライブラリです。 独自のツールが必要になるまで、選択したフレームワークが提供するものを使用することをお勧めします。 一般的なガイドラインを次に示します。


このカテゴリで最も有名なツールの概要を以下に示します。

▍モカ


Mochaは現在、最も広く使用されているライブラリです。 後で説明するJasmineライブラリとは異なり、このライブラリは、サードパーティのアサーションツールと外部ツールを使用して、シミュレーションとスパイ機能(通常はEnzymeとChai)を作成します。 これは、Mochaをセットアップする際のいくつかの追加の困難性と、結果の機能が異なるライブラリ間で共有されるという事実を意味しますが、このフレームワークはJasmineと比較してより柔軟で拡張可能です。

たとえば、 特別なステートメントロジックが必要場合は、Chaiをフォークして、ツールボックス内のChaiのみを独自のステートメントライブラリに置き換えることができます。 これはジャスミンで行うことができますが、モカではこの変化はより明白になります。

以下は、気を付けるべきMochaの機能の一部です。


▍Jest


Jestは、Facebookが開発したテストフレームワークです。 それはジャスミンに基づいています。 今日、Facebookは機能のほとんどを再設計し、それに基づいて多くの新機能を作成しました。

Jestに関する膨大な資料を分析した後、多くの開発者がこのフレームワークの速度と利便性に感銘を受けていると結論付けることができます。 Jestの機能には次のものがあります。


▍ジャスミン


Jasmineは、Jestのベースとなっているテストフレームワークです。 ジェストがある場合-誰がジャスミンを必要とする可能性がありますか? 問題は、JasmineがJestよりも早く登場したこと、膨大な数の出版物があり、多くのツールが作成されていることです。

さらに、Angularの作成者はJestではなくJasmineを使用することを推奨していますが、JestはAngularプロジェクトのテストに最適であり、多くの人がこれを使用しています。 Jasmineの主な機能は次のとおりです。


vaAva


Avaは、並列テスト実行をサポートする最小限のテストライブラリです。 主な特徴は次のとおりです。


▍テープ


テープは、ここで説明したテストフレームワークの中で最も単純で、小さく理解しやすいAPIを備えています。 これはNode.jsで機能する通常のJSファイルです。 テープの主な機能は次のとおりです。


ユーザーインターフェイステストツール


まず、 ここここでは、クロスプラットフォームおよびクロスブラウザテストの実行に使用できる機能を持つサービスプロバイダーに関する優れた資料を見つけることができます。

ユーザーインターフェイスをテストするための既存のツールは互いに非常に異なるため、インターフェイスのテスト対象を選択する前に、実験することをお勧めします。 一言で言えば、ユーザーインターフェイスをテストするための環境を選択する人向けの一般的な推奨事項を表すために、次のように言えます。


▍セレン


Seleniumを使用すると、ブラウザとの対話を自動化して、ユーザーアクションをシミュレートできます。 このフレームワークはテスト専用に設計されたものではなく、さまざまな目的でブラウザを制御し、ソフトウェアメカニズムを使用してブラウザでのユーザーの動作をシミュレートするサーバーを提供できます。

Seleniumの機能は、多くのプログラミング言語を使用してさまざまな方法で制御できます。一部のツールを使用すると、プログラミングなしでSeleniumを操作できます。

ただし、SeleniumサーバーがSelenium WebDriverを使用して管理される構成に関心があります。これは、Node.jsとブラウザーを制御するサーバー間の対話のレイヤーとして機能します。 システムのさまざまな部分の相互作用スキームは、次のように説明できます。

 Node.js <=> WebDriver <=> Selenium Server <=> FF/Chrome/IE/Safari 

WebDriverは、テストのために選択したフレームワークにインポートできます。 テストは、ブラウザー管理機能を使用して作成できます。

 describe('login form', () => { before(() => {   return driver.navigate().to('http://path.to.test.app/') }) it('autocompletes the name field', () => {   driver     .findElement(By.css('.autocomplete'))     .sendKeys('John')     driver.wait(until.elementLocated(By.css('.suggestion')))     driver.findElement(By.css('.suggestion')).click()     return driver     .findElement(By.css('.autocomplete'))     .getAttribute('value')     .then(inputValue => {       expect(inputValue).to.equal('John Doe')     }) }) after(() => {   return driver.quit() }) }) 

ところで、WebDriver自体でテストを実行することができます。 オリジナルの形式でWebDriverを使用することを勧める著者の推奨事項があります。

ただし、WebDriverの機能を拡張するライブラリが存在するという事実を無視することはできません。WebDriverのフォークまたはラッパーによって提供されます。

ラッパーライブラリの欠点は、システムを複雑にすることです。 フォークの外観は悪いです。なぜなら、フォークに費やされた努力は、WebDriver自体の開発に投資された可能性が高いからです。

ただし、Seleniumについて言えば、多くの人はSeleniumを直接使用しないことを好みます。 Seleniumの機能を使用しているライブラリをご覧ください。

アピウム


Appiumは、Selenium APIに似たAPIを提供します。 このフレームワークは、次のツールを使用してモバイルプロジェクトのテストを整理するように設計されています。


したがって、Seleniumベースのツールを使用する場合、Appiumを使用してモバイルプロジェクトをテストできます。

分度器


分度器は、Angularに焦点を当てたSeleniumのラッパーライブラリです。 このライブラリの主な機能は次のとおりです。


WebdriverIO


WebdriverIOは、Selenium WebDriver機能を使用する独自のアプローチを提供します。 このライブラリはNode.js用です。 このプロジェクトの機能には次のものがあります。


ナイトウォッチ


Nightwatchには、Selenium WebDriverを操作する独自のアプローチもあります。 このツールは、サーバー、アサーションツール、さまざまなサポートツールを備えた独自のテストフレームワークを提供します。 Nightwatchの主な機能は次のとおりです。


TestCafe


TestCafeは、Seleniumベースのツールの優れた代替手段です。 このライブラリのコードは、2016年の終わりに公開されました。 プログラミングを必要としないテストツールを提供するTestCafeの有料版がまだあることに注意してください。 たとえば、これらはテストを記録するためのツールです。 有料版はユーザーサポートも提供します。 ライブラリコードが開かれる前に出された多くの古い出版物があり、閉じられたコードがその欠陥であると見なされることに注意する必要があります。

TestCafeはJSスクリプトとしてページに埋め込まれ、Seleniumのようにブラウザを制御しません。 これにより、TestCafeをモバイルを含む任意のブラウザーで実行でき、JavaScriptの動作を完全に制御できます。

TestCafeライブラリはJavaScriptで記述されており、テストに焦点を当てています。 現在は安定しており、十分な数の機会があると考えられていますが、現在活況を呈しています。 主な機能を検討してください。


▍サイプレス


サイプレスはTestCafeと直接競合しています。 このフレームワークはほぼ同じように機能し、ページのコードにテストを導入しますが、より現代的で柔軟で便利な方法でテストを試みます。 サイプレスはより新しく、このフレームワークは最近 、クローズドベータからパブリックベータに移行しました(2017年10月)が、 多くの人がすでにそれを使用しています。 サイプレスの主な機能は次のとおりです。


▍Puppeteer


Puppeteer — Node.js, Google. Node.js API Chrome .

— Chrome v59+, --headless . , API , Puppeteer — , , JS-, Google .

, Firefox , 2017-, .

, Chrome Firefox . , TestCafe Karma.

Puppeteer :


▍PhantomJS


PhantomJS Chromium , Chrome.

Puppeteer PhantomJS, , , PhantomJS, 2017, , - .

PhantomJS, Puppeteer? :

  1. , , .
  2. PhantomJS CasperJS. , PhantomJS.
  3. PhantomJS WebKit, Chrome.
  4. PhantomJS Flash, Chrome — .

▍Nightmare


Nightmare — , .

Nightmare Electron , PhantomJS, , Chromium . , Electron, , - JavaScript, HTML CSS.

, , Nightmare Chrome . Nightmare PhantomJS.

Nightmare:

 yield Nightmare() .goto('http://yahoo.com') .type('input[title="Search"]', 'github nightmare') .click('.searchsubmit') 

PhantomJS:

 phantom.create(function (ph) { ph.createPage(function (page) {   page.open('http://yahoo.com', function (status) {     page.evaluate(       function () {         var el = document.querySelector('input[title="Search"]')         el.value = 'github nightmare'       },       function (result) {         page.evaluate(           function () {             var el = document.querySelector('.searchsubmit')             var event = document.createEvent('MouseEvent')             event.initEvent('click', true, false)             el.dispatchEvent(event)           },           function (result) {             ph.exit()           }         ) // page.evaluate       }     ) // page.evaluate   }) // page.open }) // ph.createPage }) // phantom.create 

▍Casper


Casper — , PhantomJS SlimerJS ( , Phantom, Firefox Gecko). Casper -, , Phantom Slimer.

Slimer , . 2017- -, 1.0.0-beta.1, Firefox . Slimer.

, , , Casper PhantomJS Puppeteer Chrome, Firefox. , .

▍CodeceptJS


CodeceptJS , CucumberJS, API. , , .

CodeceptJS:

 Scenario('login with generated password', async (I) => { I.fillField('email', 'miles@davis.com'); I.click('Generate Password'); const password = await I.grabTextFrom('#password'); I.click('Login'); I.fillField('email', 'miles@davis.com'); I.fillField('password', password); I.click('Log in!'); I.see('Hello, Miles'); }); 

, : WebDriverIO , Protractor , Nightmare , Appium , Puppeteer . .

, , CodeceptJS.

まとめ


-. ? , , - , , , . , , : , , .

親愛なる読者! JS-?

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


All Articles