CruiseControl.NETにコードカバレッジコレクションを埋め込む

はじめに



最近、積極的にテスト駆動開発ソフトウェアの実践の発展を促進しました。 間違いなく、それは非常に便利ですが、常にではなく、すべてがそれを使用するわけではありません。 したがって、一部として単体テストによって覆われたコードの一部が覆われていないままです。 テストが正常に書かれているかどうかにかかわらず、各プロジェクトを手動で追跡することはほとんど不可能な作業です。

私は最近、テストによるコードカバレッジの割合を示すメトリックの収集プロセスを自動化する方法を知りました。 それはCruiseControl.NETにそのコレクションを構築することを決めました。 当然、100%のカバレッジはバグがないことを保証するものではありませんが、少なくともテストの作成に対する開発者の態度を示しています。



画像





この記事では、プロジェクトを構築して単体テストを実行するためのCruiseControlのセットアップに関するポイントについては触れません。 コードのカバレッジに関する必要な情報を収集し、テストページに表示できるようにする手順について説明します。 単体テストを作成するために、当社ではMicrosoftのフレームワークMSTestを使用しています。 このフレームワークの結果及び資料に記載されます。 コードカバレッジを埋め込むための前提条件は、テストを実行するためのCruiseControlの初期セットアップであることは注目に値します。



私の知る限り、CruiseControlには、NCoverを使用して収集されたデータを表示するための組み込み機能があります。 しかし、このライブラリを購入する機会がないため、私たちが持っている方法を使用します。



次のすべては、Visual Studio 2010で作成されたプロジェクトに適用されます。2008バージョンとの違いは、小さいながらもあります。



ビルドサーバーでdata.coverageファイルを作成する



Visual Studioでは、すべてのテストに合格した後、コードの対象セクションに関する情報が保存されるファイルが作成されるように、テストの実行を構成できます。 このファイルはdata.coverageと呼ばれます(テストに合格した結果とともにInフォルダーに保存されます)。

この設定は、プロジェクト.testrunco​​nfigファイルに格納されます。 UIから次のように設定できます。

  1. .testrunco​​nfigファイルを開きます
  2. データと診断を選択
  3. [コードカバレッジ]の横のボックスをオンにして、[構成]をクリックします。
  4. カバレッジを収集するライブラリを選択します
  5. 所定の場所にある機器アセンブリのチェックを外します


ファイルを保存すると、次のテキストがその中にあります。



<?xml version="1.0" encoding="UTF-8"?> <TestSettings name="Local Test Run" id="de0d45b4-4fed-4acb-a663-2cfdf0ce4fd7" xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010"> <Description>This is a default test run configuration for a local test run.</Description> <Deployment enabled="false" /> <Execution> <Timeouts testTimeout="300000" /> <TestTypeSpecific> <UnitTestRunConfig testTypeId="13cdc9d9-ddb5-4fa4-a97d-d965ccfc6d4b"> <AssemblyResolution> <TestDirectory useLoadContext="true" /> </AssemblyResolution> </UnitTestRunConfig> </TestTypeSpecific> <AgentRule name="LocalMachineDefaultRole"> <DataCollectors> <DataCollector uri="datacollector://Microsoft/CodeCoverage/1.0" assemblyQualifiedName="Microsoft.VisualStudio.TestTools.CodeCoverage.CoveragePlugIn, Microsoft.VisualStudio.QualityTools.Plugins.CodeCoverage, PublicKeyToken=b03f5f7f11d50a3a" friendlyName="Code Coverage"> <Configuration> <CodeCoverage xmlns=""> <Regular> <CodeCoverageItem binaryFile="YourProject\bin\Debug\YourProject.dll" pdbFile="YourProject\bin\Debug\YourProject.pdb" /> </Regular> </CodeCoverage> </Configuration> </DataCollector> </DataCollectors> </AgentRule> </Execution> </TestSettings>
      
      





DataCollectorsセクションは、MSTestにコードカバレッジを構築するよう指示するだけです。



設定で何を指定する必要があるかがわかったので、ビルドサーバーで使用するための3つのオプションがあります。



