Search code examples
c#continuous-integrationnantteamcitygallio

How to set up TeamCity/NAnt/Gallio/PartCover to show test results?


This is my first time setting up teamcity and I am running into some issues displaying results. I want to have a build step that runs an NAnt script. The script should run my unit tests through PartCover and display results. The results should be:

  • Tests that pass/Tests that fail
  • Coverage report

But I don't really know how to set up the script or the settings or even where I should view these results (the artifacts section I'm guessing?). Using the following script below, everything runs ok but I am not able to view any reports.

<project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

<loadtasks assembly="C:\Program Files\Gallio\bin\Gallio.NAntTasks.dll" />

<target name="test"> 
  <gallio result-property="exitCode" failonerror="false" > 
    <runner-extension value="TeamCityExtension,Gallio.TeamCityIntegration" /> 
    <files> 
      <include name="%system.teamcity.build.checkoutDir%\Trunk\MyLibrary.Testing\bin\Release\MyLibrary.Testing.dll"/> 
    </files> 
  </gallio> 
  <fail if="${exitCode != '0'}" >One or more tests failed. Please check the log for more details</fail>    
</target>

</project>

For the .Net Coverage section, I have PartCover (2.2 or 2.3) selected but I don't have anything in the PartCover Arguments (should I?)

Thanks for your help!


Solution

  • I ran into issues with NAnt and decided to just use MSBuild. MSBuild was easier to work with and gave very descriptive error messages. (I also found our license for NCover so used that as well). Here is my script for anyone interested. I found the code for it from various spots on the net.

    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
      <PropertyGroup>
        <CoverageDir>.\Tests\Output\Coverage</CoverageDir>
        <CoverageFilesDir>.\Tests\Output\Coverage\files</CoverageFilesDir>
        <BinDir>Testing\bin\x86\Release</BinDir>
        <NCoverDir>C:\Program Files (x86)\NCover</NCoverDir>
        <GallioDir>C:\Program Files (x86)\Gallio\bin</GallioDir>
      </PropertyGroup>
    
      <UsingTask TaskName="NCover" AssemblyFile="$(NCoverDir)\Build Task Plugins\NCover.MSBuildTasks.dll" /> 
      <UsingTask TaskName="NCoverExplorer" AssemblyFile="$(NCoverDir)\Build Task Plugins\NCoverExplorer.MSBuildTasks.dll"/>
    
      <!-- Specify the tests assemblies --> 
      <ItemGroup> 
        <TestAssemblies Include="$(BinDir)\library.Testing.dll" />
        <CoverageAssemblies Include="$(BinDir)\library.dll" />
      </ItemGroup>
    
        <Target Name="Coverage">
          <Message Text="Creating $(CoverageFilesDir)" />
          <MakeDir Directories="$(CoverageFilesDir)"/>
    
          <Message Text="##-------------------- Running Coverage Reports --------------------##" /> 
          <Message Text="Coverage Assemblies @(TestAssemblies)" />
    
          <!--Run NCover to gather coverage information-->
          <NCover
          ToolPath="$(NCoverDir)"
          TestRunnerExe="$(GallioDir)\Gallio.Echo.exe"
          TestRunnerArgs="%(TestAssemblies.FullPath)"
          IncludeAssemblies="@(CoverageAssemblies)"
          LogFile="$(CoverageFilesDir)\%(TestAssemblies.Filename)-ncover.log"
          RegisterProfiler="false"
          CoverageFile="$(CoverageFilesDir)\%(TestAssemblies.Filename)-coverage.xml"/>    
    
          <CreateItem Include="$(CoverageFilesDir)\*-coverage.xml">
            <Output TaskParameter="Include" ItemName="CoverageReports"/>
          </CreateItem>
    
          <!--Generate coverage report-->
          <NCoverExplorer
            ToolPath="$(NCoverDir)"
            ProjectName="Library Coverage"
            ReportType="4"
            Sort="CoveragePercentageAscending"
            Filter="None"
            OutputDir="$(CoverageDir)"
            XmlReportName="CoverageReport.xml"
            HtmlReportName="CoverageReport.html"
            ShowExcluded="True"
            SatisfactoryCoverage="15"
            FailMinimum="False"
            CoverageFiles="@(CoverageReports)"/>
    
          <!-- In case one of the tests fails, make sure to stop TypeMock and unregister NCover. -->
          <OnError ExecuteTargets="test-finally"/>
      </Target>
    
      <!-- Stopping unregistering NCover is a separate target because it has to happen -->
      <!-- regardless of success or failure of the unit tests. Like the "finally" in a "try/finally" block. -->
      <Target Name="test-finally">
        <Exec Command="regsvr32 /u /s &quot;$(NCoverDir)\CoverLib.dll&quot;" ContinueOnError="true"/>
      </Target>
    
    </Project>