Enabling JavaScript Code Coverage Link in Builds

teambuild
13412

In a previous post I wrote about how to do JavaScript unit testing in VS 2012. The same procedure applies to VS 2013 – but the Chutzpah test adapter now allows you to run code coverage too. At the end of my post I link to another blog entry about how to enable the tests to run during team builds.

I recently added some tests to a VS 2013 solution I was working on and was pleased to see that when you “Analyze Code Coverage for all Tests” in the Test Explorer, VS pops open a nicely formatted html page that shows you your JavaScript coverage. I wanted to have that file available in my build results too. Looking at the test results folder of the local VS test run, I saw that Chutzpah created an html file called “_Chutzpah.coverage.html”. I wanted that script to be copied to the drop folder of the build and create a link in the build summary that you could click to open it.

Post-Test Script

Fortunately you can do this without even having to customize the build template – as long as you’re using the TfvcTemplate.12.xaml template – the default build template that ships with TFS 2013. This build has some really useful script hooks – and there’s one for running a post-test script. I knew I could easily copy the Chutpah result file to the drop folder – no problem. But how do you add to the build summary report from a script that’s running “outside” the workflow? If you customize the workflow you can use the WriteCustomSummaryInformation activity, but I wanted to do this without modifying the template.

After mailing the ChampsList, Jakob Ehn pointed me in the right direction – I needed to use the InformationNodeCoverters.AddCustomSummaryInformation method. Once I had that, the rest of the PowerShell script was almost trivial. I did hit one snag – I need the Team Project Collection URI for the script to work, but for some reason the value of the TF_BUILD_COLLECTIONURI build environment variable was empty. Updating my build agent to VS 2013 Update 2 resolved this issue. Here’s the script:

Param(
  [string]$testResultsDir = $env:TF_BUILD_TESTRESULTSDIRECTORY,
  [string]$dropLocation = $env:TF_BUILD_DROPLOCATION,
  [string]$tpcUri = $env:TF_BUILD_COLLECTIONURI,
  [string]$buildUri = $env:TF_BUILD_BUILDURI
)

$coverageFileName = "\_Chutzpah.coverage.html"
$jsScriptResultsFile = $testResultsDir + $coverageFileName
if (Test-Path($jsScriptResultsFile)) {
    try {
        Write-Host "Copying Chutzpah coverage files"
        copy $jsScriptResultsFile $dropLocation

        # add the link into the build summary
        Write-Host "Loading TFS assemblies"
        [Reflection.Assembly]::LoadWithPartialName('Microsoft.TeamFoundation.Client')
        [Reflection.Assembly]::LoadWithPartialName('Microsoft.TeamFoundation.Build.Client')
    
        Write-Host "Getting build object"
        $tpc = [Microsoft.TeamFoundation.Client.TfsTeamProjectCollectionFactory]::GetTeamProjectCollection($tpcUri)
        $buildService = $tpc.GetService([Microsoft.TeamFoundation.Build.Client.IBuildServer])
        $build = $buildService.GetBuild($buildUri)

        Write-Host "Writing Chutzpah coverage link to build summary"
        $message = "Javascript testing was detected. Open [coverage results]($dropLocation\$coverageFileName)"
        [Microsoft.TeamFoundation.Build.Client.InformationNodeConverters]::AddCustomSummaryInformation($build.Information, $message, "ConfigurationSummary", "Javascript Coverage", 200)
        $build.Information.Save();

        # all is well with the world
        Write-Host "Success!"
        exit 0
    }
    catch {
        Write-Error $_
        exit 1
    }
} else {
    # let the build know there were no coverage files
    Write-Warning "No Chutzpah coverage file detected"
    exit 0
}

I saved this to my build scripts folder under source control and checked it in.

Opening up the build definition, I had to create a second build run to run the JavaScript tests – here’s the settings I used:

image Note how I’ve enabled Code Coverage in the options dropdown.

I added this folder to the source mappings for my build and then called the script in the post-test settings of the build:

image Now when I run my build, I get a link to the JavaScript coverage file:

image Clicking on the “coverage results” link opens the results page:

image As a next project, I want to see if I can incorporate the coverage results into the build warehouse so that there’s metrics not only on .NET coverage over time, but also for JavaScript tests.

Happy testing!