1

Freemarker を使用して (明示的に、fmpp maven プラグインを使用して) テンプレートから作成された自動生成コードを含むプロジェクトで、Cobertura コード カバレッジを設定しようとしています。

次に、これらの自動生成されたクラスの単体テストを行います。

ただし、これらの単体テストは、コード カバレッジの計算時に Cobertura によって考慮されていません。自動生成されたクラスはレポートに表示されますが、これらのクラスのカバレッジは常に 0% です。

まず、欠落している Cobertura の設定はありますか?

This SO questionは同様の質問をしているように見えますが、受け入れられた答えは次のとおりです。

生成されたコードをテストしたり、コード カバレッジ メトリックで使用したりしないでください。

これは私には正しくないように思えます-生成されたコードをテストする必要があると思います(生成されたクラスとテンプレートの両方をテストするために)、この生成されたコードのコードカバレッジを知りたいです。

次に、生成されたコードをテストしてはならない正当な理由はありますか?

編集: cobertura-maven-plugin を使用して cobertura を使用していることにも言及する必要があります。そのため、問題が cobertura にあるのか、maven-plugin (またはその構成にあるのか...) にあるのかはわかりません。

明確にするために、テストクラスの自動生成について質問しているわけではありません。これらは、テンプレートから作成されたクラスをテストするために手動で作成されます。

4

1 に答える 1

1

これは私がこれまでに学んだことを報告するための部分的な答えです...

最初に、私はcoberturaがどのように機能するかを見てきました、そしてそれは次のように思われます:

  • プロジェクトのJavaクラスは、コード全体でTouchCollector.touch(...)(および同様のメソッド)への呼び出しを含むように修正され、コンパイルされます。(これはインストルメンテーションタスクです。)
  • テストはこれらのcoberturaコンパイル済みクラスで実行され、TouchCollectorはテストでプロジェクトクラスのどの行に到達したかを記録します。この情報は、cobertura.serデータファイルに記録されます。
  • cobertura / reportタスクは、cobertura.serデータファイルを読み取り、htmlレポートを生成します。

ですから、私の最初の考えは、自動生成されたクラスが適切にインストルメントされていなかったということでした。ただし、これらのcoberturaクラスファイルを逆コンパイルした後、通常のクラスと自動生成されたクラスの両方が正しくインストルメントされていることを確認できます。

また、自動生成されたクラスのテストを含むすべてのテストが実行されていることを確認できます。

次に、私の次の質問は、テストが実行されたときに、自動生成されたクラスが「変更されない」理由です。さらに調査したところ、テストクラスがコンパイルされているとき(つまり、テストコンパイル)、自動生成されたクラスがプロジェクト/ターゲット/テストクラスに追加されていました。自動生成されたクラスのファイルの場所を出力する簡単なテスト(例System.out.println(MyAutoClass.class.getResource("MyAutoClass.class"));)は、テストがcoberturaによって実行されるときに、以前のcoberturaコンパイル済みクラスではなく、test-classesフォルダー内の自動生成されたクラスを使用することを確認しました計装。

次に、次の質問は、これらのクラスがtest-classesフォルダーに追加されないようにする方法です...?1つのアプローチは、自動生成されたクラスをコンパイルから除外することです。これは、テストクラスを含めることによってのみ実行できます-例:

<plugin>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>x.y.z</version>
  <configuration>
    <testIncludes>
      <testInclude>**/*Test.java</testInclude>
    </testIncludes>
  </configuration>
</plugin>

または、自動生成されたクラスを除外することも可能である必要があります(これが望ましい)-次のようなものです。

<testExcludes>
  <testExclude>**/generated-sources/fmpp/**/*.java</testExclude>
</testExcludes>

ただし、これは機能しませんでした。これを機能させる方法がよくわかりません。

別の方法として、自動生成されたすべてのクラスを1つのパッケージに移動すると、次のようなことが可能になります。

<testExcludes>
  <testExclude>com/organisation/project/auto/**/*.java</testExclude>
</testExcludes>

*Test.java結局、私はファイルを含むだけに行きました

于 2012-07-03T09:24:08.647 に答える