[ブックマヌク] 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-?






All Articles