2

私はいくつかの単体テストを持っています(それらはAndroidテストですが、私はを使用しRobolectricているので、で実行されていますJVM)。彼らは報道なしで幸せに走ります。

カバレッジで試してみると、emma-mavenからこのエラーが発生します。

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:emma-maven-plugin:1.0-alpha-3:instrument (default-cli) on project android: Execution default-cli of goal org.codehaus.mojo:emma-maven-plugin:1.0-alpha-3:instrument failed: class [com.larvalabs.svgandroid.ParserHelper] appears to be instrumented already

重要なビットはclass .... appears to be instrumented alreadyです。

適切なドキュメントを見つけるのは非常に困難ですが、これは私がさまざまなソースからの構成のためにまとめたものです。

<plugin>
    <!-- This doesn't work, see below for a working configuration -->
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>emma-maven-plugin</artifactId>
    <version>1.0-alpha-3</version>
    <inherited>true</inherited>                          
    <executions>
            <execution>
                    <phase>process-classes</phase>                               
                    <configuration>
                            <filters>
                                    <filter>-com.viewpagerindicator.*</filter>
                                    <filter>-com.actionbarsherlock.*</filter>
                                    <filter>-com.larvalabs.svgandroid.*</filter>
                            </filters>
                    </configuration>
                    <goals> 
                            <goal>instrument</goal>
                    </goals>
            </execution>
    </executions>
</plugin>

問題は、不平を言っていたパッケージを除外したことです(問題は、これらがAndroidライブラリであるということだと思いました-プロジェクトが誤ってパスのリストに2回表示されてしまいます)、今では自分のパッケージについて不平を言っています。


同僚は、上記の<plugin>セクションを<project><build><pluginManagement>に入れるべきだと誤って提案しました。

<configuration>は直接<plugin>にあり、残りの<executions>ビットは削除されている必要があります。回答を参照してください。

4

3 に答える 3

5

私は解決策を見つけました-恥ずかしいほど簡単です。

pluginManagementのものを忘れてください:/ this / pomのフィルターを無視させることによってのみ「機能」しましたが、それらをすべての子pomに適用します:http://maven.apache.org/pom.html#Plugin_Management

構成要素を実行ブロックから移動し、実行ブロックを削除するだけです。http://maven.apache.org/guides/mini/guide-configuring-plugins.html#Generic_Configuration

プラグイン要素のすぐ内側にある構成セクションで、「mvn -X emma:emma」を実行すると、リストされたフィルターが表示されました。それぞれの除外行が私が見たエラーを変えたので、私はそれが除外していたと推測します。(含めるために、前述の-プレフィックスのセクションをオーバーライドするために+プレフィックス付きのフィルターを追加することを収集します。)

<project>
 <build>
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>emma-maven-plugin</artifactId>
    <version>1.0-alpha-3</version>
    <!-- inherited>true</inherited -->
    <configuration>
            <filters>
                    <filter>-com.viewpagerindicator.*</filter>
                    <filter>-com.actionbarsherlock.*</filter>
                    <filter>-com.larvalabs.svgandroid.*</filter>
            </filters>
            <!-- verbose>true</verbose -->
   </configuration>
  </plugin>

質問の暗黙のAndroid部分に関する限り(実際にはフィルタリングは私にとって非常に重要です)、Androidはテストを保持してメインアプリケーションAPKを実行するために別のAPKを必要とするため、Android統合テストを同じプロジェクト:Androidプラグインでは、統合テストAPKを別のプロジェクト(通常は同じ親pomファイルの下の兄弟)から作成する必要があります。androidプラグインページ(http://code.google.com/p/maven-android-plugin/wiki/Samples )に隠れているzip内のサンプル/サンプルプロジェクトがあり、その中で「カバレッジ」を検索して変更する必要がありますに:

<coverage>true</coverage>

構成に-いくつかのサンプルにはそれがありますが、コメントアウトされています。私は気が散ってしまったので、それがうまくいったかどうか思い出せませんが、明らかにそうなるはずです。

プロジェクトの既存のソース管理にディレクトリレベルを挿入したくなかったため、アプリケーションのpom.xmlのピアとして「parent」および「integration」というディレクトリを作成し、「parent」を使用して親pomを保持しました。統合テストの「統合」。このセクションでは、app/pom.xmlにapp/parent/pom.xmlを使用するように指示します。

<project>
    <parent>
            <groupId>our.group.id</groupId>
            <artifactId>base</artifactId>
            <relativePath>parent</relativePath>
            <version>3.9.0</version>
    </parent>

そしてこれはapp/Integration / pom.xmlにあります:

<project>
  <parent>
    <groupId>our.group.id</groupId>
    <artifactId>base</artifactId>
    <relativePath>../parent</relativePath>
    <version>3.9.0</version>
  </parent>
于 2012-03-04T07:21:28.493 に答える
2

私が理解している限り、インストルメント化されたクラスは、レポート生成のためにcoberturaによってのみ必要とされます。それらをターゲット/クラスで作成すると、元のクラスファイルが上書きされます。

結果としてjar内のインストルメント化されたファイルが必要な場合は、標準の$ {buildからのファイルの代わりに、またはそれに加えて、target/generated-classesディレクトリーからファイルを取得するようにmaven-jar-pluginを構成できます。 project.outputDirectory}。

編集

maven-jar-pluginの説明をご覧ください。target /generated-classesのみを使用するには、POMへの次の追加が機能するはずです-試して、必要に応じて変更してください。

<project>
  ...
  <build>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.3</version> <!-- replace with correct version nbr! -->
        <configuration>
          <includes>
            <include>${project.build.directory}/generated-classes/**/*.class</include>
          </includes>
          <excludes>
            <exclude>${project.build.directory}/classes/**/*.class</include>
          </excludes>

        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>

${project.build.directory}${project.build.ouputDirectory}ターゲットフォルダ、ターゲット/クラスを指します。単純${project.build.ouputDirectory}に新しい値に設定できるかどうかはわかりません。Mavenの本のこの章をご覧ください。ヒントが見つかるかもしれません。

参照 :

代わりに、またはさらに、mavenを使用して、終了後にターゲット/生成されたクラスからターゲット/クラスにファイルをコピーできますcoberture:instrumentこの質問には、POM(フラグメント)の例を含む1つの回答があります。正しいフェーズを特定する必要があります(プロセスリソースは、あなたのケースには明らかに早すぎます)

また、これを参照してください

それが役に立てば幸い。!

于 2012-03-04T07:49:06.273 に答える
0

mode="overwrite"を使用してください。それはうまくいくでしょう。

于 2017-07-03T09:11:03.417 に答える