PhantomJSを使用してコンソールからSiestaテストを実行する

ここでは、製品の有料(標準)バージョン(499ドル)を使用せずにコンソールからSiestaテストを実行する方法を学習します。



問題


実際、 Siestaツールの無料(ライト)バージョンでは、ブラウザーからのみテストを実行できます。 また、コンソールからCIのテストを実行する必要がある場合は、コンソールからの起動など、多くの利点がある標準バージョンを確認する必要があります。 ツール自体は、有名な無料のPhantomJSエンジンを使用してテストを実行します。



解決策


PhantomJS、Siesta、およびJasmineおよびQUnitテストを実行するための既製のサンプルのドキュメントを研究した後、私はお金を節約するためにいくつかのコードを書きました。



ツールキットの概要


SiestaツールはExtJSフレームワークで記述されています。 この強力なツールは、ExtJS、jQuery、Dojoなどの一般的なさまざまなフレームワークを使用して記述されたJavaScriptアプリケーションをテストするために設計されています。 テストは、ブラウザでのユーザーアクションの完全な模倣まで、モジュール式と機能的の両方で実行できます。



PhantomJSツール 、コンソールからWebページを起動するために使用され、WebKitエンジンに基づいています。 Habréを含む、インターネットのロシア語セグメントで広くカバーされています。 シエスタツールとは異なり、情報によると「猫は泣いた」。



実際、それが私がこの投稿を書いている理由です。



前提条件


  1. ブラウザからSiestaテストを実行する方法は既に知っています(そうでない場合は、 こちら )。 たとえば、次の場所でテストを実行します localhost/tests/index.html





  2. PhantomJSがインストールされています(インストールされていない場合は、 こちら





必要なコード


Siestaテストを実行するPhantomJS用のrunner-siesta.jsスクリプトランナーを作成しました。



コードrun-siesta.js
 var start = new Date().getTime(), system = require('system'), page = require('webpage').create(); console.log('\nStart tests...\n'); /** * . */ var globalLog = (function() { var store = []; return { /** *    . * * @param msg */ add: function(msg) { store.push(msg); }, /** *    . */ console: function() { var log = ''; for (var i= 0; i < store.length; i++) { log += store[i] + '\n'; } console.log(log); } }; }()); if (system.args.length !== 2) { globalLog.add('Usage: phantomjs run-siesta.js URL'); myExit(1); } /** *         . * * @param exitCode   (0 - ) */ function myExit(exitCode) { globalLog.add('Total time: ' + (new Date().getTime() - start) + ' ms'); globalLog.add('Exit code: ' + exitCode); globalLog.console(); phantom.exit(exitCode); } /** *     . * @param msg */ page.onConsoleMessage = function(msg) { if (msg.match(/END_TESTS/)) { var exitCode = page.evaluate( function() { var totalPass = document.getElementsByClassName('total-pass')[0].innerText; var totalFail = document.getElementsByClassName('total-fail')[0].innerText; if (totalFail !== '0') { console.log('\nFailed!'); } else { console.log('\nCompleted!'); } console.log('\nTotal pass: ' + totalPass); console.log('Total fail: ' + totalFail); return totalFail === '0' ? 0 : 1; } ); myExit(exitCode); } else if (!msg.match(/\[object Object\]/)) { console.log(msg); } }; /** *  . * @param {String} URL  */ page.open(system.args[1], function(status) { if (status !== "success") { globalLog.add("Unable to access network"); myExit(1); } } );
      
      







このコードは、PhantomJS APIを使用してテスト付きのページを起動し、コンソールのindex.htmlページで生成されたログを表示します。



既にご存知のように、index.htmlにはindex.jsスクリプトが含まれており、テストを実行するための構成が記述されています。 index.jsの簡単な例は、公式のSiesta Webサイトにあります。



テストを自動的に実行するには、構成にオプションを追加する必要があります。



autoRun: true







したがって、PhantomJSがページにアクセスすると、テストが自動的に実行されます。 ブラウザでテストを実行する必要がある場合は、ページ設定メニューから「自動起動」オプションを選択して実行します。



PhantomJSが合格した各テストに関する情報を受信するには、次のテストが完了するたびにスローされるSiestaイベントtestfinalizeを使用する必要があります。 このイベントのハンドラーが構成に追加され、合格したテストに関する情報がページコンソールに表示されます(PhantomJSはpage.onConsoleMessageを使用して取得します )。



すべてのテストの完了は、 testsuiteendイベントを使用して追跡されます。 このイベントのハンドラーは、PhantomJSが知っている特別なコードをコンソールに出力します。 これにより、彼は作業を完了し、結果の情報をコンソールに表示できます。



ハンドラーコード
  listeners: { testfinalize: function(event, test) { var fail = test.$failCount, pass = test.$passCount; var log = (fail ? '~~~~~~~~\n FAILED ' : '[PASSED] ') + test.url + ' [pass: ' + pass + ', fail: ' + fail + ']' + (fail ? '\n~~~~~~~~' : ''); console.log(log); }, testsuiteend: function(event, harness) { console.log('END_TESTS'); } }
      
      









から簡単な例を使用してすべてをまとめる場合。 サイトSiesta、 index.jsは次のようになります



コードindex.js
 var Harness = Siesta.Harness.Browser.ExtJS; Harness.configure({ title : 'Awesome Test Suite', //   autoRun : true, preload : [ // version of ExtJS used by your application '../ext-4.1.1/resources/css/ext-all.css', '../resources/yourproject-css-all.css', // version of ExtJS used by your application '../ext-4.1.1/ext-all-debug.js', '../yourproject-all.js' ], listeners: { //        testfinalize: function(event, test) { var fail = test.$failCount, pass = test.$passCount; var log = (fail ? '~~~~~~~~\n FAILED ' : '[PASSED] ') + test.url + ' [pass: ' + pass + ', fail: ' + fail + ']' + (fail ? '\n~~~~~~~~' : ''); console.log(log); }, //         testsuiteend: function(event, harness) { console.log('END_TESTS'); } } }); Harness.start( '010_sanity.t.js', '020_basic.t.js' );
      
      









テストが完了すると、run-siesta.jsは合格したテストの総数についてテストページを解析し、合計経過時間を表示し、対応する数値識別子をコンソールに返します(0-成功、1-エラー)。これはCIにとって重要です。



すべてが実際にどのように見えるかの例

スクリーンショット








藤堂


END_TESTS終了コードを受信しない場合に備えて、PhantomJSがタイムアウトでシャットダウンする可能性を提供する必要があります。



まとめ


499ドルを節約するために、簡単なコードで小さなファイルを2つだけ取りました。



利益?



All Articles