NCoverでカバレッジを取りたくないクラスやメソッドを指定する方法(-.-)

NCover 1.5.4 Betaからカバレッジを取りたくないクラスやメソッドが指定できるようになっている。

NCover v1.5.4 Beta Release

以下がその設定方法。

まず、カバレッジ対象の各プロジェクトのAssemblyInfoクラスでCoverageExcludeAttributeクラスの宣言を追加する。

internal class CoverageExcludeAttribute : System.Attribute {}

次にカバレッジを取りたくないクラスやメソッドにCoverageExcludeAttributeを付加する。

[CoverageExclude]
public class Hoge
{
  ...
}
[CoverageExclude]
public void WantToExcludeCoverage()
{
  ...
}

後は、コマンドラインから実行する際にexパラメータを付加してやればよい。NAntのビルドスクリプトのNCoverタスクはこんな感じ

<target name="ncover">
  <exec program="${ncover-console.exe}" verbose="true">
    <arg value="//l" />
    <arg file="${build.dir}/bin/sample-ncover.log" />
    <arg value="//x" />
    <arg file="${build.dir}/bin/sample-ncover.xml" />
    <arg value="//ea" />
    <arg value="Sample.Core.CoverageExcludeAttribute;Sample.DataAccess.CoverageExcludeAttribute;Sample.Tests.CoverageExcludeAttribute" />
    <arg value="//w" />
    <arg value="${build.dir}/bin" />
    <arg file="${nunit-console.exe}" />
    <arg value="Sample.Tests.dll" />
  </exec>
  <copy todir="${build.dir}/bin">
    <fileset basedir="${programfiles.path}/NCover">
      <include name="Coverage.xsl" />
    </fileset>
  </copy>
</target>

この方法とNCoverExplorerとCCNETの組み合わせを併用すればかなり便利だ。

NAntのビルドスクリプトのNCoverExplorerタスクはこんな感じ

<target name="ncover-explorer">
  <echo message="Starting NCoverExplorer report generation..." />
  <ncoverexplorer program="${ncoverexplorer-console.exe}"
    projectName="${project.name}"
    reportType="3"
    outputDir="${build.dir}/bin/"
    xmlReportName="sample-ncoverexplorer.xml"
    htmlReportName="sample-ncoverexplorer.html"
    showExcluded="True"
    satisfactoryCoverage="80" >
    <fileset>
      <include name="${build.dir}/bin/sample-ncover.xml" />
    </fileset>
    <exclusions>
      <exclusion type="Assembly" pattern="*.Tests" />
      <exclusion type="Namespace" pattern="*.Gui" />
      <exclusion type="Class" pattern="Sample.DataAccess.SampleDataset" />
    </exclusions>
  </ncoverexplorer>
</target>

ここで注目したいのがexclusionsの設定。NCoverのカバレッジ結果から除外したいものを、アセンブリ/名前空間/クラスで指定できる。うちのチームでも本当に必要なカバレッジ結果はNCoverExplorerの結果で参照し、詳細はNCoverの結果から探すようにしている。

参考:NCoverExplorer in CCNET