Tests reported twice when using XUnit with TeamCity
Here’s a quickie for all you people running XUnit tests in a TeamCity build. TeamCity doesn’t directly support XUnit, so it takes a wee bit of effort to get things going. The way I decided to tackle the issue was to add the following bits to our test project build file:
<Target Name=“CustomBuild“ DependsOnTargets=“Build“>
<CallTarget Targets=“Test“ Condition=“$(TEAMCITY_PROJECT_NAME) != ”“ />
<UsingTask AssemblyFile=“..\packages\xunit.1.6.1\Tools\xunit.runner.msbuild.dll“ TaskName=“Xunit.Runner.MSBuild.xunit“ />
<xunit Assembly=“$(TargetPath)“ NUnitXml=“..\..\TestReport.xml“ />
The CustomBuild target depends on Build, so Build gets run in any case. This ensures that we always run the latest set of tests.
Then, if the build script detects TeamCity (by presence of the TEAMCITY_PROJECT_NAME variable), it runs the Test target, which outputs its results to TestReport.xml.
Having got this far, I added TestReport.xml to our TeamCity configuration, and things seemed to work nicely. Except that our tests got reported twice.
It took me a while to finally clue in to what was happening: TeamCity was already parsing the output of the XUnit test task, and having a separate test report was what caused the duplicates. This wasn’t immediately obvious to me, until we built a separate performance test bench and used console output to communicate its results to TeamCity (more on that in a future installment).
Long story short: TeamCity can already understand XUnit tests, it just doesn’t provide a way to run them.