分度器とカルマを一緒に使用できますか?


104

ProtractorがAngular Scenario RunnerをE2Eテスト用に置き換える場合、それは私がE2EテストフレームワークとしてKarmaで引き続き使用できることを意味しますか?


IMOできるはずです。Karmaは単なるテストランナーです。Protractorでテストケースを作成/ビルドすると、カルマは要求されたときに実行できるようになります。Karmaに現在のE2Eテストを実行するよう依頼するのと同じ方法です。
2013年

1
@skeep Webdriverは、WebDriverプロトコルを介してブラウザーに生成および接続します-Karmaがサポートしていないもの(代わりにWebSocketとWebページを使用します)。彼らは非常に異なる方法で同様のタスクを実行します。現在非推奨となっているKarma E2Eテストは、WebDriverを使用していないため、ブラウザ内で状態を維持する必要があります(WebDriverの状態は完全にブラウザプロセスの外にあります)。
アンディ

回答:


102

分度器の現在のメンテナーによって推奨されていません:

https://github.com/angular/protractor/issues/9#issuecomment-19927049

分度器とカルマを一緒に使用しないでください。代わりに、テストを実行するための個別のシステムを提供します。分度器とカルマはテストのさまざまな側面をカバーします-カルマは主に単体テストを対象としていますが、分度器はエンドツーエンドのテストに使用する必要があります。

Protractorは、Selenium / WebDriverサーバーを使用してブラウザーをプロビジョニングし、テストの実行を促進するWebDriverJSの上に構築されています。純粋なWebDriverJSの例は次の場所にあります:http : //code.google.com/p/selenium/wiki/WebDriverJs

そして

https://github.com/angular/protractor/issues/9#issuecomment-19931154

Georgios-ProtractorとKarmaを分離しておくのは理にかなっていると思います-エンドツーエンドのテストでは、ネイティブイベントの駆動とWebdriverの柔軟性が必要ですが、ユニットテストでは、ファイルの高速実行と自動監視が必要です。


KarmaからProtractorを実行するべきではないということは、まだ本当ですか?
ErikAGriffin 2015年

@theLateWizard絶対にそうですが、そうすべきではないだけでなく、できません:)
Dmitri Zaitsev

74

更新。以下は、1つのコマンドで任意のプロジェクトに最小限のKarma設定を追加するために作成した単純なパッケージnpm install min-karmaです。


KarmaProtractorについて考えられる誤解をいくつか明確にしたいと思います。Karma FAQは実際にはAdapter for AngularのScenario Runnerを参照していますが、放棄されているようで、代わりにProtractorが推奨されています。


カルマ

Karmaは、構成ファイルで明示的に、またはnode-globsを使用して指定されたJavaScriptファイルを実行するテストランナーです。(JavaScript以外の外部テンプレートの場合、Angularのユニットテストガイドでは、Karma htmlプリプロセッサを使用してそれらを最初にJavaScriptにコンパイルすることを推奨しています。)

これらは、すべてのソースファイル、一部のファイル、一部追加ファイル、またはプロジェクトに関係のないファイルであり、追加の構成のみを提供します-名前を付けます!目的に応じて複数のkarma構成ファイルを作成できます。これらのファイルは、並列または1つずつ実行できます。各カルマプロセスは、独自のブラウザのセットを起動します(これらは現在利用可能です)

一連のファイルのみを実行するKarmaのこの機能は、各ソースファイルの編集時にバックグラウンドで実行される高速テストに最適であり、素早いフィードバックを得ることができます。唯一のマイナスは、うまくいけば改善される「騒々しい」エラー報告です!


Karmaは単体テストだけではありません

単体テストは、ソースコードの単一のユニットを対象としています。Angularの場合、典型的な単位はAngular Component(Service, Factory, Provider, Controller, Filter, Directiveなど)です。あなたの保つことを忘れないでくださいControllerslattersために薄いので、あまりにも多くのユニットテストすることである赤旗

ユニットテストは、このユニットが依存するコードの他のすべての単位は、(いわゆる単位の依存関係)を同時にテストされるべきではありません。代わりに、それらは「モック」される必要があります。たとえば、ダミーインスタンスのような単純なものに置き換えられます。Angularは素晴らしいモック環境サポートを提供します。理想的には、これらすべてのモックをテスト内で直接確認したいので、これらすべての依存関係がどこから発生しているのかを気にする必要はありません。

Karma、ソースコードユニットのグループが一緒にテストされ、それらの依存関係の一部のみがモックされている統合テストにも同様に役立ちます。依存関係はデフォルトでソースコードモジュールから提供されることを覚えておくことが重要です(これらのモジュールがテスト直接挿入されるか、他のモジュールの依存関係である場合(その場合、それらを挿入する必要はありません) 、ただし害はありません)モックされた依存関係は、提供された依存関係をオーバーライドします。

