12

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 シナリオでは例外をスローしています (注: .findcountplay auto-test

  • もう 1 つのエラーは、Spring モジュールを使用しているためです。クラスの 1 つ (ルート クラス) で、 を呼び出しますSpring.getBeanOfType(Some.class)。現在、自動スキャンを使用していますが、ant/junit テスト環境では、Spring モジュールはまだ Spring コンテナーをセットアップしていないため、呼び出しは null を返します。

両方の問題を解決する魔法の修正が 1 つあるような気がしますが、その魔法の修正が何であるかはわかりません。

4

1 に答える 1

4

Clover はソース レベルのインストルメンテーションを行うため、ソース コードを利用できる必要があります。バイトコードを生成するクローバーをアクティブ化する前に行うことはすべて、「クローバー化」されません。

Clover for ant は ant コンパイラの呼び出しをインターセプトするため<clover-setup/>、ant スクリプトで他のコンパイル タスクの前に実行すると、すべてが clover によってインストルメント化されます。

コンパイルされたコードは、スクリプトから実行する場合でも、junit から実行する場合でも、コードがインストルメント化されている限り (もちろん、clover.jar がクラスパスで利用可能である限り) 任意の方法で実行できます。Clover は、clover-database の場所をインストルメント化されたコードにハードコードするため、実行時に何も指定する必要はありません。

clover をどのように使用しているかを概説し、http: //confluence.atlassian.com/display/CLOVER/1.+QuickStart+Guide で clover のドキュメントを再確認していただければ、非常に役立ちます。

于 2011-06-17T09:01:30.487 に答える