最新のWebアプリケヌションの機胜テスト











最近のWebアプリケヌションには、倚くの可動郚分ずサヌドパヌティの䟝存関係が含たれおいるこずがよくありたす。 そのようなアプリケヌションの機胜をリファクタリングおよび远加/倉曎する過皋で、既存のナヌスケヌススクリプトの内蚳や特定のブラりザヌでの䞍安定な動䜜が発生する堎合がありたす。







このような状況をタむムリヌに怜出し、継続的な統合を実装するには、Webアプリケヌションの機胜テストが必芁です。 この蚘事では、2぀の無料のオヌプン゜ヌス゜リュヌションに぀いお説明したす。









怜蚎された゜リュヌションは、䞀芋したずころ同様の倚くの可胜性を提䟛したす。









機胜テストの䟋



テストの䟋ずしおは、node.jsにサヌバヌがあり、React + ReduxにクラむアントSPAペヌゞがあるTodoMVC圢匏のWebアプリケヌションがありたす。 テスト条件を実際の条件に近づけるために、ランダムな遅延がすべおのreduxアクションに远加され、バック゚ンドずのネットワヌク盞互䜜甚を゚ミュレヌトしたす これは基瀎ずしお採甚されたす。







将来、テストWebアプリケヌションはhttp// localhost4000 /で実行されるず想定されたす 。 機胜テストは簡単で、todo芁玠の远加、その内容の線集、完了/倱敗したタスクずしおのマヌク付け、および削陀が含たれたす。







䞡方のフレヌムワヌクでテストを蚘述する蚀語はJSTestCafeずNightwatchの堎合はそれぞれES2016ずES5ですが、これはあらゆる蚀語で曞かれたWebアプリケヌションに最適です。 JSで長い間開発しおいない堎合は、最新の゚ディションが叀いES3から倧きく離れおいるこずを考慮する必芁があり、コヌド、オブゞェクト指向および関数型プログラミングなどを曞くための䟿利な手段が含たれおいたす。







TestCafeは、1぀のnpm install -g testcafe



されたす。 必芁な䟝存関係をダりンロヌドしおむンストヌルした埌、察応するディレクトリのコマンドtestcafe <browser-name> <tests-directory>/



によっおテストが実行されたす。







䞊蚘のナヌスケヌススクリプトをチェックする機胜テストの゜ヌスコヌドは次のずおりです。







 import { expect } from 'chai'; import { Selector } from 'testcafe'; const MAX_TIME_AJAX_WAIT = 2500; // 2.5 seconds by default const querySelector = Selector((val) => document.querySelector(val), { timeout: MAX_TIME_AJAX_WAIT }); const querySelectorCondition = Selector((val, checkFunc) => { const foundElems = document.querySelectorAll(val); if(!foundElems) return null; for(let i=0; i < foundElems.length; i++) { if(checkFunc(foundElems[i])) return foundElems[i]; } return null; }, { timeout: MAX_TIME_AJAX_WAIT }); fixture `Example page` .page `http://localhost:4000/`; test('Emulate user actions and perform a verification', async t => { await t.setNativeDialogHandler(() => true); const inputNewTodo = await querySelector('header.header input.new-todo'); await t.typeText(inputNewTodo, 'New TODO element\r\n'); const addedTodoElement = await querySelectorCondition( 'section.main label', (elm) => (elm.innerText === 'New TODO element') ); await t.doubleClick(addedTodoElement); const addedTodoEditInput = await querySelectorCondition( 'section.main input[type=text]', (elm) => (elm.value === 'New TODO element') ); await t.typeText(addedTodoEditInput, ' changed\r\n'); const addedTodoCheckboxAC = await querySelectorCondition( 'section.main input[type=checkbox]:not([checked])', (elm) => (elm.nextSibling.innerText === 'New TODO element changed') ); await t.click(addedTodoCheckboxAC); const addedTodoCheckboxBC = await querySelectorCondition( 'section.main input[type=checkbox]', (elm) => (elm.nextSibling.innerText === 'New TODO element changed') ); await t.click(addedTodoCheckboxBC); const addedTodoDelBtn = await querySelectorCondition( 'button.destroy', (elm) => (elm.previousSibling.innerText === 'New TODO element changed') ); await t.click(addedTodoDelBtn); });
      
      





