TDD用のJavaScript単体テストツール


716

私は多くのJavaScriptユニットテストとテストツールを調査して検討しましたが、完全にTDDに準拠するための適切なオプションを見つけることができませんでした。では、TDDに完全に準拠したJavaScript単体テストツールはありますか?

回答:


1506

カルマまたは分度器

KarmaはNode.jsで構築されたJavaScriptテストランナーであり、ユニットテスト用です。

Protractorはエンドツーエンドのテスト用で、Selenium Web Driverを使用してテストを実行します。

どちらもAngularチームによって作成されました。どちらでも、任意のアサーションライブラリを使用できます。

スクリーンキャスト:Karmaはじめに

関連

長所

  • node.jsを使用するため、Win / OS X / Linuxと互換性があります
  • PhantomJSを使用してブラウザーまたはヘッドレスからテストを実行する
  • 一度に複数のクライアントで実行する
  • ブラウザを起動、キャプチャ、および自動的にシャットダウンするオプション
  • 開発用コンピューターまたは個別にサーバー/クライアントを実行するオプション
  • コマンドラインからテストを実行します(ant / mavenに統合できます)
  • テストのxUnitまたはBDDスタイルを作成する
  • 複数のJavaScriptテストフレームワークをサポート
  • 保存時にテストを自動実行
  • プロキシがクロスドメインをリクエストする
  • カスタマイズ可能:
    • 他のテストフレームワーク(Jasmine、Mocha、QUnit組み込み)をラップするように拡張します
    • あなた自身の主張/反駁
    • 記者
    • ブラウザランチャー
  • WebStormのプラグイン
  • Netbeans IDEでサポート

短所

mocha.js

mocha.jsの機能、長所、短所についてコメントする資格はまったくありませんが、JSコミュニティで信頼している誰かから勧められただけです。

ウェブサイトで報告されている機能のリスト:

  • ブラウザのサポート
  • promiseを含むシンプルな非同期サポート
  • テストカバレッジレポート
  • 文字列差分サポート
  • javascript#テストを実行するためのAPI
  • CIサポートなどの適切な終了ステータス
  • tty以外の色を自動検出して無効にします
  • キャッチされなかった例外を正しいテストケースにマッピングする
  • 非同期テストタイムアウトのサポート
  • テスト固有のタイムアウト
  • うなり声通知サポート
  • レポートのテスト期間
  • 遅いテストを強調
  • ファイルウォッチャーのサポート
  • グローバル変数リーク検出
  • オプションで、正規表現に一致するテストを実行する
  • アクティブなループで「ハング」するのを防ぐ自動終了
  • スイートとテストケースを簡単にメタ生成
  • mocha.optsファイルのサポート
  • テスト実行をフィルタリングするためのクリック可能なスイートタイトル
  • ノードデバッガのサポート
  • done()への複数の呼び出しを検出します
  • 必要なアサーションライブラリを使用する
  • 9人以上のレポーターにバンドルされた拡張可能なレポート
  • 拡張可能なテストDSLまたは「インターフェース」
  • 各フックの前、後、前、後
  • 任意のトランスパイラーのサポート(コーヒースクリプトなど)
  • TextMateバンドル

ヨルポ

ヨルポ

これは存在しなくなり、代わりに順次 .jsにリダイレクトされます

Yolpoは、JavaScriptの実行を視覚化するツールです。JavaScript API開発者は、APIを表示して伝えるためのユースケースを作成することをお勧めします。このようなユースケースは、回帰テストの基礎を形成します。

エイバ

AVAロゴ

ES2015のサポートが組み込まれた未来的なテストランナー。JavaScriptはシングルスレッドですが、非同期の性質により、Node.jsのIOは並行して発生する可能性があります。AVAはこれを利用してテストを同時に実行します。これは、IO負荷の高いテストに特に有益です。さらに、テストファイルは個別のプロセスとして並行して実行されるため、各テストファイルのパフォーマンスと分離された環境がさらに向上します。

  • 最小限で高速
  • 単純なテスト構文
  • テストを同時に実行します
  • アトミックテストの記述を強制します
  • 暗黙のグローバルなし
  • 各テストファイルの分離環境
  • ES2015でテストを書く
  • 約束のサポート
  • ジェネレーター機能のサポート
  • 非同期機能のサポート
  • 観察可能なサポート
  • 強化されたアサート
  • オプションのTAP出力
  • スタックトレースを消去する

Buster.js

Node.jsで構築されたJavaScriptテストランナー。非常にモジュール式で柔軟性があります。独自のアサーションライブラリが付属していますが、必要に応じて独自に追加できます。アサーションライブラリは切り離されているので、あなたは、他のテストランナーでそれを使用することができます。代わりに使用するのassert(!...)expect(...).not...、それは使用していますrefute(...)素敵なツイスト私見です。