最初のケースは私たちに合わない、なぜなら このファイルはバージョン管理システムに保存されるため、開発者はコードカバレッジ収集オプションをオフにして、このファイルを戻すことができます。 または、たとえば、場合によってはこのメトリックを収集したくない場合も同様です。 これらの理由から、メトリックを収集するかどうかを収集するかどうかの設定をCruiseControlに含める必要があります。 2番目のオプションも、上記の問題を完全に防止するわけではありません。 上記の理由により、当社では3番目のオプションを決定しました。 XMLファイルの作成方法については説明しませんが、すべてが非常に簡単です。



構成の準備ができたら、テストを実行できますこれを行うには、タスクセクションのCruiseControl構成ファイルに次のコードを追加します。



 <exec> <executable>C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe</executable> <buildArgs>"/testcontainer:PathToWorkingDirectory\Source\bin\Release\YourTestProject.dll" "/runconfig:PathToYourConfig\localtestrun.testrunconfig" "/resultsfile:PathToWorkingDirectory\TestResults.xml"</buildArgs> <description>Executing MSTest</description> </exec>
      
      







CruiseControlを実行すると、data.coverageファイルはPathToWorkingDirectory \ [ユーザー名] _ [マシン名] [日付と時刻] \ In \ [マシン名]フォルダーに作成されます。 なぜなら フォルダの名前には時間がありますが、将来的には使用するのがあまり便利ではなくなります。 したがって、.testrunco​​nfigに次のセクションを追加する必要があります(<TestSettings>内):



 <NamingScheme baseName="FolderName" appendTimeStamp="false" useDefault="false" />
      
      







今、あなたは\ [MACHINE-NAME]でフォルダPathToWorkingDirectory \フォルダ\にあるファイルを見つけることができますdata.coverage。



アクションが実行された後、data.coverageファイルは、CruiseControlを搭載したマシン上のこのプロジェクトのテスト結果を含むフォルダーに格納されます。 問題は、このファイルがバイナリであるため、xmlに変換する必要があることです。



data.coverageをXMLに変換します



このファイルを変換するには、すべてのテストに合格した後に実行されるコンソールアプリケーションを作成する必要があります。 ここではすべてが非常に簡単です。変換を実行するコードを以下に示します。



 using (CoverageInfo info = CoverageInfo.CreateFromFile(PathToDataCoverageFile)) { CoverageDS data = info.BuildDataSet(); string outputXml = data.GetXml(); File.WriteAllText(PathToOutputXmlCoverageFile,outputXml)); }
      
      







XML出力には必要のない多くの情報があるため、XSL変換を適用し、必要なセクションのみを残すことができます。 また、メソッド名は、カバーの詳細情報を表示する際に、多少不便である名前空間を含む完全な名前を持つことになり、それが結果のXMLファイルの簡単な変更によって決定されます。



ビルドサーバー構成の追加セクションのおかげで、コンソールアプリケーションが起動します。



 <exec> <executable>PathToConverter\Coverage2XmlConverter.exe</executable > <buildArgs>"PathToDataCoverage\data.coverage" "PathToOutputXml\coverage.xml"</buildArgs> <description>Calculation code coverage data</description> </exec>
      
      







データを追加して結果を作成する



これでほぼすべての準備が整いました。 結果のXMLファイルをビルド結果に追加するだけです。 これは非常に簡単に実行できます。パブリッシャーセクション内のCruiseControlの構成に次のセクションを追加する必要があります。



 <merge> <files> <file>PathToResults\TestResult.xml</file> <file>PathToCoverage\coverage.xml</file> </files> </merge>
      
      







テストでの作業を構成している場合、TestResult.xmlファイルは既に構成内にあるはずです。



ビルドページでのデータの表示



ビルドのページに収集されたデータを表示するために、XSLTファイルを記述することは残っています。 カバレッジが20%未満のビルドでは、コードカバレッジインジケーターは赤になり、20%-50%の場合はインジケーターが黄色になり、> 50%の場合は緑色になります。 これらの値はXSLTで簡単に変更でき、最適な値を使用します。



ビルドを含むページに表示されるカバレッジの合計値は、次のようになります。



画像



これを行うには、標準のCruiseControl.NETセットからMSTestReport2008.xslをわずかに変更する必要がありました。



コードカバレッジメトリックの詳細は次のとおりです。



画像



XSLTテキストで記事の場所を占めることはしないので、data.coverageファイルをXMLに変換するためのアプリケーションと共に、 GitHub 2 XSLTファイルに投稿しました。



どうもありがとう、私は一度コメントと追加をします。



All Articles