Qunitを使用してJavaScriptコードをテストする方法。 JavaScriptテストテストHTML JavaScript.

一度、私の友人は、コンパイラを持っていないので、JavaScriptの言語が一般的に深刻な企業製品を書くためにどのように使用されるかについての彼の当惑を表明しました。 実際、品質コードを作成する上の決定的な役割は、プログラミング言語のためのコンパイラの存在の事実ではありませんが、適切に選択され、適切に構成されているソフトウェアシステムを作成することの技術的プロセスです。

このプロセスには、品質管理ツールとプログラマのパフォーマンスの複雑さが含まれるべきです。 そのような手段は、モジュール式と積分テスト、継続的な統合(連続統合、CI)、さまざまなメトリックの収集と分析(たとえば、NDependの非常に長いメソッド)、JSlint、FXCOPなどの要件に準拠して確認してください。

この記事では、JavaScriptで製品の自動モジュール式と統合テストを適切に実行する方法を教えてください。 実際、この点に関して、JavaScript言語はJavaまたはC#とは根本的に異なりません。

アジャイル、TDDとBDD

通常、自動モジュール式および統合テストは、将来のコードを変更するときの回帰エラーのリスクを減らすために機能するために作成することをお勧めします。 JavaScriptの場合、そのようなテストは、そのような検証を確実にするためのアクションを自動化することによって、さまざまなブラウザでシステム性能テストを大幅に単純化することができます。 さらに、良好なサービスは、製品内の各クローズドバグについてモジュール式または統合テストを書くことができます。

モジュール式テストの書き込みからの開始ロジックエンコードを必要とするプログラミング技法もあります。テスト駆動型開発(TDD)および行動駆動開発(BDD)。 それらはしばしばアジャイルプロセスで使用されます。 彼らの機能をもっと考えてみましょう。

テスト駆動型開発

テストによる開発は、書き込みコードの繰り返しコードです。これは次の4つのステップを繰り返します。

ステップ1。 新しい論理フラグメントを追加する前に、このロジックを確認するためのモジュラテストを作成してください。

ステップ2。。 テストを実行して、彼にしてください じゃあ 渡る;

ステップ3。。 テストを正常に実行させる最も簡単なコードを書きなさい。

ステップ4。。 品質要件に従ってコードを編集し、コードの重複を削除し、テストが成功していることを確認してください。

モジュール式テストの下では、分離媒体内のいくつかのコンポーネント(モジュール)の動作をテストするコードとして理解されます。 統合テストの下では、いくつかのコンポーネントのコラボレーションをテストするコードです。 他のモジュールに依存する場合は、孤立媒体のモジュールをテストするには、「2倍」(テスト2倍)が適用されます。

2倍のテスト。

モジュール式テストで使用される補助オブジェクトの分割は、カテゴリのXunitテストパターンの本から始まり、Gerard Mesason(Gerard Meszaros)の本を取ります。 これらのカテゴリは、「テスト2倍」と呼ばれる一般化されています(テスト2倍)。 複製者は次のタイプです。

  • 偽;
  • ダミー。

スタブ。 出力値 事前に指定したもの。 それは従属構成要素のインターフェースを模倣するために使用されます。

モック。- これは補助オブジェクトです。 動作 これは事前に設定されています。 これは、依存コンポーネントのインタフェースを模倣し、テスト中に正しく使用されている場合は確認するために使用されます。

スパイ- テスト中に呼び出されたパラメータと送信されたパラメータを検査するための補助オブジェクトです。

- これは、依存コンポーネントのインタフェースを簡略化した形式で実装する補助オブジェクトです。 たとえば、モジュール式テストの目的で、製品の作業バージョンで使用されているリレーショナルデータベースの代わりにデータベースをメモリ内に起動できます。

ダミー- これは補助オブジェクト、表示または送信が署名方法またはその他の契約に必要ですが、実際の値は使用されません。

スタブとモックの違いは、テストの結果をチェックする方法にあります。 STUの場合、テストの最後にオブジェクトの状態がチェックされます。 MOCKの場合、テスト中は、オブジェクトは登録中に説明されているとおりに使用されます。 詳細はNote Mocks Aren "T Stubs Martin Fowler(Martin Fowler)から見つけることができます。ここでは一例だけです。

スタブ。 モック。
"test connect":function()()(this.client.url \u003d "/ my / url"; sinon.stub(ajax、 "polc")。戻り値(()); this.client.connect( ); sinon.assert.calledwith(ajax.poll、 "/ my / url");) "Test Connectはポーリングを開始する必要があります":function()(this.client.url \u003d "/ my / url"; var mock \u003d sinon.mock(AJAX)Mock.expects( "polc").withargs( "/ my / url ")。leturns(()); this.client.connect(); mock.verify();)

行動主導の開発

機能要件の実施によるソフトウェアの開発への反復的アプローチは、テスト指向テストを通じてすでに身近な開発スタイルです。 BDDプロセスでは、次の3つのステップが順次実行されます。

ステップ1。 試験形式の実現可能なモジュールの機能要件の決定

ステップ2。。 モジュールのコーディング。

ステップ3。。 テスト結果をチェックすることによって、顧客またはビジネスAnalytics()のすべての願いが作成されていることを確認してください。

BDDスタイルでテストを書くときは、コンポーネントの機能部分の要件を完全に反映しているという事実のために、モックオブジェクトを使用することは非常に便利です。 したがって、BDDプロセスのテストは、問題の形式化されたプレゼンテーションとして機能することができます( ユーザーストーリー。用語で) スクラムこれにより、完成品のテクニカルタスクとドキュメントを作成する時間を節約できます。

モジュラJavaScriptテストのためのフレームワークは何ですか?

本格的なJavaScriptモジュラと統合テストツールは、次のコンポーネントで構成されています。

  • アサーションライブラリ(各テストの最後にあるコンポーネントの状態をチェックするためのメソッドのセット)。
  • Mock Library(モックオブジェクトおよびその他の「餃子」を生成するためのツール)。
  • テストランナー(IOSやAndroidブラウザなど、多数決ブラウザのサポート付きの自動起動テストツール)。
  • 普及した連続統合システムへの接続ブロック(連続統合)

JavaScriptのモジュラーテスト戦略

今日は3つのJavaScriptコードモジュラテスト戦略があります(本の3番目の章では、ブックテスト駆動のJavaScript Development Christian Johansen(Christian Johansen))。

  • ブラウザ内 テスト
  • ヘッドレス テスト
  • 方法に沿ってテストする jstestdriver..

ブラウザ内テストは、開発者が必要なブラウザで開くHTMLページからのすべてのモジュール式および統合テストの起動を想定しています。 そのようなアプローチは単純で直感的に理解されている。 しかし、彼のマイナスは、継続的な統合においてそのようなテストを含める可能性を提供しないことです。 さらに、10台以上のブラウザで手動でHTMLページを実行し、常に「F5」を押して開発者にとって退屈できます。

ヘッドレステストは、JavaScriptコード全体がJava、Ruby、JavaScript、C ++などで書くことができるエミュレータでテストされることです。 最も有名なエミュレータは現在、エンジンであるPhantomjsです。 ウェブキット。、コマンドラインから始めました。 エミュレータの利点のうち、それが継続的な統合で簡単に使用できること、およびコマンドラインからのすべてのテストの起動を自動化することができることに注意することができます。 ただし、このアプローチには重要な欠点があります。コードは実際のブラウザでテストされていないため、エミュレータで再生されていないブラウザエラーが不足しているリスクがあります。 JStestDriverの外観の前に、ブラウザのテストが互いに完全に補完するので、ブラウザのテストと組み合わされていることがしばしば満たすことができました。