ブラウザのJavaScriptテストツールキット。ブラウザーの自動化(JsTestDriverなど)によるブラウザーのテスト、QUnitスタイルの静的HTMLページのテスト、ヘッドレスブラウザー(PhantomJS、jsdomなど)でのテストなどを行います。見てください概要を

Node.jsテストツールキット。同じテストケースライブラリ、アサーションライブラリなどを取得できます。これは、ハイブリッドブラウザやNode.jsコードにも最適です。Buster.JSを使用してテストケースを作成し、Node.jsと実際のブラウザーの両方で実行します。

スクリーンキャスト:Buster.jsはじめに(2:45)

長所

  • node.jsを使用するため、Win / OS X / Linuxと互換性があります
  • ブラウザから、またはPhantomJSでヘッドレスからテストを実行します(すぐに)
  • 一度に複数のクライアントで実行する
  • NodeJSテストをサポート
  • 開発用コンピューターでサーバー/クライアントを実行する必要はありません(IEは必要ありません)
  • コマンドラインからテストを実行します(ant / mavenに統合できます)
  • テストのxUnitまたはBDDスタイルを作成する
  • 複数のJavaScriptテストフレームワークをサポート
  • コメントアウトする代わりにテストを延期する
  • SinonJSビルトイン
  • 保存時にテストを自動実行
  • プロキシがクロスドメインをリクエストする
  • カスタマイズ可能:
    • 他のテストフレームワークをラップするように拡張します(組み込みのJsTestDriver)
    • あなた自身の主張/反駁
    • レポーター(xUnit XML、従来のドット、仕様、タップ、TeamCityなどの組み込み)
    • ブラウザーテストの実行に使用されるHTMLをカスタマイズ/置換する
  • TextMateとEmacsの統合

短所

  • まだベータ版なので、バグがある可能性があります
  • Eclipse / IntelliJのプラグインはありません(まだ)
  • TestSwarm *のようなos / browser / versionで結果をグループ化しません。ただし、ブラウザ名とバージョンをテスト結果に出力します。
  • TestSwarmなどの以前のテスト結果の履歴はありません*
  • 2014年5月現在、Windowsでは完全に機能しません

* TestSwarmは継続的インテグレーションサーバーでもありますが、Buster.jsには別のCIサーバーが必要です。ただし、xUnit XMLレポートを出力するため、HudsonBamboo、またはその他のCIサーバーとの統合は簡単です。

TestSwarm

https://github.com/jquery/testswarm

TestSwarmは、GitHubのWebページに記載されているように、正式には開発されていません。彼らはKarma、browserstack-runner、またはInternを推奨しています。

ジャスミン

ジャスミン

これは、RubyまたはRuby on Railsに精通している開発者を対象とする可能性がある、振る舞い駆動型のフレームワークです(以下の引用に記載されています)。構文は、Railsプロジェクトでのテストに使用されるRSpecに基づいています。

Jasmine仕様は、HTMLページ(qUnit形式)またはテストランナー(Karmaとして)から実行できます。

Jasmineは、JavaScriptコードをテストするための動作駆動型開発フレームワークです。他のJavaScriptフレームワークには依存しません。DOMは必要ありません。

このテストフレームワークの経験がある場合は、詳細情報を投稿してください:)

プロジェクトホーム:http : //jasmine.github.io/

QUnit

QUnitは、ブラウザーでのJavaScriptのテストに焦点を当て、開発者に可能な限り多くの利便性を提供します。サイトからのぼかし:

QUnitは、強力で使いやすいJavaScriptユニットテストスイートです。jQuery、jQuery UI、jQuery Mobileプロジェクトで使用され、一般的なJavaScriptコードをテストできます

QUnitは一部の履歴をTestSwarm(上記)と共有します。

QUnitはもともとjQueryの一部としてJohn Resigによって開発されました。2008年には、独自のホーム、名前、APIドキュメントを取得し、他の人がユニットテストにも使用できるようにしました。当時はまだjQueryに依存していました。2009年の書き換えで修正され、QUnitは完全にスタンドアロンで実行されるようになりました。QUnitのアサーションメソッドは、CommonJSユニットテスト仕様に準拠しています。これは、ある程度QUnitの影響を受けていました。

プロジェクトホーム:http : //qunitjs.com/

シノン

別の優れたツールは、Test-Driven JavaScript Developmentの作者であるChristian Johansenによるsinon.jsです。自分で最もよく説明:

JavaScriptのスタンドアロンテストスパイ、スタブ、モック。単体テストフレームワークでは、依存関係は機能しません。

インターン