Karmaの主な機能は、高速かつ頻繁に実行することです。これは、サーバー要求、データベースクエリ、数秒よりも長くかかる可能性のあるものはすべて避けたいことを意味します。(それ以外の場合は速くありません!)それらの長いプロセスは、あなたが模倣したいものです。これはまた、$http直接コントローラーや複雑なビジネスロジックユニットの内部など、生の低レベルサービスを配置することが悪い習慣である理由も説明しています。これらの低レベルの外部通信サービスをより小さな専用サービスにラップすることにより、「それらを模擬」することがはるかに容易になります。

どのようなカルマは 行いませんと、それがどのようなエンドツーエンド(E2E)テストされている、であるとして、あなたのサイトを実行しています。原則として、Angularの内部メソッドを使用して、サイトまたはその一部を再作成できます。これは、小さなピースの場合、便利で、たとえばディレクティブをテストするための高速な方法です。

ただし、テスト内に複雑なコードをスローする方法はお勧めできません。実行すればするほど、実際にテストしているのではなく、そのコードでエラーが発生する可能性が高くなります。

そのため、私は頻繁に言及されているような、低レベルのメソッドを使用してメソッドをテストする複雑な方法を個人的に嫌ってい$httpます。それはへの低レベルのメソッドへの参照を隔離するためにクリーナーを働き、専用のメソッドを持つ、独自の、単一責任の要求のHTTPを作ることです。これらの専用メソッドは、偽のバックエンドではなく、実際のバックエンドで機能する必要があります!簡単にテストできます-手動で、またはKarma別の特別な設定で実行して完全に問題なく、その設定を通常Karmaの実行に使用される設定と混合しない限り定期的かつ高速。これで、専用の小規模サービスをテストしたので、それらを安全かつ簡単にモックして他のロジックをテストし、これらのテストを通常のKarmaセットアップに組み込むことができます。


要約する。Karmaを使用して、JavaScriptファイルのセットを実行します。高速です(あるべきです)。完全なアプリが表示されないため、最終結果を効果的かつ確実にテストできません。分度器で実行できますか?なぜ私は?分度器を実行すると、テストが遅くなり、カルマの目的が無効になります。分度器を個別に実行するのは簡単です。


分度器

分度器は:

AngularJSアプリケーションのエンドツーエンドのテストフレームワーク。Protractorは、実際のブラウザーで実行されているアプリケーションに対してテストを実行し、ユーザーと同じように操作します。

したがって、ProtractorKarmaがしていないことを正確に実行します-実際の最終的なアプリケーションを実行します。これにより、その能力と制限の両方が明らかになります。

完全なアプリケーションの実行は、アプリケーションが期待どおりに機能する唯一の信頼できる最終テストです。完全なユーザーストーリーシナリオを作成して、テストに組み込むことができます。

しかし、ソースコードの個々のユニットを分離せずにエラーを追跡することは困難です。これが、JavaScriptコードを最初にテストするために依然としてKarmaが必要な理由です。


今、私が実行したいと思う分度器をしてカルマ?確かに、それらを別々のターミナルウィンドウで並行して実行できます。原則として、必要に応じてテストファイルを共有させることもできますが、通常は共有しません。どうして?単一の専用目的でテストを小さく保ちたいからです。

唯一の例外は、両方のランナーに役立つテストマクロを定義するファイルです。ただし、これはテストファイルではなく、マクロ定義ファイルです

それ以外は、テストを明確に分けることが好きです。頻繁かつ高速に実行されるものと、完全なアプリ用のもの。これにより、Karmaを使用する場合と分度器を使用する場合を明確に区別できます。


単体テストとe2eテストが必要な場合は、単体テスト用にカルマ環境を構成し、UIテストまたはe2eテスト用に分度器を構成する必要がありますか?
Sunil Garg

@SunilGargはい、両方を使用したい場合は、私が書いたように、カルマは単体テストだけではありません。
Dmitri Zaitsev 2016

1

KarmaはAngularチームが提供するテストランナーです。Karmaは複数のブラウザーでテストを実行し、アプリケーションがすべてのブラウザーで互換性があることを保証します。 角度jsの単体テストはカルマ+ジャスミンを使用できます

Jasmineはjavascriptユニットテストフレームワークであり、アプリケーションをテストするためのユーティリティを提供します。これは、Angularフレームワークで最適に機能するため、「自動化された単体テストツール」を選択します。 https://github.com/shahing/testingangularjs

また、Protractorは、AngularおよびAngularJSアプリケーション用のエンドツーエンドのテストフレームワークです。Protractorは、実際のブラウザー、ヘッドレスブラウザー、クロスブラウザーテストで実行されているアプリケーションに対してテストを実行し、saucelabsでホストできます。

https://github.com/shahing/Protractor-Web-Automation


1

はい、カルマと分度器を一緒に使用できます。Karmaは、angularコマンドを使用して作成したコンポーネントの単体テストに使用されます。karmaを使用してこれらのコンポーネントをテストできます。分度器は、エンドツーエンドのテストに使用されます。主にUIテストに使用されます。


これを達成するには、カルマと分度器の両方の構成を追加する必要があります
Rahul Solanki
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.