私はGrailsアプリケーションのユニットテストと統合テストを追加しようとしていますが、ユニットと統合を使用してコントローラーのアクションとサービスをテストする方法を区別する方法がいくつかあります。Grailsユニット/ intergrationテスト
私がオンラインで見つけたチュートリアルはあまりきれいではありません。私はフォローアップの完全な例を見つけることができません。
あなたは有益なトピックを共有できますか?
私はGrailsアプリケーションのユニットテストと統合テストを追加しようとしていますが、ユニットと統合を使用してコントローラーのアクションとサービスをテストする方法を区別する方法がいくつかあります。Grailsユニット/ intergrationテスト
私がオンラインで見つけたチュートリアルはあまりきれいではありません。私はフォローアップの完全な例を見つけることができません。
あなたは有益なトピックを共有できますか?
統合テストの1つの問題は、速度です。私の場合、統合テストは15秒以上かかります。その時、特定のことは心の焦点から外れます。
私は単なる2秒以内に始まり、15秒間に何回も実行できる単体テストに行くことを好みます。
単体テストのもう1つの議論は、コードをデカップリングすることです。統合テストでは、既存の他のコンポーネントに依存して初期化されていることが常に魅力的です。
重要リンク: http://spockframework.org/spock/docs/1.0/interaction_based_testing.html http://docs.grails.org/latest/guide/testing.html
残念ながら、それだけで問題の好みや速度ではありません。それは大きなテーマですが、私はあなたに私の経験に基づいて助言を与えることができます。
単体テストを使用してデータベースアクセスコード(クエリ、トランザクション動作)をカバーする予定の場合は、自分自身を欺くことになります。クエリがGORMのメモリ内実装に準拠する方法をテストしています。休止状態ではなく、データベースではありません。
私は通常2種類のテストをしています。ユニットテストと機能テスト。機能テストは完全なテストを行い、実際のデータベースに対して実行し、ユーザーのようにシステムを刺激する(Geb経由のWebサイトの場合、REST APIの場合はRESTクライアント経由)。
ファンクションテストでは、まず何らかの種類のフィクスチャコードを実行してスタートアップ状態を設定します。これは、例えば、ユーザを登録し、ログインすることができます。テストが実行され、事後条件がチェックされます。ここでは、GORM APIを使ってデータベースにアクセスしたり、実稼働APIコール(別のバグでバグをカバーする危険性)を使って事後条件を確認することができます。 システムが第3のシステムと対話することがあります。ここでは、可能であれば、模擬実装をテスト中のシステムに注入することで、第3のシステムの実装を模擬することができます。 また、Spring Cloud Contractのようなツールを使用して、テスト対象のシステム用のモックサーバーとサードパーティシステムの仕様を作成することができます。 https://cloud.spring.io/spring-cloud-contract/spring-cloud-contract.html
ユニットテストでは、特定のクラスのすべての実行パスを徹底的にテストしています。私はすべての例外状態、すべての二次シナリオをトリガーして、すべてがカバーされていることを確認しようとします。私は、機能テストや統合テストを使って100%カバレッジを持つことは現実的ではないと思います。
は、私は次のガイドラインに従ってくださいすることができますように
は、多くのユニットテストを書いてみてください。それらは、コントローラ、サービス、ドメインクラス、またはその他のGroovyクラス用に記述することができます。ユニットテストは開発者の友人であるという考えがあります。十分な単体テストを書くことは、開発者が間違いを犯さないようにしてください。 彼らはすぐに を実行するので、これは迅速な検証を意味します。しかし、ユニットテストは、次のことをテストすることはできません。
統合テストは実行に時間がかかります。 Writing統合テストでは、しばしばデータをブートストラップする必要があります。しかし、実際にエンドツーエンドの機能をテストするのに役立ちます(機能テストが書かれたUIを介した実際のユーザーのやりとりを除く)。したがって、統合テストは次のように書くことができます。
お返事ありがとうございます。 grailsバージョンを使ったのですか? フィルター操作をカバーするユニットテストから始めます。私は3.2.3で試していますが、私は1対多の関係船にいくつか問題があります。私が保存したら、検索をします。 –
私は保存(フラッシュ:true)し、正しく保存しました。 次に、私は上記のインスタンスを返すと期待しているcontroller.searchを行います(カウントは1でなければなりません)。しかし、私はすでに(保存されていても)親インスタンスを見つけることができるため、この段階では例外が発生します。 org.hibernate.LazyInitializationException:プロキシを初期化できませんでした - セッションなし –