インターンWebサイトが、このリスト上の他のテストフレームワークへの直接の機能比較を提供します。他のJavaScriptベースのテストシステムよりも多くの機能をすぐに利用できます。

冗談

新しいが非常に強力なテストフレームワーク。スナップショットベースのテストも可能です。これにより、テスト速度が向上し、テストに関して新しいダイナミックスが作成されます

彼らの講演の1つをご覧くださいhttps : //www.youtube.com/watch?v=cAKYQpTC7MA

さらに良い方法:はじめに


2
JasmineはV8を使用してヘッドレスで作業できますが、インタラクティブに使用することもできます。Jasmineに関してはDOMは必要ありませんが、コードベースがDOMにアクセスする場合があります。規律により、DOMにアクセスしてHTMLフィクスチャとは別にテストを実行するコードの部分を排除、条件で保護、またはモックを提供することが可能です。アドオンを使用してコマンドラインサポートとフィクスチャを取得することもできます。
jerseyboy 2012年

2
@ rehevkor5:Seleniumは統合テスト用ですが、ここでのツールはユニットテスト用です。typemock.com/unit-tests-integration-tests
gregers

26
ほとんどすべてのテストランナーはブラウザに依存しています。Wtf、サーバー側だけでユニットテストを実行する人はいませんか????

2
それぞれの選択肢を異なる答えに分割/分割する方が良いのではないでしょうか?これは現在の投票を無効にするかもしれませんが、私はそれが最も理にかなっていると思います。
cregox 2015年

2
あなたはとそれらのほとんどにES 2015をプラグインすることができ@Raisen バベルが、AVA Sindre Sorhusによっては、それが組み込まれています。
gregers

64

を見てみましょう Dojo Object Harness(DOH)ユニットテストフレームワークをこれは、JavaScriptユニットテスト用のフレームワークにほとんど依存しないハーネスであり、Dojo依存関係はありません。Dojo Objective Harnessを使用したWeb 2.0アプリケーションの単体テストで、これについて非常によく説明されています

