.NETのユニットテストの道の3:コードオーバーライド率の計算

32873 ワード

  • ビジネスコードとテストコードの準備

  • 新規作成Netframeworkクラスライブラリ、Calc.csファイルを作成し、次のコードを追加します.
    public class Calc
    {
        public int AbsAdd(int a, int b)
        {
            if (a > 0)
                return a + b;
            else
                return (-1) * a + b;
        }
        public int Abs(int a)
        {
            if (a > 0)
                return a;
            return -1 * a;
        }
    }

  • UTプロジェクトを新規作成し、Calcのメソッドにテストを追加
    [TestClass]
    public class CalcTest
    {
        [TestMethod]
        public void Add_Test()
        {
            Calc calc = new Calc();
            var s = calc.AbsAdd(3, 6);
            Assert.AreEqual(s, 9);
        }
        [TestMethod]
        public void AbsAdd_Test()
        {
            Calc calc = new Calc();
            var s = calc.Abs(-3);
            Assert.AreEqual(s, 3);
        }
    }


  • VSでテストを実行し、テストの上書き度をチェックし、コード行を色で上書きする

  • テストエクスプローラで、対応するテスト例をクリックし、右クリック「選択したテストのコードオーバーライド率を分析」
  • では、オーバーライド率が表示され、対応するメソッドがダブルクリックされ、どのコードがオーバーライドされているか、
  • がオーバーライドされていないかが表示されます.

  • コマンドラインでユニットテストを実行し、コードオーバーライドを確認します。

  • 環境変数を追加します.実行ユニットテストはvstestに使用する.console.exe、カバー度をチェックするにはCodeCoverageを使用します.exe.これらはvisual studioのインストールディレクトリにありますが、システム環境変数にパスを追加していません.そのため、環境変数のPathに追加する必要があります.
  • vstest.console.Exce:VisualStudioインストールディレクトリTeam ToolsDynamic Code Coverage Tools;
  • CodeCoverage.Exce:VisualStudioインストールディレクトリCommon 7IDEExtensionsTestPlatform;

  • 実行コマンド:
  • 収集:CodeCoverage collect/output:D:1Files3.coverage vstest.console.exe D:\1\UT\UT\bin\Debug\UT.dllパラメータ:
  • 3.coverageは生成するオーバーライドファイル、2進数ファイルで、vsで表示する必要があります.
  • UT.dllは、テストプロジェクトのコンパイル後のファイル
  • である.
  • 分析:CodeCoverage analyze/output:D:1Files3.xml D:\1\Files\3.coverageこのコマンドは3.coverageを読み取り可能なファイル3に変換する.xml.
    xml version="1.0" encoding="UTF-8" ?>
    <results>
      <modules>
        <module name="ut.dll" path="ut.dll" id="1F16FE5964AEE54C9413C7FB6B33EDAC01000000" block_coverage="100.00" line_coverage="100.00" blocks_covered="8" blocks_not_covered="0" lines_covered="10" lines_partially_covered="0" lines_not_covered="0">
          <functions>
            <function id="8272" token="0x6000001" name="Add_Test()" namespace="UT" type_name="CalcTest" block_coverage="100.00" line_coverage="100.00" blocks_covered="4" blocks_not_covered="0" lines_covered="5" lines_partially_covered="0" lines_not_covered="0">
              <ranges>
                <range source_id="0" covered="yes" start_line="12" start_column="9" end_line="12" end_column="10" />
                <range source_id="0" covered="yes" start_line="13" start_column="13" end_line="13" end_column="36" />
                <range source_id="0" covered="yes" start_line="14" start_column="13" end_line="14" end_column="39" />
                <range source_id="0" covered="yes" start_line="15" start_column="13" end_line="15" end_column="35" />
                <range source_id="0" covered="yes" start_line="16" start_column="9" end_line="16" end_column="10" />
              ranges>
            function>
            <function id="8312" token="0x6000002" name="AbsAdd_Test()" namespace="UT" type_name="CalcTest" block_coverage="100.00" line_coverage="100.00" blocks_covered="4" blocks_not_covered="0" lines_covered="5" lines_partially_covered="0" lines_not_covered="0">
              <ranges>
                <range source_id="0" covered="yes" start_line="19" start_column="9" end_line="19" end_column="10" />
                <range source_id="0" covered="yes" start_line="20" start_column="13" end_line="20" end_column="36" />
                <range source_id="0" covered="yes" start_line="21" start_column="13" end_line="21" end_column="34" />
                <range source_id="0" covered="yes" start_line="22" start_column="13" end_line="22" end_column="35" />
                <range source_id="0" covered="yes" start_line="23" start_column="9" end_line="23" end_column="10" />
              ranges>
            function>
          functions>
          <source_files>
            <source_file id="0" path="D:\1\UT\UT\UnitTest1.cs">
            source_file>
          source_files>
        module>
        <module name="bizlogic.dll" path="bizlogic.dll" id="3CCBE3B7A33CB441A19683A78A499F7901000000" block_coverage="75.00" line_coverage="80.00" blocks_covered="6" blocks_not_covered="2" lines_covered="8" lines_partially_covered="0" lines_not_covered="2">
          <functions>
            <function id="8272" token="0x6000001" name="AbsAdd(int, int)" namespace="BizLogic" type_name="Calc" block_coverage="75.00" line_coverage="80.00" blocks_covered="3" blocks_not_covered="1" lines_covered="4" lines_partially_covered="0" lines_not_covered="1">
              <ranges>
                <range source_id="0" covered="yes" start_line="12" start_column="9" end_line="12" end_column="10" />
                <range source_id="0" covered="yes" start_line="13" start_column="13" end_line="13" end_column="23" />
                <range source_id="0" covered="yes" start_line="14" start_column="17" end_line="14" end_column="30" />
                <range source_id="0" covered="no" start_line="16" start_column="17" end_line="16" end_column="37" />
                <range source_id="0" covered="yes" start_line="17" start_column="9" end_line="17" end_column="10" />
              ranges>
            function>
            <function id="8312" token="0x6000002" name="Abs(int)" namespace="BizLogic" type_name="Calc" block_coverage="75.00" line_coverage="80.00" blocks_covered="3" blocks_not_covered="1" lines_covered="4" lines_partially_covered="0" lines_not_covered="1">
              <ranges>
                <range source_id="0" covered="yes" start_line="19" start_column="9" end_line="19" end_column="10" />
                <range source_id="0" covered="yes" start_line="20" start_column="13" end_line="20" end_column="23" />
                <range source_id="0" covered="no" start_line="21" start_column="17" end_line="21" end_column="26" />
                <range source_id="0" covered="yes" start_line="22" start_column="13" end_line="22" end_column="27" />
                <range source_id="0" covered="yes" start_line="23" start_column="9" end_line="23" end_column="10" />
              ranges>
            function>
          functions>
          <source_files>
            <source_file id="0" path="D:\1\UT\BizLogic\Calc.cs">
            source_file>
          source_files>
        module>
      modules>
    results>



  • 指定したdllのオーバーライド率のみを計算します。

    デフォルトでは、vstestは、指定したdllディレクトリのpdbファイルのあるdllをすべて計算します.これにより,我々が関心を持たない基礎dll,サードパーティdllがドープされ,計算時間が長く,総被覆率が不正確になる.したがって、オーバーライド率を計算したいdllを指定するか、関心のないdllを排除する必要があります.方法は、CodeCoverageコマンドでconfigファイルを指定し、configファイルで指定dllを除外するか、特定dllのみを計算します.正規表現をサポートします.Foundationを含むdllを除外
    <ModulePaths>
      <Exclude>
        <ModulePath>.*Foundation.*ModulePath>
      Exclude>
    ModulePaths>

    プロファイルのテンプレートは、マイクロソフトの公式ではなく、CodeCoverageに行きます.exeディレクトリの下で構成を探してコピーします.ディレクトリ:C:Program Files(x 86)Microsoft Visual Studio2017EnterpriseTeam ToolsDynamic Code Coverage Tools
  • よくある質問:

  • にあるVisualStudio 2017環境では、コマンドライン生成のレポートに「空の結果が生成されました.バイナリファイルは検出されませんでした.テストが実行されていることを確認してください.必要なバイナリファイルがロードされ、一致するシンボルファイルがあり、カスタム設定で削除されていません」と表示されます.この問題はVisualStudio 2017のバグのため、悩まないでください.あなたのVSバージョンをアップグレードすればいいです.https://developercommunity.visualstudio.com/content/problem/97029/code-coverage-not-working-in-153.html?childToView=124999#comment-124999