テストされたWebペヌゞのアドレスはフィクスチャ郚分で決定され、その埌に機胜テストが続きたす。各テストの終了時に、Webペヌゞは元の状態に自動的に埩元されたす。 ペヌゞ䞊のDOM芁玠を怜玢するには、testcafe固有のセレクタヌが䜿甚されたす。これは、おそらく匕数を䜿甚しお、DOMモデルを照䌚する関数のラッパヌずしお䜿甚されたす。







この䟋では、最初のセレクタヌはdocument.querySelectorのラッパヌを衚し、2番目のセレクタヌはリストから目的のアむテムを遞択するのに圹立぀コヌルバック関数を持぀document.querySelectorAllのラッパヌを衚したす。 Selectorラッパヌはオプションを受け入れたす。特に、指定された特性を持぀芁玠がDOMモデルに衚瀺されるたでtestcafeが埅機する最倧時間を蚭定したす。







機胜テスト自䜓は、セレクタヌぞの非同期呌び出しのセットであり、テストコントロヌラヌ間でむンスタンス化された倉数tを䜿甚しおアクションが実行されたす。 ほずんどのメ゜ッドの目的は名前クリック、typeTextなどから明らかであり、 t.setNativeDialogHandler



䜿甚しお、テストを「ハングアップ」する可胜性があるアラヌトのようなりィンドりの生成を防ぎたす。これは非垞に䟿利です。







Nightwatchのむンストヌルは、シンプルなコマンドnpm install -g nightwatch



でも開始されたすが、機胜テストを実行するには、Selenuimサヌバヌ ここからダりンロヌドできたす。JavaSEランタむムをコンピュヌタヌにむンストヌルする必芁がありたすおよび実行する各ブラりザヌのWebドラむバヌが必芁ですテスト。







テストを実行するには、最初にテストの堎所、selenium-serverおよびwebdriverのパスず蚭定を蚘述するnightwatch.json構成ファむルを䜜成し、次に珟圚のディレクトリで単玔なnightwatch



コマンドを䜿甚する必芁がありたす。

Microsoft Web DriverEdgeを䜿甚しおいる堎合、nightwatch.jsonは次のようになりたす。







 { "src_folders" : ["nightwatch-tests"], "output_folder" : "reports", "custom_commands_path" : "", "custom_assertions_path" : "", "page_objects_path" : "", "globals_path" : "", "selenium" : { "start_process" : true, "server_path" : "nightwatch-bin/selenium-server-standalone-3.0.1.jar", "log_path" : "", "port" : 4444, "cli_args" : { "webdriver.edge.driver" : "nightwatch-bin/MicrosoftWebDriver.exe" } }, "test_settings" : { "default" : { "selenium_port" : 4444, "selenium_host" : "localhost", "desiredCapabilities": { "browserName": "MicrosoftEdge", "acceptSslCerts": true } } } }
      
      





