Play で追加のチェックを行う Ant スクリプトを作成しています! フレームワーク アプリケーション。
現在、「自動テストの再生」への実行呼び出しを行うだけで、Ant スクリプトからテストを実行しています。
<exec executable="${play.dir}/play.bat">
<arg line="auto-test"/>
</exec>
Clover を Play テストスイートに統合する方法を知っている人はいますか? 明らかに、上記を使用してテストを実行する必要はありません。
また、JUnit テストを実行する従来の方法 (つまり、Ant のターゲットを使用) を使用して Ant スクリプトを作成しようとしましたjunit
が、2 つの問題が発生しました。
- すべてのテストを実行すると、最初のテストのみが正常に実行され、他のテストは奇妙な理由で失敗しました
- スイートで 1 つのテストを公開し、テストが正常に実行された場合、コード カバレッジは 0% であると言えます。その後、clover の設定が間違っていると思いましたが、何もしないプロダクション クラスをテストする単純なクラスを作成したところ、期待どおりにカバレッジが上がりました。
したがって、ルートを下る場合は、junit
すべてのテストを実行して、次々と正常に実行できるようにする方法を知る必要があります (これは Play の実行方法を使用する場合に機能しますplay auto-test
)。 Play テストで触れられたコード行をピックアップしていないようです。
(Play 用の Cobertura モジュールがあることは知っていますが、正確なカバレッジの数値を教えてくれる Clover の方が優れていることがわかりました)
更新:残念ながら、手動でコンパイルしようとしたときにコンパイルの問題が発生したため、以前に発生していた正確なエラーを再現することはできません。Secure モジュールの使用を開始しましたが、Java ソース ファイルのみが含まれています。そのため、私の Ant スクリプトではplay precompile
、セキュア モジュールのバイト コードを生成する を呼び出します (コードを含むシステム内の他のすべてのものと同様)。そのため、Clover を使用してアプリ コードをコンパイルしようとすると、2 つのバージョンのクラス (プリコンパイル コマンド (クローバー以外) によって生成されたものと独自のコマンドによって生成されたもの) があるため、コンパイラが少し混乱するように思います。アリのコンパイル(クローバー付き):
[javac] C:\projects\testproject\out\clover\classes\clover8583527041716431332.tmp\model\HouseTest.java:45: incompatible types
[javac] found : play.db.jpa.JPABase
[javac] required: models.House
[javac] __CLR2_5_115y15ygoxiz3dv.R.inc(1527);House found = House.findById(id);
したがって、基本的に2つの問題があります。
- コンパイルされたバージョンを持たない Play 提供のモジュール (CRUD、Secure など) にも依存するソース コードをコンパイルできる必要があるため
play precompile
、Ant スクリプトで自分自身を呼び出して回避しようとしています。 junit
コンパイルが機能するようになると、ターゲットを使用してテストを実行できないという元の問題が再び発生することは間違いありません。
更新 #2:私が得たエラーはfindById
、JPABase から House へのキャストが必要な呼び出しが原因であることが判明しました (IDE またはプレイがそれを気にしているようには見えませんでした)。そこで、play のすべての「find*」メソッドのキャストを行った後、実際に JUnit と Clover のレポートを取得しました。 ただし...現在、2種類のエラーが発生しています。
メソッドだけでなく、前述
Model
のメソッドなどの魔法のメソッドを提供するクラスを拡張することで、Play で作成されるエンティティ クラスを作成できます。Model スーパークラスは、UnsupportedOperationException をスローすることによってこれらのメソッドを実装する GenericModel を実際に拡張します。だから明らかにプレイ!これらのメソッドの実際の実装を提供するために、舞台裏でさらにいくつかの魔法を行います。残念ながら、私のテスト (および製品コード) は count などのメソッドに依存していますが、ant/junit シナリオでは例外をスローしています (注: .find
count
play auto-test
もう 1 つのエラーは、Spring モジュールを使用しているためです。クラスの 1 つ (ルート クラス) で、 を呼び出します
Spring.getBeanOfType(Some.class)
。現在、自動スキャンを使用していますが、ant/junit テスト環境では、Spring モジュールはまだ Spring コンテナーをセットアップしていないため、呼び出しは null を返します。
両方の問題を解決する魔法の修正が 1 つあるような気がしますが、その魔法の修正が何であるかはわかりません。