適用部品の動作がさまざまな理由で異なる場合がある場合、効果的なテストケースの作成は大きなプロジェクトにとって非常に重要になる可能性があります。 おそらく最も頻繁な問題は、大規模な開発者が同じモジュールまたは隣接するモジュール上で機能するときです。 これにより、他のプログラマーによって書かれた関数の動作の計画外の変化につながる可能性があります。 または短時間で作業すると、アプリケーションの重要な部分に予期しない変化があります。

ルールとしてWebアプリケーションをテストすることは、ページの要素の視覚的評価と機能の実証的評価で構成されています。 言い換えれば、セクションへの移行および動的要素に対してアクションを実行します。

時間の経過とともに、プロジェクトは新しい機能で満たされています。これは、その作業を確認するプロセスを長くし、複雑にします。 モジュール式(単位)テストは自動化するために使用されます。

テストシナリオの構築には2つのアプローチがあります。

  • 白い箱。テスト - 書き込みテストは機能の実装に基づいています。 それら。 システムのモジュールの動作があるのと同じアルゴリズムを確認します。 このアプローチはシステム全体の正確さを保証するものではありません。
  • ブラックボックス。テスト - スクリプトの作成はシステムの仕様と要件に基づいています。 そのため、アプリケーション全体のパフォーマンスのパフォーマンスを確認できますが、このアプローチでは小さくてまれなエラーを捉えることはできません。

テストするもの

それはあなたが実装したすべての機能をテストを公開する価値があるように思われるかもしれません。 これはかなりそうではありません。 テストの作成は開発時間を取ります。したがって、アプリケーションの作成時に作業プロセスを最適化するために、他のシステムモジュールの結果に依存する複雑、重要、またはそれらの機能のみのテストを準備する価値があります。 エラーが発生する可能性があるテストであいまいなロジックをカバーします。 また、コードのセクションのテストを作成する価値があります。将来最適化プロセスの後に実行が可能になるように最適化することを計画しています。

一般に、開発時間の圧縮に対するテストのコストを評価することは非常に重要です。 もちろん、時間内に限られていない場合は、各機能をテストするために必要とされます。 しかし、原則として、開発はハードセメントで行われているので、分析や経験豊富な開発者のタスクがテストが必要な場所を理解するために。 さらに、書き込みテストはプロジェクトのコストを上げます。

したがって、モジュール式テストの使用が正当化されたときに3つのケースを策定することができます。

1)テストが通常の検索よりもエラーを迅速に識別できる場合。

2)デバッグまでの時間を短縮します

3)頻繁に変更されたコードをテストすることを許可します。

フロントランド(HTML、CSS、JavaScript)の3つの主要コンポーネントのうち、おそらくJavaScriptコードのみをテストする必要があります。 Developer / Tester / Customerがさまざまなブラウザでグラフィカルインタフェースを閲覧するときに、CSSは閲覧方法によって排他的にチェックされます。 HTML - マーキングは同じ方法でチェックされます。

テスト方法

テストシナリオを構築するときは、次の原則でガイドされる必要があります。

  • あなたのテストはできるだけ単純でなければなりません。 それからそれの結果があなたが繰り返しようとしているバグの影響を受ける可能性が高くなるでしょう。
  • 大型モジュールのテストを分解します。 Grove特定のエラーのある場所を見つけます。
  • テストに依存しない。 No Caseの1つのテストの結果は、他の結果に依存するはずです。
  • 試験結果は完全に再現可能で予想されなければならない。もう一度テストを開始するたびに、その結\u200b\u200b果は前回と同じになるはずです。
  • アプリケーションの実行のエラーについては、テストスクリプトを作成する必要があります。そのため、バグが本当に修正されていること、およびユーザーには現れないことを確認します。

テストより

単体テストの場合、JSコードはいくつかのライブラリーに存在します。 おそらく最も一般的なものはQunitです。 このライブラリを使用してモジュール式テストを実行するには、「サンドボックス」を作成する必要があります。テストライブラリを接続する単純なHTMLページ、テストの対象となるコード、テスト自体を作成する必要があります。

テストの機能:

(function()(window.stepen \u003d function(int)(var左\u003d 2; for(var i \u003d 1; i< int; i ++) { result = result * 2; } return result; } window.returnFunc = function() { return "ok"; } })();

リストテスト:

TEST( "stepen()"、function()(等しい(Stepen(2)、4、 "2 ^ 2 - 等メソッド"); OK(Stepen(3)\u003d\u003d\u003d 8、2 ^ 3 - OKメソッド " ); Deapequal(Stepen(5)、32、 "2 ^ 5 - Deapequal Method"); asynctest( "returnfunc()"、function()(equal(returnfunc()、OK "、非同期func test"); start();)、1000););););)。

見られるように、Qunitは3つの機能をサポートし、コードの実行結果を予想されるものと比較します。

  • oK () - 返された結果\u003d trueの場合、テストが成功したと見なします。
  • 等() - 結果を予想で比較します
  • dEEPEQUAL() - そのタイプをチェックすることで予想される結果を比較

実行結果

ご覧のとおり、Qunitライブラリは複数のブラウザ用のコードテストを直ちに実行します。

モジュラーテスト用の他の多くのライブラリがあります。 しかし、それらの中でテストのためのシナリオを構築するという概念は同じであるので、一つから理解したことはありませんでした - あなたは別のものに行くのは難しくありません。

覚えておくことが重要です

現代のJSコードの特徴はその実行の非同期のものです。 テストライブラリは通常非同期テストを実行することができます。 たとえば、kekendにget-requestを送信して応答を返す関数をテストしようとすると、stop()関数を実行するのを停止し、テスト機能を実行してからREを実行する必要があります。 -run start()ストリーム。SetTimeout()で "折り返し" "。 それら。 機能を完了する必要がある期間をレイアウトする必要があります。 このセグメント、.kの期間を慎重に選択する必要があります。 一方では、このメソッドの長い作業は、アプリケーションの機能の特定の実装と誤った動作の特定の実装の必要性の両方であり得る。

バックボーンアプリのテスト

たとえば、backbone.jsを使用して書かれたアプリケーションのテストについては、説明しているプロジェクトを使用します。

モジュラーテストを確認できます。

  • モデルとコントローラの作成の正確性
  • モデル内のデータを正しい
  • コントローラメソッドの実行(これは結果を返さなければなりません)
  • 表現のバージョンロード

テストコード:

test( "backbone.js"、function()(ok(サンプル、 "名前空間チェック"); OK(Sample.Routes.app、 "Router Check"); OK(sample.core.pagemanager.open( "chat") 「ページ開封テスト」)OK(Sample.Core.State、 "Model Check")。等しい( "sample.core.state.get")、 "Sintel"、 "Model Data Get Test"); stop(); OK (function()($ .ajax(url: "app / templates / about.tpl"、データ型: "text"))。done(関数(データ)(自己$ el.html(データ);戻りデータ; ))「テンプレートロードチェック」)。SetTimeout(関数()(start();)、1000););

テストエラーを操作した結果:

打ち上げテストの自動化

原則として、アプリケーションを適用することは、集中的な開発とかなり頻繁に実行される必要があるタスクです。 したがって、この操作は通常自動化されています。 私達は私達の仕事の中でジェンキンスを使います - 継続的な統合のためのツール。 アイデアは、Jenkinsを介して自動テストを統合することです。

Qunitテストはブラウザで実行されます。 この機能を回避するのに役立ちます。Phantomjs - ブラウザの作業をエミュレートすることによって。 PhantomJS開発者はすでにQunitテストを実行するためのスクリプトを提供していますが、それを少し変更する必要がありました。

/ ** *テスト条件が正しいかタイムアウトが発生するまで待ちます。 *サーバーの応答またはUIの変更(FADEINなど)で待機するのに役立ちます。 * * @param testfx JavaScriptのJavaScriptは、ブール値に評価されます。*それは文字列として渡すことができます(例: "1 \u003d\u003d 1"または* "$("#bar ")です。(" #bar ")"です。 *コールバック関数として。* @param onReady testfx条件が満たされたとき、それは文字列として渡すことができます(例: "1 \u003d\u003d 1"または* "$("#bar ")。は( ":表示") "または*コールバック関数として。* @param timeoutmillisの待つ時間の最大時間。*指定されていない場合は、3秒が使用されます。* /関数waitfor(testfx、onReady、timeoutmillis)(var maxtimeoutmillis) \u003dタイムアウトミリ?タイムアウトミリ:3001、//< Default Max Timout is 3s start = new Date().getTime(), condition = false, interval = setInterval(function() { if ((new Date().getTime() - start < maxtimeOutMillis) && !condition) { // If not time-out yet and condition not yet fulfilled condition = (typeof(testFx) === "string" ? eval(testFx) : testFx()); //< defensive code } else { if(!condition) { // If condition still not fulfilled // (timeout but condition is "false") console.log(""waitFor()" timeout"); phantom.exit(1); } else { // Condition fulfilled (timeout and/or condition is //"true") console.log(""waitFor()" finished in " + (new Date().getTime() - start) + "ms."); typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it"s supposed to do once the // condition is fulfilled clearInterval(interval); //< Stop this interval } } }, 100); // repeat check every 250ms }; }; if (phantom.args.length === 0 || phantom.args.length > 2)console.log( "usage:run-qunit.js url"); phantom.exit(); )var page \u003d new webpage(); //「console.log()」を段落内のコンテキスト内からのコール(すなわち、現在の "this)page.onconsoleMessage \u003d関数(msg)(msg)(console.log(msg);)。 page.open(status)(status)(ステータス)(ステータス!\u003d\u003d "success")(console.log); phantom.exit();他(waitfor(function(function()(return page.evaluate(function(function()(var el el) \u003d document.getElementByID( "qunit-testresult");( "el && el.innertext.match(" complete "))(true;)を返します。);););)、function()(var failednum \u003d page.evaluate (function()( "var el \u003d document.getElementById); console.log(el.innertext); try trate)。length; length;)catch(e)(return 0;)戻る10000;) ; Phantom.exit((Parseint(FailedNum、10)\u003e 0)?1:0);))))。

テストスクリプトに結果に関するメッセージを表示するには、ログイン機能を追加する必要があります。

コードのテスト - Inalienableソフトウェア開発サイクル。 初心者の開発者のチームはしばしば彼の役割を過小評価し、古い方法でアプリケーションのパフォーマンスをチェックします - 「作品、そして大丈夫」。 遅かれ早かれ、この戦略は失敗を与え、バグトラッカーはタスクの無数の軍隊と重複し始めます。 様々な西洋に喜んでいないように、私は一度お勧めし、テストのニュアンスを扱うために推薦する JavaScript。 コード。

JavaScriptは同じではありません

今日 JavaScript。 - これはアプリケーションの外観を活性化するための言語だけではありません。 JavaScriptがJokesや製造メニューに永久的に渡されたときに使用されたとき。 今、それはクライアント上でもサーバー上でも同様によく機能する独立した言語です。 JavaScriptの役割は大幅に増加しているので、コードを書くときには、他のプログラミング言語でよく証明されていることを恥ずかしがり屋であるべきではありません。

実務家やパラダイムの意味は何ですか? もちろん、建築のテンプレート MVC(モデルビューコントローラ) コード組織パターンとコード。 これに続いて、狡猾な知恵ではなく、簡単に伴うだけでなく、自動的にテストする能力を持つより良いコードを書くことができます。

ほとんどのテスターエラー

最も一般的なテストの方法が常に「目」で常に禁止されていることは秘密ではありません。 その本質は恥ずべきことが簡単です - 数千行のコードを書いた、タスクを解決し、彼の創造を立ち上げました。 彼は演奏し、早くしました - すべてが働いているようです、あなたは戦闘サーバーを注ぐことができます。 すべてが非常に簡単で、開発者の注意を払って(理想的には「テスター」というニックネームの別の人)、アプリケーションの正確さに頼ることができます。

実際には、すべてが多少異なります。 別のテスターは通常はそうではありません。 開発者自体はプログラムのパフォーマンスを確認しようとしており、テクニカルタスクで定義されている一連のアクションを実行しています。 コードのより高度なコードは、セレンのようなものの助けを借りてそのような統合テストを自動化します。

したがって、プログラマは最大のエラーのみを検出する機会を得ます。 残念ながら、「ばかげん」と「未だ発売のない」ユーザーの行動、およびビジネスロジックの狡猾な動きは、ケースの99%の場合、シーンの後ろに残ります。

テスターの顔に別の人が存在すると、問題が一定時間までも問題を解決します。 あなたが彼の精子ケアを細部に捨てても、そのテストの質はアプリケーションの増加を伴うゼロに努力します。 私は練習から例を与えます。

私が小規模なプログラムを開発するように指示されたら。 機能によると、プロジェクトは最も簡単なCRMに似ていました。これは私が可能な限り短い時間で実装されました。 正確な報酬を受け取った後、私はすべての情報源を顧客に伝え、8ヶ月間プロジェクトについて忘れていました。 次に最も興味深いものを始めました。 顧客は、プログラムの機能を深刻に拡大し、私を助けるように呼ばれることを決定しました。 当然のことながら、新しい機能機能を取り上げて開始しました。 最初は難しくなかったが、機能の全体的な統合に来たとき、賑やかな群は私の指示に急いだ。 コードのスライスは競合し始め、紛争を破壊するために多くの時間を費やす必要がありました。 「まあ、あなたはどのようにあなたはあなたのアプリケーションでそれを見なかったのですか?」 - 注意深い読者に尋ねます。 起動されましたが、アプリケーションが私にとって抱いてきたという事実のために、時間と神経は範囲で全体的に機能しています。 私は個々の機能のみのテストに限定され、それのために寛大に支払われました。 道徳的バスニ - 「開発の不可欠な部分としてテストを考えてください。」

銀の弾丸のような単体テスト

あなたの神経を排除し、アプリケーションの個々の部分の作業の保証を最もよく、モジュラーテストが最も役立ちます。 あなたがこのひどい言葉に出かけたことがないならば、私は簡単に説明します。 モジュラテストを使用すると、テストプロセスを自動化し、各アプリケーション機能のテストを公開できます。

新しい機能の開発が完了したら(テストを書くオプションと開発の前に)、開発者はそのコードをテストするための特別なコードを書き込みます。 テストコードでは、さまざまな状況と戻り値をシミュレートする必要があります。 たとえば、トリミングスペース(トリム)の機能を書きました。 彼女のパフォーマンスをテストするには、それを主張するいくつかのテストを準備する必要があります。

  • 出力に「行」を渡すと、「文字列」が表示されます。
  • 出力時に「行9」のタイミングを転送するときは、「行9」を取得します。
  • 他の入力パラメータにテストを追加することもできます(たとえば、タブのタブを置き換えます。 一般的に、コードテストをカバーするほど、否定的なオプションを提供します。これは、頭の上の最も責任のある瞬間には少し髪の毛のままになる可能性があります。

    JSの世界では、テストは通常\u200b\u200b特殊なフレームワークを使用して説明されています。 彼らはあなたがテストを説明するために必要なものすべてを持っています、そしてテストレポートを解決するための薄い貧弱なツール。

    テスト!\u003d余分なコード

    モジュール式テストには、追加のコードの作成とサポートが必要なと主張するために、ユニットテストの愛を使用している開発者。 実際のプロジェクトの期限は、最も頻繁に圧縮され、追加のコードを書くことは単に可能性はありません。

    圧縮期限を犠牲にして、私は同意しますが、余分なコードでは議論する準備ができています。 一方では、はい、テストには追加のコードが必要、したがってそれを書き込むための時間が必要です。 一方、このコードは自動車内のエアバッグの役割を実行し、アプリケーションの増加で返済する必要があります。

    時間がなく、執筆テストを放棄したいという願望 - 3回考えます。 おそらく、この場合、コードの最も狡猾なセクションだけをテストして完全にあきらめることは適切です。 あなたのプログラムを前例のないサイズに持ち込めることができるかのように、将来的には常に目を考えていると思います。

    すべてのコードがテストされているわけではありません

    メインコードを書く前にテストについて考える必要があると主張するのはなぜですか? はい、最初は単体テストをカバーすると予想されるため、わずかに異なるスタイルで書かれています。 すべてのコードをテストできるわけではありません。 ロジックと表現が混在しているコード、さらには正常にテストできないところでさえもなります。 ここでは、いくつかの簡単な規則を遵守するように常にお勧めします。

  • 大きな機能を書く必要はありません。 各機能は1つの問題を解決する必要があり、100,500の可能な状況ではありません。 たとえば、データをサーバーに送信するためにデータを掛ける必要はありません。準備を担当する機能に担当します。
  • コードの10行以上のコードからなる関数は最も可能性が悪い機能です。
  • いいえの場合のロジックと表現は一緒になるべきです。
  • Qunit - jQueryのクリエイターからの古典的なジャンル

    Qunit。 JavaScript開発者の間で特に人気があります。 まず、それはよく文書化されて使いやすく、そして次に、それはjQuery作者によって作成されました。 ライブラリは、jQueryデータベース上に作成されたコードとネイティブJavaScriptの両方に適しています。

    公式サイト - http://quunjs.com/からできる最新バージョンのQunitのダウンロード。 ライブラリは1つのJSファイルとCSSファイルの形式です。 必要なコンポーネントのダウンロードがあると仮定し、そうであれば、テストテストを書く時間。 私たちは遠くには行きません、そして上記のTrim()関数をテストしようとします。

    テストを実証するために、次の構造で最も単純なプロジェクトを作成しました。

    index.htmlはテスト結果を表示するメインファイルです。 - Qunit-1.12.0.js - Qunitライブラリファイル。 - example.js - テストコードを含むファイル(私たちの場合はtrim()関数の説明)。 - test.js - テスト付きファイル。 - qunit-\u003d 1.12.0.css - テストを使用したレポートの登録のスタイル。

    Index.htmlファイルとtest.jsの内容はリスト1と2に示されています。すべてのほとんどは2番目のリストに興味があります。これは、テスト機能(Trim())とそのテストコードをテストする性能 注意を払う、Trim()関数自体はどこにでも配置することができ、ジャーナル内のスペースを保存するためにのみ2番目のリストに粉砕しました。

    今すぐ自分でテストを見てください。 ライブラリコードの健全性の検査を実行する qunit.js。 いくつかの方法を提供しています。

  • テスト() - テストを説明するためのラッパー。
  • oK () - 承認最初のパラメータの真実をチェックすることができます。 この例では、私は彼女にtrim()関数の挑戦を与え、私が得ることが期待される価値と比較されます。 条件がtrueの場合 - テストは渡されました。
  • 等() - この方法では、最初と2番目のパラメータの平等を確認できます。 このメソッドが非厳密なテストを実行することを直ちに払うので、スカラー値に適しています。
  • 注意() - 等()の反対。 最初の値が2番目に等しくない場合は実行されます。
  • strictequal() - 1つの違いを持つ1つのequal() - 厳密なチェック(すなわち、データ型もチェックします)。
  • nOTSTRICTEQUAL() - この方法はstriclequal()の反対です。
  • dEEPEQUAL() - 再帰ステートメントの方法は、プリミティブ、配列、オブジェクトに適用されます。
  • notdeepequal() - この方法はDeepequal()とは反対です。
  • 給水する - コールバック関数をテストするための承認例外を生成します。
  • 2番目のリストでは、実際にこれらの方法を適用する方法を視覚的に示しました。 このフォームでテスト例を実行すると、すべてのテストが正常に完了します(対応する画像を参照)。 正常に合格したテストの違いを確認するために、エラーで完了しましたが、1つのテストのコードを少し変更しました。 生地のあるひもで strictequal() 私は故意に誤った結果を追加しました(対応する写真を参照)。

    リスト1. index.htmlファイルの内容

    Qunitテスト

    リスト2.テストファイルとTrim()機能

    関数trim(string)(return(string || "").replace(/ ^ \\ s + | \\ s + $ / g、 "");)テスト( "trim()関数test"、function()(OK (TRIM( "試験")\u003d\u003d "テスト"、 "極端なスペースアップカット"); OK(トリム( "1")\u003d\u003d "1"、 "側に非常に多くのスペース"); OK(TRIM(」 24 ")\u003d \u003d "24"、 "側面の隙間とタブ");((等しいトリム")、 " ""空の文字列"); strictequal(トリム("] [achere")))。

    簡単な機能をテストすることで、それは考え出しているようです。 いずれにせよ、私はさらに追加することはできません。 次に、実際のコードを撮り、自分でテストを書いてみてください。 他のものを見てみましょう。 JavaScript。- 開発者 - 非同期機能のテスト JavaScriptコードを詰めたアプリケーションは99%です。サーバー部分とAjaxを使用して対話します。 チェックすることなくこのコードを残すことも不可能ですが、テストを書くことは少し違います。 例を考えてみましょう。

    ASYNCTEST( "MyasyncFunc()" 関数()(のSetTimeout(関数()\u003d\u003d trueの場合、 "データが正常に転送される");()開始;)、500);));

    以前のものから、この例の主な違い - 代わりのテスト()ラップ()は、それによって直接正確非同期テストのテストに関心があることを示す)(asynctest当てはまります。 それから私は500 mlで待つ時間を起動します。 秒。 この間、MyasyncFunc()関数は、テストサーバーにデータを転送しなければならないし、すべての場合はTrueを返しnishtyak。 ここに最も興味深い瞬間があります。 asynctest()が呼び出されると、実行スレッドが停止し、テストの最後に起動する必要があります。 実行の流れを制御するには Qunit。 start()メソッドとstop()メソッドがあります。

    ライブラリを使用した非同期関数のテスト Qunit。 十分に簡単です。 逆アセンブルしたい最後の例は、いくつかの非同期チェックを実行するテストの作成に関連しています。 このようなタスクでこれで発生する主な質問は、実行ストリームを開始するための最適な場所です。 公式ドックは、次のようなものを適用することを提案しています。

    asynctest( "myasyncfunc()"、function()(:3);ここでは3つのチェックを行ってください(MyAsyncFunc()、「世界は1」より優れています)。OK(MyAsyncFunc()、 "世界をより良い2"より); OK(MYASYNCFUNC()、 ""世界はより良い3以上であることを確認してください); setTimeoutメソッド(関数()()(スタート;)、3000);));

    ユーザーの処置をテストします

    多くのインタフェースピースがJavaScriptに書かれていることを常に思い出されます。 たとえば、ユーザーがPimpeをクリックすると、クリックに対応して何かが起こらなければなりません。 このようなプロジェクトの「インタフェース」コードには大きな量があり、テストをカバーする必要があります。 カスタムキーストロークをシミュレートし、このアクションに対して別のテストを作成できる方法を見てみましょう。 キーをログに記録する特定の機能があると想像してください。 私が3番目のリストを持ってきた彼女のコード:

    リスト3.キーをログダウンします

    FUNCTIONのキーロガー(TARGET)(IF((このinstanceofはキーロガー))(戻り新しいキーロガー(ターゲット);!)this.Target \u003dターゲット; this.log \u003d; VARの自己\u003dこの; this.target.off( "KeyDownイベント") .on( "keydown"、function(event)(self.log.push(event.keycode);)));)

    それでは、この機能をテストしようとしましょう。 まず第一に、テストの本文では、押されたキーをエミュレートする必要があります。 ライブラリとこれを行う最も簡単な方法 jQuery。これを使用すると、一対のコード行にイベントを作成できます(リスト4を参照)。

    リスト4.キーロガーのテストコード

    テスト( "test key test"、function()(varイベント、$ doc \u003d $(文書)、keys \u003d keylogger($ doc);イベント\u003d $。イベント( "Keydown"); Event.KeyCode \u003d 9; $ doc .trigger(イベント)。等しい(keys.log.length、1、 "キーが書き込まれます")。等しい(keys.log [0]、9、コード9のキーを押す););)。

    「KeyDownイベント」 - 非常にテストで上場の初めに、私はキーストロークをエミュレートするためのイベントを準備します。 タブキーを押すことに興味があります(コード9)。 その後、trigger()メソッドを使用して、調理済みイベントを送信し、その後テストを開始できます。 まず、Common Picture - キーが押されたかどうか、そのコードを確認してください。

    テストのカバーの下のDOM

    時間 qunit.js。 ユーザーの処置をテストすることを可能にし、次にDOMの書き込みテストでも問題ないはずです。 これは真実であり、以下の例は以下の私の言葉を確認します。 私はそれについてコメントしません、コードを見るだけで、すべてが明確になるでしょう:

    テスト( "新しいDIV要素を追加"、機能()(VAR $フィクスチャ\u003d $( "#1 QUNIT-フィクスチャ"); $ FixTure.append(」

    これは新しいDIVです
    ");平等($(" div要素 "$治具).LENGTH、1、" 新しいDIVが正常に追加「);!));

    phantom.js - コンソールからテストを実行します

    ライブラリを使用してテストを書く qunit.js。 便利で簡単な、しかし、遅かれ早かれ、それはあなたが何らかの形でテストして結果を収集の立ち上げを自動化するために訪問します。 たとえば、このビジネスではDigitaloceanには別の仮想マシンがあります。これはコンソールでのみ管理できます。

    Phantom.jsプロジェクトを解決するのに十分です。 これは書き込みのための別のフレームワークではありません。 単体テストエンジンの本格的なコンソール版 ウェブキット。。 あなたがより簡単に言うならば、このアプリケーションはブラウザをエミュレートします。 ネットワークの機能をファイル(PNG、JPG)、に胸が張り裂けるページの結果を得る:Phantom.jsを使用して、容易ではない開発者の上に生じる早期以降、テスト実行のテストを自動化するだけでなく、多くのタスクを解決することはできませんモニタ(負荷速度、総演奏などD。)、エミュレーションユーザアクション、などの このプロジェクトの公式文書を怠け者にすることをお勧めします。あなたは間違いなく自分のために面白いことを見つけるでしょう。

    Phantom.js。 さまざまなプラットフォーム(NIX、Mac OS X、Windows)の下で収集できます。 すべてWindows用に設計されている場合は、問題はありません - バイナリと転送を和らげます。 2つのアダプタビデオがある場合、開始の問題が発生する可能性があります。そのうちの1つはNVIDIAです。 この場合、挿入に記載されているハックを使用する必要があります。

    実際に幻影.jsを知り合おうとしましょう。 スキップするには phantom.js。 過去のセクションで作成されたテストで、コンソールで実行結果を取得します。特別なLianter Scenario - Run-Qunit.jsが必要です。 コンソールを開く(Windowsで作業するので、CMDを使用します)、次の形式でコマンドをクリックします。

    Phantom.exe。<путь к run-qunit.js> <путь к странице с тестами>

    私の場合、起動コマンドは次のようになりました。

    E:\\ Soft \\ Phantomjs\u003e phantomjs.exe e:\\ temp \\ testjsforx \\ qunit \\ run-qunit.jsファイル:///e:/temp/testjsforx/qunit/index.html実行の結果:in test 2592ミリ秒。 9渡された9のアサーション、0が失敗しました。

    すべてのテストが渡されました

    カバーコードテストは独自に必要とされ、作成したアプリケーションの拡大に関係なく関係ありません。 もう一度私はあなたに最小のプログラムが堅牢なモンスターに変換されていることを思い出させ、それは維持されそしてドーピング機能を維持する必要があります。 コードテストで覆われています - 成功と品質への鍵。 はい、これは、自動テストに適したコードをすぐに書き始めるのが簡単ではありませんが、私を信じています、私を信じてください。 これで、私はすべてを持っています、幸運を祈ります!

    テストに時間がない場合

    時間がない場合、それは単純な関数のためのテストを落書きすることを意味しません(記事の例から同じTrim()を取ってください)、コードの最も重要なセクションに焦点を合わせることをお勧めします。 頻繁に変更されたコードを書くときに同じ規則に従ってください。 ライブプロジェクトの技術的なタスクはしばしば変化し、いくつかの機能を常に更新する必要があります。 そのような変更は不快な瞬間を伴うかもしれません - 新しいデータを使用して、変更されたコードはうまく機能し、古いは有機的にダイジェストされません。 ここでキャッチすることはできません、そのような機能は直ちにテストをカバーすることをお勧めします。 簡単な規則の覚え員 - すべてのコードテストをカバーする時間がありません。

    良いテストの規則

  • テストはできるだけ単純でなければなりません。 より難しいテストは、エラーを許可する可能性が高くなります。
  • テストはモジュール上でグループ化され、エラーを見つけやすく、アプリケーションの特定の部分をテストすることができるようにする必要があります。
  • 各テストは他のテストに依存しないでください。
  • 各バグ検出では、常に別のテストを書いてください。
  • WindowsのPhantom.jsの問題

    それはとても起こりました、しかし私がLinuxでテストしなかったすべての例で、古い種類のWindows 7の下ではテストしませんでした。 私のラップトップ上で、統合されたビデオに加えて、チップは依然としてNVIDIAを掛け出し、Phantom.jsがPhantom.exit()コマンドに応答することをカテゴリ的に拒否したためです。 その結果、スクリプトを実行した後、phantom.jsプロセスはその作業を完了し、メモリにハングアップし続けました。 端末ウィンドウも完了コマンドへの応答を停止しました(Ctrl + C - は役に立ちませんでした)。

    あなたが同様の問題を遭遇して使用する予定の場合 phantom.js。 Windowsでは、次のハックをする準備をします。 NVIDIAコントロールパネルを開きます。 ツリーパラメータ3Dを見つけます。 サイドはオプション「優先グラフィックアダプタ」に表示されます。 デフォルトでは、その値はAVTOVYTに設定されています。 「NVIDIA高性能プロセッサ」または「統合グラフィック機器」に変更する必要があります。 このシンプルなトリックの後 phantom.js。 従順に行動し始めた。

  • クリスチャン・ジョン、「テスト駆動JavaScript Development」は、テストを書くという点でJavaScriptを表示するいくつかの本の1つです。
  • John Reving、Beer Bibo "JavaScript Ninja" - 中間レベルのトレーニングを備えたJS開発者の最初のJS開発者の最初のJS開発者に来る良い本。 この本は、効果的なクロスブラウザコード、イベント処理ニュアンス、そして他の多くのグッズを書くという問題を詳細に説明しています。
  • テストはソフトウェア開発サイクルの不可欠な部分です。 初心者の開発者のチームはしばしば彼の役割を過小評価し、古い方法でアプリケーションのパフォーマンスをチェックします - 「作品、そして大丈夫」。 遅かれ早かれ、この戦略は失敗を与え、バグトラッカーはタスクの無数の軍隊と重複し始めます。 様々な西部に喜んでいないため、JavaScriptコードをテストするニュアンスを扱うために一度お勧めします。

    JavaScriptはもうケーキではありません!

    おそらくあなたは今日のJavaScriptがアプリケーションの外観を復活させるための言語だけではないことを説明する必要はありません。 しかし、私はまだ説明し、少し紹介をします。 ④それで、JavaScriptがJokesに使用されるか、メニューメニューを使用して、取り消したほど渡されたとき。 今、それはクライアント上でもサーバー上でも同様によく機能する独立した言語です。 JavaScriptの役割は大幅に増加しているので、コードを書くときには、他のプログラミング言語でよく証明されていることを恥ずかしがり屋であるべきではありません。

    実務家やパラダイムの意味は何ですか? もちろん、MVCアーキテクチャテンプレート(モデルビューコントローラ)とコード組織パターン。 この単純な知恵の後、あなたは簡単に伴うだけでなく、自動的にテストする能力も持っているより良いコードを書くことができるでしょう。

    良いテストの規則

    • テストはできるだけ単純でなければなりません。 より難しいテストは、エラーが発生する可能性が高くなります。
    • テストはモジュールにグループ化する必要があり、エラーを見つけやすく、アプリケーションの特定の部分をテストすることができるようにする必要があります。
    • 各テストは他のテストに依存しないでください。
    • 各バグ検出で常に別のテストを書いてください。

    ほとんどのテスターエラー

    最も人気のあるテストの方法は常に「目」で常にバラールテストであることは秘密ではありません。 その本質は恥ずべきことが簡単です - 数千行のコードを書いた、タスクを解決し、彼の創造を立ち上げました。 彼は演奏し、早くしました - すべてが働いているようです、あなたは戦闘サーバーを注ぐことができます。 すべてが非常に簡単で、開発者の正しい注意を払っています(理想的には「テスター」とは別の人は「テスター」という名前の人)はアプリケーションの正確さに貸します。

    実際には、すべてが多少異なります。 別のテスターは通常はそうではありません。 開発者自体はプログラムのパフォーマンスを確認しようとしており、テクニカルタスクで定義されている一連のアクションを実行しています。 コードのより高度なキューブは、Seleniumのようなツールを使用して同様の統合テストを自動化します。

    したがって、プログラマは最大のエラーのみを検出する機会を得ます。 残念なことに、「愚かな」および「予期しない」ユーザの行動、ならびに99%のケースのビジネスロジックの厄介な動きはシーンの後ろに残ります。

    別のテスタの存在は、一定時間までも問題を解決する。 あなたが彼の精子ケアを細部に捨てても、そのテストの質はアプリケーションの増加を伴うゼロに努力します。 私は練習から例を与えます。

    私が小規模なプログラムを開発するように指示されたら。 機能性によると、このプロジェクトは、私が最短時間で実装されている最も簡単なCRMを、似ていました。 正確な報酬を受け取った後、私はすべての情報源を顧客に伝え、8ヶ月間プロジェクトについて忘れていました。 次に最も興味深いものを始めました。 顧客は、プログラムの機能を深刻に拡大し、私を助けるように呼ばれることを決定しました。 当然のことながら、私は機能の機能を入力し始めました...最初は簡単でしたが、機能的な全体的な統合に来たとき、賑やかな群は私の指示に急いだ。 コードのスライスは競合し始め、紛争を破壊するために多くの時間を費やす必要がありました。 「まあ、あなたはどのようにあなたはあなたのアプリケーションでそれを見なかったのですか?」 - 読者は尋ねます。 私がお答えします:私はそれを実行しましたが、原因アプリケーションが出て行ったという事実のために、スコープを持つ全機能をテストするために、時間と神経をテストするための十分な時間がありませんでした。 私は個々の機能のみのテストに限定され、それのために寛大に支払われました。 道徳的大手:「開発の不可欠な部分としてのテストについて考える」

    銀の弾丸のような単体テスト

    あなたの神経を排除し、アプリケーションの個々の部分の作業の保証を最もよく、モジュラーテストが最も役立ちます。 あなたがこのひどい獣に出かけたことがないならば、私は簡単に説明します。 モジュラテストを使用すると、テストプロセスを自動化し、各アプリケーション機能のテストを公開できます。

    新しい機能の開発が完了したら(テストを書くオプションと開発の前に)、開発者はそのコードをテストするための特別なコードを書き込みます。 さまざまな状況と戻り値をシミュレートする必要があります。 たとえば、トリミングスペース(トリム)の機能を書きました。 彼女のパフォーマンスをテストするには、次のように主張するいくつかのテストを準備する必要があります。

    • 出力に「行」を渡すと、「文字列」が表示されます。
    • 出力時に「行9」のタイミングを転送するときは、「行9」を取得します。

    他の入力パラメータにテストを追加することもできます(たとえば、タブのタブを置き換えます。 一般的に、コードテストをカバーするほど、否定的なオプションを求めるより多くの否定的なオプションが求められるほど、頭の上の最も責任ある瞬間に残っている可能性が高くなります。

    JSテストの世界では、通常、特殊なフレームワークを使用して説明されています。 彼らはこれが必要なもの、そしてテストレポートをどのツールにするためのすべてのツールを持っています。

    テスト!\u003d余分なコード

    ユニットテストの愛を使用しない開発者は、モジュールテストが追加のコードを書いてサポートすることを議論するために愛を講じています。 実際のプロジェクトの期限は、最も頻繁に圧縮され、追加のコードを書くことは単に可能性はありません。

    テストに時間がない場合

    時間がない場合には、それは簡単な機能((同じトリムを取る)記事の例から)のための落書きの試験にも意味がありません、コードの最も重要なセクションに注力することをお勧めします。 頻繁に変更されたコードを書くときに同じ規則に従ってください。 ライブプロジェクトの技術的なタスクはしばしば変化し、いくつかの機能を常に更新する必要があります。 そのような変更は不快な瞬間を伴うかもしれません - 新しいデータを使用して、変更されたコードはうまく機能し、古いは有機的にダイジェストされません。 ここで捕まえないことは失敗するので、そのような機能はすぐにチェックするのが良いです。 簡単な規則を忘れないでください。すべてのコードテストをカバーする時間がありません - 最も重要な部分をカットします。


    圧縮された用語は同意しますが、不要なコードによれば主張する準備ができています。 一方では、はい - テストには追加のコードが必要です。これはそれを書く時間を意味します。 一方、このコードは自動車内のエアバッグの役割を実行し、アプリケーションの増加で返済する必要があります。
    • クリスティアン・ヨハンセン「テスト駆動JavaScriptの開発」(GOO.GL/ME6IS)がテストを書くという点ではJavaScriptを閲覧数冊の本の一つです。
    • John Reving、Beer Bibo "JavaScript Ninja"(goo.gl/xqudkj) - 主に平均的なトレーニングレベルを持つJS開発者によって便利な良い本。 この本は、効果的なクロスブラウザコード、イベント処理ニュアンス、そして他の多くのグッズを書くという問題を詳細に説明しています。
    • David Flanagan "JavaScript。 完全ガイド「(GOO.GL/RZJJK) - 本は6回を転載し、各リリースがベストセラーになりました。 確かに、これは最も詳細なJavaScriptガイドです。これは、少なくとも1回各JS開発者を読み取る義務があります。
    • PhantomJS + JScoverage + QSNITまたはコンソールJSユニットテスト(GOO.GL/FYQ38) - この記事の作成者は、統計を収集し、コードカバレッジテストの割合をカウントするための靭帯上にリストされたパッケージの使用を示しています。
    • PHANTOMJSを使用するのに有用な例 - このページは大量の幻影戦闘の使用を示しています。

    時間がなく、執筆テストを放棄したいという願望 - 3回考えます。 おそらく、この場合、コードの最もかわいい領域のみをカバーすることは適切であり、テストを完全にあきらめることはできません。 あなたのプログラムが前例のないサイズに成長できるかのように、常に将来の範囲で考えてください。

    すべてのコードがテストされているわけではありません

    メインコードを書く前にテストについて考える必要があると主張するのはなぜですか? はい、最初は単体テストをカバーすると予想されるコードはわずかに異なるスタイルで書かれています。 すべてのコードをテストできるわけではありません。 ロジックと表現が混在しているコード、まだどこでも理解せずに、正常にテストすることは不可能です。 ここで私はいつもいくつかの簡単な規則を遵守するようにあなたに助言します。

    • 大きな機能を書く必要はありません。 各機能は1つの問題を解決する必要があり、100,500の可能な状況ではありません。 たとえば、データをサーバーに送信するためにデータを掛ける必要はありません。
    • 10行以上のコードで構成される関数、ほとんどの可能性が悪い機能です。
    • いいえの場合のロジックと表現は一緒になります。

    Qunit - jQueryのクリエイターからの古典的なジャンル

    QunitはJavaScript開発者の間で非常に人気があります。 まず、それはよく文書化されて使いやすく、そして次に、それはjQuery作者によって作成されます。 ライブラリは、jQueryとNative JavaScriptに基づいて作成されたコードをテストするのに適しています。


    公式サイトからできる最新バージョンのQunitをロードします。 ライブラリは1つのJSファイルとCSSファイルの形式です。 見つけた必要なコンポーネントのダウンロードがあるとします。そうすれば、テストテストを書く時間です。 これまでになく、trim()関数をテストしようとしましょう。

    テストを実証するために、次の構造で最も単純なプロジェクトを作成しました。

    • index.htmlはテスト結果を表示するメインファイルです。
    • qunit-1.12.0.js - Qunitライブラリファイル。
    • example.js - テストコードを含むファイル(私たちの場合はtrim()関数の説明);
    • test.js - テスト付きファイル。
    • qunit-1.12.0.css - テストを使用してレポートを登録するためのスタイル。

    Index.htmlファイルとtest.jsの内容はリスト1と2に示されています。すべてのほとんどは2番目のリストに興味があります。これは、テスト機能(Trim())とそのテストコードをテストする性能 注意を払う、Trim()関数自体はどこにでも配置することができ、ジャーナル内のスペースを保存するためにのみ2番目のリストに粉砕しました。
    今すぐ自分でテストを見てください。 Qunit.jsライブラリは私達にいくつかの方法を提供します:

    • test() - テストを説明するためのラッパー。
    • ok() - 承認最初のパラメータの真実をチェックすることができます。 この例では、私は彼女にtrim()関数の挑戦を与え、私が受け取る予定の値と比較します。 条件がtrueの場合 - テストは渡されました。
    • equal() - この方法では、最初と2番目のパラメータの平等を確認できます。 このメソッドが非厳密なテストを実行することを直ちに払うので、スカラー値に適しています。
    • nOTEQUAL()は等()の反対です。 最初の値が2番目に等しくない場合は実行されます。
    • strictequal() - 1つの違いを持つ等しい()と似ています - 厳密なチェックを使用します(つまり、データ型もチェックします)。
    • notStrictICTEQUAL() - この方法はstriclequal()の反対です。
    • depequal() - 再帰的ステートメントのための方法は、プリミティブ、配列、オブジェクトに使用されます。
    • notdeethequal() - この方法はDeepEqual()の反対です。
    • raise() - 例外を生成するコールバック関数をテストするための承認。

    2番目のリストでは、実際にこれらの方法を適用する方法を視覚的に示しました。 このフォームでテスト例を実行すると、すべてのテストが正常に完了します(対応する画像を参照)。 正常に渡されたテストの違いを確認するために、エラーで終了したときに、1つのテストのコードをわずかに変更しました。 strictequal()を使用してテストを持つ文字列で、私は故意に誤った結果を追加します(対応する写真を参照)。

    リスト1. index.htmlファイルの内容 Qunitテスト

    簡単な機能をテストすることで、それは考え出しているようです。 いずれにせよ、私はさらに追加することはできません。 次に、実際のコードを撮り、自分でテストを書いてみてください。 JavaScript開発者のタスク - 非同期関数のテストの前に発生することが多い他のことを見てみましょう。 JavaScriptコードを詰めたアプリケーションは99%です。サーバー部分とAjaxを使用して対話します。 チェックすることなくこのコードを残すことも不可能ですが、テストを書くことは少し違います。 例を考えてみましょう。

    asynctest( "myasyncfunc()"、function()(settimeout(function()\u003d\u003d true、 "データは正常に転送されます"); start();)、500);););

    test()wrap()の代わりに、以前のものからこの例の主な違いは、asynctest()を適用し、それによってそれが非同期テストに関心があると直接述べています。 それから私は500ミリ秒の待ち時間を起動します。 この間、myAsyncFunc()関数はテストサーバーにデータを転送する必要があります。すべてOKの場合はtrueを返します。 ここに最も興味深い瞬間があります。 asynctest()が呼び出されると、実行ストリームが停止し、テストの最後にそれを実行する必要があります。 Qunitの実行時を制御するには、start()およびstop()メソッドがあります。


    Qunitライブラリを使用した非同期機能のテストは非常に簡単です。 逆アセンブルしたい最後の例は、いくつかの非同期チェックを実行するテストの作成に関連しています。 そのようなタスクで発生する主な質問は、実行ストリームを開始するための最適な場所です。 公式ドックは、これらの場合に適用することを提案している

    asynctest( "myasyncfunc()"、function()(:3);ここでは3つのチェックを行ってください(MyAsyncFunc()、「世界は1」より優れています)。OK(MyAsyncFunc()、 "世界をより良い2"より); OK(MYASYNCFUNC()、 ""世界はより良い3以上であることを確認してください); setTimeoutメソッド(関数()()(スタート;)、3000);));

    ユーザーの処置をテストします

    多くのインタフェースピースがJavaScriptに書かれていることを常に思い出されます。 たとえば、ユーザーがPimpeをクリックすると、クリックに対応して何かが起こらなければなりません。 このようなプロジェクトの「インタフェース」コードは膨大な量であり、テストをカバーすることも必要です。 カスタムキーストロークをシミュレートし、このアクションに対して別のテストを作成できる方法を見てみましょう。 キーをログに記録する特定の機能があると想像してください。 彼女のコード私は3番目のリストに導いた。

    リスト3.ロギングプレス機能Keylogger(ターゲット)キー(if(if(このインスタンス)(このインスタンスのキーロガー)(New Keylogger(ターゲット)); this.target \u003dターゲット; this.log \u003d; var salf \u003dこれ。this.target。 OFF( "Keydown").on( "keydown"、function(event)(self.log.push(event.keycode);))));)

    それでは、この機能をテストしようとしましょう。 まず第一にテストの本体で、押されたキーをエミュレートする必要があります。 jQueryライブラリを使用する最も簡単な方法で、コード行ペアにイベントを作成できます(リスト4を参照)。

    リスト4.キーロガーテストのテストコード(「鍵録音テスト」、function()(varイベント、$ doc \u003d $(文書)、keys \u003d keylogger($ doc)。イベント\u003d $イベント( "Keydown");イベント.KeyCode \u003d 9; $ doc.trigger(イベント)。等しい(keys.log.length、1、 "キーが書き込まれます")。等しい(keys.log、9、コード9 "のキーを押す);); ;

    テストを使用してリストの先頭に、keystroke - "keydown"をエミュレートするためのイベントを準備します。 タブキーを押すことに興味があります(コード9)。 その後、trigger()メソッドを使用して、私は調理されたイベントを送信し、その後テストに進むことができます。 最初に写真全体 - キーが押されてからそのコードが押されたかどうかを確認します。

    テストのカバーの下のDOM

    Qunit.jsを使用すると、ユーザーのアクションをテストできます。その後、DOMの書き込みテストでも問題ありません。 これは当てはまり、以下の例では私の言葉を確認します。 私はそれについてコメントしません、ちょうどコードを見て、すべてが明確になるでしょう:

    テスト(「新しいDIV要素を追加」、function()(var $ fixture \u003d $( "#Qunit-Fixture"); $ FIXTURE.APPEND( "

    これは新しいDIVです
    ");平等($(" div要素 "$治具).LENGTH、1、" 新しいDIVが正常に追加「);!));

    Phantomjs - コンソールからテストを実行します


    Qunit.jsライブラリを使用した書き込みテストは便利で簡単ですが、遅かれ早かれ、あなたは起動、テスト、結果の集まりを自動化したいという欲求を訪問します。 たとえば、このビジネスではDigitaloceanには別の仮想マシンがあります。これはコンソールでのみ管理できます。

    Phantomjsプロジェクトを解決するのに十分です。 これは、単体テストを書くための別のフレームワークではありませんが、本格的なコンソール版のWebKitエンジンです。 あなたがより簡単に言うならば、このアプリケーションはブラウザをエミュレートします。 Phantomjsを使用して、テストの実行テストを自動化することはできません。また、開発者にわたって早くともまたは後で発生するのは多くのタスクを解決することはできません。ファイルへのページのレンダリングの結果(PNG、JPG)、機能ネットワークモニタ(ダウンロード速度、全体的なパフォーマンスなど)、ユーザーの処置のエミュレーションなど。 このプロジェクトの公式文書を怠け者にすることをお勧めします。あなたは間違いなく自分のために面白いことを見つけるでしょう。

    Phantomjsはさまざまなプラットフォーム(* NIX、OS X、Windows)について収集できます。 すべてWindows用に設計されている場合は、問題がありません - バイナリを和らげ、先に進みます。 2つのビデオアダプタが設置されている場合は、起動による小さな困難が発生する可能性があります。そのうちの1つはNVIDIAです。 この場合、挿入に記載されているハックを使用する必要があります。


    実際にファントムを知り合いようとしましょう。 過去のセクションで作成したPhantomjsテストをスキップして、コンソールで実行結果を取得するには、特別なログダスクリプト - run-qunit.jsが必要です。 コンソールを開く(私はWindowsで作業しているので、CMDを使用しています)、フォーマットでコマンドをクリックします

    phantom.exe。<путь к run-qunit.js> <путь к странице с тестами>

    私の場合、起動コマンドは次のようになりました。

    E:\\ Soft \\ Phantomjs\u003e phantomjs.exe e:\\ temp \\ testjsforx \\ qunit \\ run-qunit.jsファイル:/// e:/temp/testjsforx/qunit/index.html

    その実行結果

    テストは2592ミリ秒で完了しました。 9渡された9のアサーション、0が失敗しました。

    すべてのテストが渡されました

    カバーコードテストは一意的に必要とされ、アプリケーションを作成するかどうかに関係なく。 もう一度私は思い出させます。最小のプログラムでさえ堅牢なモンスターに変換され、それは維持され、機能を完成させる必要があります。 テストコードで覆われています - 成功と品質への鍵。 はい、これはすぐに自動テストに適したコードを書き始めるのが簡単ではありませんが、私を信じて、これらすべての苦しみは将来的に返済されます。 今日私はすべてを持っています、幸運を祈ります!

    WindowsのPhantomjsの問題

    それは起こりましたが、この記事のすべての例はLinuxではテストされませんでしたが、古い良いWindows 7の下では、いくつかのビデオアダプタを使用するシステムの作業時には、PhantomJSに問題があることがわかります。 私のラップトップで、統合されたビデオチップに加えて、NVIDIAはまだぶら下がっています。このため、Phantomjsはphantom.exit()コマンドに応答することをカテゴリ的に拒否しました。 その結果、スクリプトを実行した後、PhantomJSプロセスはその作業を完了し、メモリにハングアップし続けました。 端末ウィンドウは完了コマンドへの応答も停止しました( 助けなかった)。

    あなたが同様の問題を見つけて、Windows上でPhantomjsを使用する予定がある場合は、次のハックを実行する準備をしてください。 NVIDIAコントロールパネルを開きます。 ツリーパラメータ3Dを見つけます。 右側には、オプション「優先グラフィックアダプタ」が表示されます。 デフォルトで。 その値は「AVTovyt」に設定されています。 「NVIDIA高性能プロセッサ」または「統合グラフィック機器」に変更する必要があります。 このシンプルなスタントの後、ファントムが従順に行動し始めました。

    今すぐサイトでは、以下のトピックに関する知識についてテストが可能です。 html, CSS, JavaScript。, PHP。, SQL..

    各試験はからなる 10-t。 特定のトピックに関する質問。 私は、あなたの知識レベルを最も慎重にチェックするために、特定の言語を最も多様なアプリケーションに影響を与えようとしました。

    もちろん、みんな テストは無料です そして誰もそれらを渡すことができます。

    テストを渡す手順

    1. リンクに行きなさい」 テストを開始します「適切なテストで。
    2. 選択して設定した質問に答えてください のみ 正しいオプション
    3. テストが完了すると、あなたは見るでしょう 彼のスコア, 間違いの数、 及び 各質問の災害 生地から。

    注意! 前の質問に戻ることは機能しませんので、答える前に考えてください。

    現在利用可能なテスト

    1. html

      • 合計テストが渡されました。 75424人
      • ミドルスコア: 5の2.83。 ポイント。

      知識基本のテスト html。 あなたはメインに関する知識を必要とするでしょう HTML Tagov.、有能な使用だけでなく。 標準の機能を理解することも必要です XHTML 1.1。.

    2. CSS

      • 合計テストが渡されました。 32828人
      • ミドルスコア: 5の3.37。 ポイント。

      テストは基本に関する知識をチェックします CSS。 テストを正常に渡すには、メインの種類のセレクタ(それらの構文)を知っておく必要があります。主な特性とその可能な値を知っており、最も人気のある疑似要素の任命も知っています。

    3. JavaScript。

      • 合計テストが渡されました。 24845人
      • ミドルスコア: 5の3.31。 ポイント。

      このテストはJavaScriptを介してあなたの知識をチェックします。 テストからの質問は、この言語のさまざまな適用分野に影響します。 「小さい」ニュアンスの理解について多くの質問があります。 あなたの残りの部分は基本的なことに関する知識を必要とします:変数、基本的なJavaScript関数、操作の優先順位などの作業。

    4. PHP。

      • 合計テストが渡されました。 33239人
      • ミドルスコア: 5の3.03。 ポイント。

      このテストはPHPであなたの知識をチェックします。 PHPの基本構造に関する知識は、変数、セッション、リダイレクトの販売、その他の標準的なものに関する知識が必要です。
      良い要求: テストには、「スクリプトをもたらすもの」というタイプ別の多くの質問が含まれています。 大きな要求、それをコピーしてチェックしないでください。 自分の前に正直に言う。

    5. SQL.

      • 合計テストが渡されました。 18014人
      • ミドルスコア: 5の3.28。 ポイント。

      このテストは、SQLクエリ言語によってあなたの知識をチェックします。 質問は、この言語の最も基本的な知識のみに影響を与えずに影響を与えます。 あなたは彼らの有能な使用だけでなく、最も基本的なSQL要求に関する知識も必要です。

    トピックを続ける:
    インターネット

    Windowsブートディスクを作成する最も一般的な方法の1つは、この記事で説明されている方法です。 そしてより正確に創造の中で、それは遠い世界で私たちを助けるでしょう...