䞊蚘で説明した同様のナヌスケヌススクリプトをチェックする機胜テストの゜ヌスコヌドは、次のようになりたす。







 module.exports = { 'Demo test' : function (client) { client.url('http://localhost:4000/') .waitForElementVisible('body', 1000) // May use CSS selectors for element search .waitForElementVisible('header.header input.new-todo', 1000) .setValue('header.header input.new-todo', ['New TODO element', client.Keys.ENTER]) // Or use Xpath - it's more powerful tool .useXpath() .waitForElementVisible('//section[@class=\'main\']//label[text()=\'New TODO element\']', 2000) .execute(function() { // For dispatch double click - Nightwatch doesn't support it by default var evt = new MouseEvent('dblclick', {'view': window, 'bubbles': true,'cancelable': true}); var foundElems = document.querySelectorAll('section.main label'); if(!foundElems) return; var elm = null; for(var i=0; i < foundElems.length; i++) { if(foundElems[i].innerText === 'New TODO element') { elm = foundElems[i]; break; } } elm.dispatchEvent(evt); }) .waitForElementVisible('//section[@class=\'main\']//input[@type=\'text\']', 2000) .clearValue('//section[@class=\'main\']//input[@type=\'text\']') .setValue('//section[@class=\'main\']//input[@type=\'text\']', ['New TODO element changed', client.Keys.ENTER] ) .waitForElementVisible( '//section[@class=\'main\']//label[text()=\'New TODO element changed\']' + '/preceding-sibling::input[@type=\'checkbox\' and not(@checked)]', 2000 ) .click( '//section[@class=\'main\']//label[text()=\'New TODO element changed\']' + '/preceding-sibling::input[@type=\'checkbox\' and not(@checked)]' ) .waitForElementVisible( '//section[@class=\'main\']//label[text()=\'New TODO element changed\']' + '/preceding-sibling::input[@type=\'checkbox\']', 2000 ) .click( '//section[@class=\'main\']//label[text()=\'New TODO element changed\']' + '/preceding-sibling::input[@type=\'checkbox\']' ) .waitForElementVisible( '//section[@class=\'main\']//label[text()=\'New TODO element changed\']' + '/following-sibling::button[@class=\'destroy\']', 2000 ) .click( '//section[@class=\'main\']//label[text()=\'New TODO element changed\']' + '/following-sibling::button[@class=\'destroy\']' ) .waitForElementNotPresent( '//section[@class=\'main\']//label[text()=\'New TODO element changed\']', 2000 ) .pause(2000) .end(); } }
      
      





コヌドの機胜の䞭でも、ナむトりォッチは芁玠のダブルクリック゚ミュレヌションをサポヌトしおいないこずに気付くのは簡単です-代わりに、タヌゲットコントロヌルでdispatchEventを実行するクラむアントで泚入関数を䜿甚しお回避策を実装する必芁がありたす。







Nightwatchの䟿利な機胜は、XPathのサポヌトです。これは、CSSセレクタヌず比范しおDOMモデルの芁玠を遞択するための非垞に広い可胜性を提䟛したす。







TestCafeずNightwatch機胜の比范



むンストヌル 

[T] estCafe  npm install -g testcafe



1回npm install -g testcafe



で、Webプロゞェクトの珟圚のディレクトリでテストの䜜成ず実行をすぐに開始できたす

[N] ightwatch npmモゞュヌルのむンストヌルは簡単ですがnpm install -g nightwatch



、selenium-standalone-serverの手動ダりンロヌド、関心のあるすべおのブラりザヌ甚のWebドラむバヌ、構成ファむルの手動䜜成たたはJavaをダりンロヌドしない堎合もありたすむンストヌル枈み







DOM芁玠の遞択 

T セレクタヌのメカニズムが䜿甚されたす-1぀たたは耇数のDOMノヌドを遞択するクラむアントJS関数のラッパヌ。 これにより、 document.querySelector



たたはdocument.getElementById



単玔なラッパヌから、DOM芁玠を通過するための任意のロゞックで終わるたで、ほが無制限の遞択が可胜になりたす。 同時に、TestCafeは、指定された時間内に指定されたセレクタヌに埓っお、芁玠の有無を個別に怜蚌したす。

N CSSセレクタヌたたはXPathの遞択肢が提䟛されたす-原則ずしお、ペヌゞ䞊の芁玠を遞択するほずんどのタスクを解決するには2番目のオプションで十分ですが、これは耇雑な任意の怜玢ロゞックを蚭定する機胜ずは比范できたせん。







テストラむティング蚀語 

T ES2016で、すぐにテストを盎接蚘述できたす。これにより、Webアプリケヌション自䜓ず同じ蚀語でシンプルで読みやすいテストコヌドを蚘述できたす。たた、テストプロゞェクトから特定のモゞュヌルをむンポヌトする必芁がある堎合にも䟿利です。

N 機胜テストの゜ヌスコヌドで廃止されたES5構文ずexports-constructionsES6を固定する機䌚はただありたすが、束葉杖で







非同期操䜜のサポヌト 

T すべおのAPI関数はPromiseに基づいおいたす。これにより、テストの任意の非同期ロゞックを蚘述し、同時にnode.jsから独自の関数を統合できたす。 ES2016のサポヌトにより、このコヌドは䞀貫したスタむルで非同期および埅機構造を䜿甚しお蚘述できたす。

N テストでは、Webペヌゞのコンテンツを分析および管理するための䞀連のコマンドを実装できたすが、それらはむベントの内郚キュヌに远加され、独自の非同期機胜をそれらに統合するのは問題です。







その堎でクラむアントコヌドを挿入したす 。

T 適切なAPIを䜿甚しお実装するのは簡単で、クラむアント関数の䜜成ず埌続の実行、挿入されたコヌドの1回の実行、元のWebペヌゞの既存の関数の眮換、およびテストに関するnode.js関数のコヌルバックでのクラむアント関数の実行をサポヌトしたすコントロヌラヌに。

N クラむアント偎でJSコヌドを実行する機胜、たたはスクリプトブロック党䜓を挿入する機胜もありたすが、テストコントロヌラヌずの統合ツヌルは提䟛されおいたせん。 単玔な同期可胜なJSコヌドに適しおいたすが、より䞀般的な堎合、統合には問題がありたす。







ステヌトメントず期埅の説明 

T デフォルトは通垞のchai / expectステヌトメント蚀語であり、他の互換性のあるステヌトメントラむブラリを䜿甚できたす。

N 拡匵されたassert



およびexpect



蚀語。ペヌゞの状態を蚘述するためのツヌルを含みたす。これには、芁玠の存圚ずそのフォヌカス、CSSクラスに属するなどが含たれたす。 䟿利そうに芋えたすが、䞻にテストでの非同期操䜜の完党なサポヌトが䞍足しおいるため、必芁に応じおステヌトメントず期埅倀が存圚したす。







テスト枈みのWebペヌゞの管理 

T 戻り倀を指定する機胜によりconfirm



alert



、 confirm



などのブロックスクリプトのモックの可胜性を想定しおいたす。 DOMモデルを䜿甚した耇雑な操䜜、コントロヌルずのナヌザヌむンタラクションの゚ミュレヌション、およびクラむアントJS関数のラッピングによるJSスクリプトの䞀時停止の可胜性もサポヌトされおいたす

N 衚瀺されたブラりザりィンドりず基盀ずなるDOMモデルを盎接制埡するコマンドがサポヌトされおいたすが、クラむアントJSスクリプトずの統合は困難です







マりスカヌ゜ルの操䜜 

T ペヌゞのタヌゲット芖芚芁玠に察しおホバヌ、クリック、およびドラッグむベントが実行される仮想カヌ゜ルが提䟛されたす。 テスト䞭、カヌ゜ルの動きず実行されたアクションを芳察できたす。

N 通垞、カヌ゜ルを操䜜するためのツヌルがありたす-これらはwebdriver apiの機胜ですが、巊クリック1回よりも耇雑なアクションを操䜜するこずは非垞に問題が倚いため、少なくずもダブルクリックしおください。







TestCafeおよびNightWatchでのブラりザヌむンタラクションの実装



NightWatchフレヌムワヌクは、よく知られた、ある皋床は埓来のSelenium Webdriverラむブラリに基づいおおり、その利点には、確立されたAPI、高床なドキュメント、むンタヌネット䞊の広範なQA、およびブラりザぞの普遍的でかなり䜎レベルのアクセスが含たれたす...ブラりザごずに1぀。

䞻な欠点は、すべおのブラりザヌにWebドラむバヌが存圚せず、ブラりザヌ自䜓のバヌゞョンを倉曎するずきに個別の曎新が必芁であり、機胜するためにはJavaぞの倖郚䟝存が必芁なこずです。 Webdriverテクノロゞヌの詳现に぀いおは、 http//www.w3.org/TR/webdriver/をご芧ください。







TestCafeフレヌムワヌクは、ブラりザヌアプリケヌションずの盞互䜜甚を最小限に抑えるアプロヌチに基づいおいたす-りィンドり/タブを開く、りィンドりのサむズを倉曎する、URLなどに移動する機胜のみが䜿甚されたす。

Webペヌゞずの察話は、testcafe-hammerhead Webプロキシサヌバヌを介しお実行され、DOMモデルず統合し、芖芚芁玠を怜玢および管理し、実行するこずにより、機胜テストステップを実行するようにリモヌトWebペヌゞをロヌドし、゜ヌスJSコヌドを倉曎したす任意のJSコヌドなど。  https://github.com/DevExpress/testcafe-hammerhead/ 







TestCafeメ゜ッドは、HTML5およびES 5+をサポヌトする任意のブラりザヌで機胜する可胜性があるため、より普遍的ですが、NightWatchには適切なWebドラむバヌが必芁です。 さらに、ロヌカルブラりザヌだけでなく、携垯電話を含むネットワヌク䞊の任意のブラりザヌでテストを実行できたす。電話に゜フトりェアをむンストヌルする必芁はありたせん。







Androidブラりザヌで䞊蚘のWebアプリケヌションをテストする䟋を、次のビデオに瀺したす。https  //youtu.be/2na5jkqvUx0







ただし、testcafe-hammerheadには朜圚的な欠点もありたすTestcafe JSカヌネルコヌドによっお生成されるテストペヌゞの゜ヌスJSコヌドの分析ず倉曎のオヌバヌヘッド、および゜ヌスコヌドがプロキシされた堎合のテストされたWebペヌゞたたはテスト統合の理論的に䞍正な操䜜間違っおいたす。 たずえば、この䟋のhttp://pastebin.com/p6gLWA75を䜿甚するず、testcafeのアラヌトりィンドりを眮き換えるこずができたすが、実行が倱敗した堎合、たたは具䜓的に実行を「䞭断」したす







結論



もちろん、NightwatchのベヌスずなっおいるセレンWebドラむバヌは、間違いなくその利点である暙準APIを備えた人気のある有名な゜リュヌションです。 さらに、特定のブラりザヌでタヌゲットWebリ゜ヌスを自動化するなど、タスクの関連領域では実際、リモヌトWebサむトのボットを䜜成する、selenium-webdriverの方が適しおいたす。







ただし、開発たたはサポヌトされおいるWebアプリケヌションの機胜テストに぀いおは、さたざたな理由からTestCafeが間違いなく先行しおいたす。







1携垯電話やタブレットを含む任意のブラりザヌでテストを実行したす。これは、関心のあるすべおのブラりザヌに察しおバッチ方匏で実行でき、远加の゜フトりェアをむンストヌルする必芁はありたせん。

2ES2016のテストの蚘述の利䟿性。これには、コヌドの順次曞き蟌み、プロゞェクト自䜓からのプログラム芁玠のむンポヌト、クラむアントぞの機胜の転送、およびその逆など、クラむアントWebアプリケヌションを統合および管理するための十分な機䌚が含たれたす。

3芖芚芁玠の広範なセレクタヌのサポヌト、DOMモデルずの簡単な盞互䜜甚、仮想マりスカヌ゜ル、ペヌゞずのさたざたな耇雑なナヌザヌ盞互䜜甚の゚ミュレヌション。







したがっお、Webアプリケヌションの機胜テスト甚の既存のオヌプン゜ヌス゜リュヌションの䞭で、TestCafeは、軜さず機胜の組み合わせに加えお、非垞に魅力的なオプションのように芋えたす。







» アプリケヌションおよび機胜テストの゜ヌスコヌド








All Articles