UIテストを自動化したい場合(多くの開発者の悲痛な ポイント)— doh.robot (一時停止。更新:他のリンクhttp://dojotoolkit.org/reference-guide/util/dohrobot.htmldijitを チェックしてください.robotx (一時停止)。後者は受け入れテスト用に設計されています。更新:

参照記事では、それらの使用方法、マウスやキーボードを使用してUIを操作するユーザーをエミュレートする方法、テストセッションを記録して後で自動的に「再生」できるようにする方法について説明しています。


Dojo Object Harnessの提案をありがとう、私はそれを見つけることができなかったでしょう。他の提案に感謝しますが、一度に1つのステップです。
Mark Levison、

これを以前のプロジェクトで実際に使用しましたが、非常に貴重であることがわかりました。しかし、もう一度、比較することはできません-他のTDDフレームワークを使用していません。
Rakesh Pai

リンク切れを報告していただきありがとうございます。そのうちの1つを更新しました。新しいWebサイトに掲載されたらすぐにrobotsドキュメントへのリンクを置き換えます。
ユージーンラズトキン

DOHで気に入らない点の1つは、アサーションが失敗したときに行番号が報告されないことです。それらを手動でコメント化し、テストを再実行すると機能します。
Aram Kocharyan、2014年

DojoはDOHをTheInternテストフレームワークに置き換えます。TheInternは非常に強力で、大幅に改善されています。 sitepen.com/blog/2014/02/18/...
user64141

34

Chutzpah-JavaScriptテストランナー

JavaScriptユニットテストのテストランナーであるChutzpahというオープンソースプロジェクトを作成しました。Chutzpahを使用すると、コマンドラインおよびVisual Studioの内部からJavaScript単体テストを実行できます。また、TeamCity継続的統合サーバーでの実行もサポートします。


7
Chutzpahを使用してVisual Studio内でJasmineテストを実行し始めたところ、それはうまく統合されています。テストファイルを右クリックし、「run js tests」または「run JS tests in browser」を選択しました。JSTestDriverを使用して同じジャスミンテストを実行します。依存するファイルをテストファイルの先頭でロードするように指定しているので、Chutzpahを好みます。JSTestDriverの場合、個別の構成ファイルが必要です。
GarethOwen 2012年


14

BusterJS

テスト駆動Javascript開発とSinonフレームワークの作者であるChristian JohansenによるBusterJSもあります。サイトから:

Buster.JSは、新しいJavaScriptテストフレームワークです。実際のブラウザー(JsTestDriverなど)でのテストの実行を自動化することにより、ブラウザーのテストとNode.jsのテストを行います。


10

google-js-test:

GoogleがリリースしたJavaScriptテストフレームワーク:https : //github.com/google/gjstest

  • ブラウザを実行する必要なしに、テストの起動と実行に非常に高速な時間。
  • テストが成功した場合と失敗した場合の両方の場合の、クリーンで読みやすい出力。
  • ブラウザベースのテストランナー JSが変更されるたびに、単純にリフレッシュすることができます。
  • Google Test for C ++に似たスタイルとセマンティクス。
  • Aは内蔵の最小限の定型的なコードを必要とフレームワーク(例えば無からかっ $tearDownたり$verifyAllに基づいたスタイルと意味を持つ)GoogleのC ++モッキングフレームワークを

現在、Windows用のバイナリはありません


1
Githubへの関心はほとんどないようです。また、UNIXベースのOSが必要です。私はWindowsの大ファンです。Windowsマシンに別れのキスをしないと家を出ません。
vsync 2015年

8

現在、QunitとPavlovおよびJSTestDriverを一緒に使用しています。このアプローチは私たちにとってはうまくいきます。

QUnit

パブロフソース

jsTestDriverソース


テストプロセス全体におけるこれらのそれぞれの役割と、それらがどのように相互に接続するかを説明してもらえますか?
vsync 2015年

申し訳ありませんが、これについての詳細を思い出すことは、長い間、多くの契約の仕事の前にありました。
Tom Stickel、2015年

6

あなたはプロとして「実際のブラウザで実行する」ことを持っていますが、私の経験では遅いのでそれは欠点です。しかし、それを価値のあるものにしているのは、ブラウザ以外の選択肢からの十分なJSエミュレーションがないことです。JSが非常に複雑で、ブラウザー内テストだけで十分な場合は、さらに考慮すべきオプションがいくつかあります。

HtmlUnit:「かなり良いJavaScriptサポート(常に改善されています)を備えており、使用する構成に応じてFirefoxまたはInternet Explorerをシミュレートする、非常に複雑なAJAXライブラリでも動作します。」そのエミュレーションがあなたの使用に十分である場合、ブラウザを駆動するよりもはるかに高速になります。

しかし、おそらくHtmlUnitは十分なJSサポートを備えていますが、Javaは好きではありませんか?次に多分:

セレリティ:ワチールのAPIのJRuby上で実行されているがHtmlUnitに裏打ちされました。

または同様に

Schnell:HtmlUnitの別のJRubyラッパー。

もちろん、HtmlUnitが十分ではなく、ブラウザーを駆動する必要がある場合は、WatirでJSを駆動することを検討してください



3

また、qooxdooの一部である単体テストフレームワーク、Dojo、ExtJSなどに似たオープンソースのRIAフレームワークにも興味がありますが、非常に包括的なツールチェーンを備えています。

オンライン版のテストランナーをお試しください。ヒント:左上にある灰色の矢印を押してください(より明確にする必要があります)。選択したテストを実行する「再生」ボタンです。

単体テストを定義できるJSクラスの詳細については、オンラインAPIビューアを参照してください。

自動化されたUIテスト(Selenium RCに基づく)については、Simulatorプロジェクトをチェックしてください。



3

JUnit統合をJava to JavascriptコードジェネレーターST-JS(http://st-js.org)に追加しました。フレームワークは、テストされたコードと単体テストの両方に対応するJavascriptを生成し、そのコードを別のブラウザーに送信します。

単体テストランナーは必要なhttpポートを開くので(テストが終了したら閉じる)、別のサーバーは必要ありません。フレームワークはJavaスタックトレースを操作して、失敗したアサーションがJUnit Eclipseプラグインによって正しく表示されるようにします。jQueryとMockjaxの簡単な例を次に示します。

@RunWith(STJSTestDriverRunner.class)
@HTMLFixture("<div id='fortune'></div>")

@Scripts({ "classpath://jquery.js",
       "classpath://jquery.mockjax.js", "classpath://json2.js" })
public class MockjaxExampleTest {
  @Test
  public void myTest() {
    $.ajaxSetup($map("async", false));
    $.mockjax(new MockjaxOptions() {
      {
        url = "/restful/fortune";
        responseText = new Fortune() {
          {
            status = "success";
            fortune = "Are you a turtle?";
          }
        };
      }
    });

    $.getJSON("/restful/fortune", null, new Callback3<Fortune, String, JQueryXHR>() {
      @Override
      public void $invoke(Fortune response, String p2, JQueryXHR p3) {
        if (response.status.equals("success")) {
          $("#fortune").html("Your fortune is: " + response.fortune);
        } else {
          $("#fortune").html("Things do not look good, no fortune was told");
        }

      }
    });
    assertEquals("Your fortune is: Are you a turtle?", $("#fortune").html());
  }

  private static class Fortune {
    public String status;
    public String fortune;
  }
}

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