Javascriptで何をテストする必要がありますか?


12

仕事では、Javascriptベースのアプリケーション(実際はCoffeescriptを使用していますが、それでも)を開始したばかりで、その中にJsTestDriverとファブリックを使用した自動テストシステムを実装しています。

これほど多くのJavascriptを使用して何かを記述したことはないため、これまでJavascriptのテストは行っていません。私たちがユニットテストで何をテストすべきか正確にはわかりません。私たちはさまざまなことのためにJQueryプラグインを書いたので、JsTestDriverで可能な限り正しいことを検証する必要があることは非常に明白ですが、私のチームの他の誰もがページレベルのJavascriptもテストする必要があると考えているようです。

単体テストとしてページレベルのJavascriptをテストする必要はないと思いますが、代わりにSeleniumなどのシステムを使用して、すべてが期待どおりに動作することを確認します。私の主な理由は、現時点では、ページレベルのJavascriptテストはJsTestDriverを介して失敗することが保証されているためです。

それでは、Javascriptで単体テストを行うべきものは何ですか?


3
モジュールに記述したjavascriptコードを分離します。次に、それらのモジュールの入力と出力をテストするだけです。DOMを扱うモジュールは、DOMをテストする必要があることを意味します。jsTestDriverよりも優れたツールを使用してください。
レイノス

ビジネスロジックの単体テストを行う必要があります。DOM上のビジネスロジックと要素が絡み合っている場合、設計上の欠陥があります。ページ要素から可能な限り多くのビジネスロジックを抽象化し、適切に単体テストできるようにします。DOM要素の相互作用の検証には、Seleniumを使用する必要があります。
maple_shaft

1
@NathanHoadブラウザ自体で実行される単体テストを作成します。nodeunit、qunit、およびジャスミンは賢明なツールです。ブラウザで実行すると、DOMがあります。テストのようなツールを使用して、ブラウザーのテストを自動化できます。
レイノス

1
ありがとう。ブラウザで実行できると主張しているjsTestDriverを探していましたが、技術的には本当ですが、QUnitで実行するのと同じではないことを発見しました。現時点では、QUnitを使用する独自のツールに取り組んでおり、カスタムDjangoデバッグツールバーパネルがあります。Seleniumを使用すると、失敗したテストを検出できます。また、上司はテストにお金を払うのではないかと疑っていますが、見栄えは良いです!
ネイサンホード

回答:


4

可能なすべてをテストします。

純粋なロジックは簡単にテストできます。

コードがDOMまたはネットワークと対話する場合、それははるかに困難です。

特定のDOM要素ではなく任意のDOM要素で動作するようにコードの一部を抽象化できる場合は、より簡単にテストできます。(要素をパラメーターで動作させる)。

Ajaxを使用するコードは、固定データでコールバック関数を呼び出すだけでテストできます。私は$.ajax自分の関数で上書きしたいくつかのテストを行いました。完了したら、必ず本物を戻してください!

見つけられるのは、「ページレベルのjavascript」は実際には「密結合コード」を意味し、コードの一部を分離すれば、それらを個別にテストできるということです。

(Seleniumは単体テストツールではありません。高レベルのシナリオには適していますが、試用することはできません。また、隔離された環境では機能しません。)


jasmineは関数呼び出しと応答データをモックできます。関数をオーバーライドする代わりに、それを調べることができます。
スティーブ

明確にする必要があります-各ページに機能などがあります。内部で実行するコードのテストについて詳しく話していました$(document).ready(...)
ネイサンホード

1
それはそれがどれだけ大きいかという問題...です。:-)これも、テストされている単一の名前付き関数にまとめることができると思います。次に、テストされていないコードは1行です。(今ではそれは目標であり、与えられたものではありません。実際、私は常にテストされていないコードを複数行持っています。)
ショーンマクミラン

@SeanMcMillan-いくつかのイベントをいくつかのDOM要素にのみバインドする関数など、DOMにのみ影響するアプリケーションの部分をテストするのは非常に難しいと感じています。これらのイベントが適切に書き込まれたことをどのように確認しますか?ないユニットテストを行うことができます何か、本当のブラウザクリックしてチェック(セレンを使用して、または何でも)
VSYNC

@vsync:たとえば、クリックハンドラーが特定のDOM要素に簡単にアタッチされたことをテストできます。「クリック」が適切なハンドラーであり、適切な要素にアタッチされていることをテストすることは不可能だと思います。
ショーンマクミラン

5

テストアルゴリズム。GUIに密接に関連する部分は特定のブラウザにより依存しているため、セレンのようなユーティリティを使用してテストする必要があります。

もちろん、コードには孤立したコードとしてアルゴリズムを含める必要があります。そうでない場合、ユニットテストはほとんど不可能です。

jqueryプラグイン(btw)は、簡単にユニットテストできません。


すべての良い点!それらがどのように書かれているかにもよりますが、ユニットテストも簡単ではありません。
ネイサンホード

-1

私は以前はJavaを使っていましたが、JavaのユニットテストはJavaScriptのユニットテストよりも簡単です。

私はテスト駆動型開発で販売されているのが最善であるため、JavaScriptの単体テストの方法も模索しています。Javaでは、データベース、データアクセスオブジェクトに接続するコードをモックアウトし、DOMを変更するJavaScriptのコードと、サーバーへのAJAX呼び出しを行うコードと比較します。

私が得ているのは、テストする必要があるのは明示的にロジックであるように思われるということです。たとえば、ユニットテストの実行時にAJAX呼び出しを行いたくないのは、(a)サーバーを実行する必要があり、(b)低速であり、ユニットテストのガイドラインの1つは、開発者が毎分実行することを避けないように、超高速です。

別のガイドラインは、継続的な統合プロセスが、失敗した単体テストを検出したことを知らせる電子メールを送信することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.