2009-03-17 17 views
1

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

PDEベースの以前のビルドは、コンテキスト内のすべてのプラグインを解析し、テストクラスの内部を調べ、すべてのテストケースをより大きなスイートにトスし、プログラムで実行します経由で、JUnitResultFormatter.startTestSuite()。このプロセスでは、特定のメタデータ(著作権マークなど)とパッケージ依存性のテストのための自国テストを追加します。

私はテストアプリケーションのために製品をエクスポートし、私の選択したカバレッジツールで計測し、それを実行できるはずです。しかし、どちらのカバレッジツールも、扱っているクラスパス全体を知りたいと思うようです。 jarや依存関係のビルドワークスペース全体をトロールすることなく、これらのツールのどちらかをうまく動かすことは可能ですか?

答えて

2

古いSOの質問の助けを借りて、すべての作業を管理するように管理しました。

私たちはthis postで始まり、EMMAを使用したカバレッジセットアップの例を示しました。しかし、カバレッジデータを取得したいすべてのプラグインでEMMAへの依存を強制する必要があるようです。

Googleの法医学の中にはthis book excerptになっていますが、これはむしろOSGiクラスローダーの階層をカバーしています。テスト実行アプリケーションのconfig.iniにosgi.parentClassloader=app行を追加することで、コマンドラインにクラスパスを指定することができました。そのクラスパスに含めるために必要な:

  • アプリケーション
  • カバレッジ・ツールもちろん

用のjarファイルが使用するEclipseのstartup.jar

  • のJava SDKのjarファイルを、我々は<java jar="foo.jar"> Antを経由してテストを実行していましたタスクは、指定したクラスパス情報を暗黙に無視し、jarファイルだけを使用します。うまくいけば、これは我々がしていた同じ場所で誰かアウトを助け

    <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> 
    

  • +0

    ファンタスティックは:私たちが取り組んでエマを得た後、我々はCoberturaのに切り替え、そして私たちの最後のAntスクリプト(やや簡略と匿名化は)のように見えます。 !私たちは今、似たようなことをしています。素晴らしい発見。 –

    関連する問題