1

私の会社は、Buckminster を使用するようにビルド システムをアップグレードしている最中です (これはうまくいきました)。当然のことながら、管理者は、コードの作成中に使用するメトリックの一部を自動的に生成できれば、それを望んでいます。これらのメトリックの 1 つは、単体テストのカバレッジです。

PDE ベースの以前のビルドでは、コンテキスト内のすべてのプラグインを解析し、それらの内部でテスト クラスを検索し、すべてのテスト ケースをより大きなスイートに放り込み、JUnitResultFormatter.startTestSuite(). その過程で、特定のメタデータ (著作権表示など) に対する自家製のテストと、パッケージの依存関係に対するテストが追加されます。

テスト アプリ用に製品をエクスポートし、選択したカバレッジ ツールを使用して計測し、実行するだけでよいようです。ただし、両方のカバレッジ ツールが、処理しているクラスパス全体を知りたいようです。これらのツールのいずれかを、ビルド ワークスペース全体で jar と依存関係を探し回ることなくうまく機能させることはできますか?

4

1 に答える 1

2

古いSOの質問の助けを借りて、すべてを機能させることができました。

EMMA を使用したカバレッジ設定の例を提供するこの投稿から始めました。ただし、カバレッジ データを取得したいすべてのプラグインで、EMMA への依存を強制する必要があるようです。

いくつかの Google フォレンジックは、OSGi クラスローダ階層をかなり適切にカバーするこの本の抜粋にたどり着きました。osgi.parentClassloader=appテスト実行アプリケーションの config.ini に行を追加することで、コマンドラインでクラスパスを指定できます。そのクラスパスには以下を含める必要がありました:

  • エクリプスstartup.jar
  • アプリケーションで使用される Java SDK jar
  • カバレッジ ツールの jar ファイル

もちろん、<java jar="foo.jar">Ant タスクを介してテストを実行していました。Ant タスクは、提供されたクラスパス情報を黙って無視し、jar だけを使用します。Emma が動作するようになった後、Cobertura に切り替えました。最終的な Ant スクリプト (少し簡略化され、匿名化されています) は次のようになります。

<target name="generate.coverage" depends="buckminster.init">
  <!-- Generate the classpath. -->
  <path id="cobertura.classpath">
    <fileset dir="${tasks.dir}/lib/cobertura">
      <include name="cobertura.jar" />
      <include name="**/*.jar" />
    </fileset>
  </path>
  <taskdef classpathref="cobertura.classpath" resource="tasks.properties" />

  <!-- Get ready to run the unit tests app, and delete old coverage data. -->
  <unzip src="${test-app.artifact}" dest="${output.dir}" overwrite="true" />
  <delete file="${output.dir}/cobertura.ser" />

  <!-- Instrument the jars in-place. Make sure to only capture what you want instrumented! -->
  <cobertura-instrument datafile="${output.dir}/cobertura.ser">
    <fileset dir="${output.dir}/test-app/plugins">
      <include name="**/*our.company_*.jar" />
    </fileset>
  </cobertura-instrument>

  <!-- Run the unit test application, by classname rather than by jar. -->
  <java fork="true" classname="org.eclipse.equinox.launcher.Main" logerror="true" failonerror="true" maxmemory="1G">
    <classpath>
      <pathelement location="${output.dir}/test-app/startup.jar" />
      <pathelement location="${tasks.dir}/lib/cobertura/cobertura.jar" />
      <fileset dir="${tasks.dir}/lib/cobertura">
        <include name="**/*.jar" />
      </fileset>
      <pathelement location="${java.class.path}" />
    </classpath>
    <sysproperty key="net.sourceforge.cobertura.datafile" file="${output.dir}/cobertura.ser" />            
    <arg value="-data" />
    <arg value="${output.dir}/test-app/workspace" />
    <arg value="--formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter:${log.dir}/test-results.xml" />
  </java>

  <!-- Generate the coverage reports. -->
  <cobertura-report format="html" datafile="${output.dir}/cobertura.ser" destdir="${output.dir}/cobertura-report">
    <fileset dir="${workspace.dir}/plugins">
      <include name="**/*.java" />
    </fileset>
  </cobertura-report>
</target>

うまくいけば、これは私たちがいたのと同じ場所にいる誰かを助ける.

于 2009-03-19T14:29:19.640 に答える