由于 TypeMock 要求您使用他们自己的运行程序 TMockRunner,因此无法仅使用 TeamCity 中的 GUI 选项来设置所有内容。
相反,我最终做的是首先使用以下内容构建一个自定义 msbuild 文件:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<TypeMockLocation>C:\Program Files (x86)\TypeMock\Isolator\6.0</TypeMockLocation>
<NUnit>"C:\TeamCity\buildAgent\plugins\dotnetPlugin\bin\JetBrains.BuildServer.NUnitLauncher.exe"</NUnit>
<NCover>C:\Program Files (x86)\NCover\NCover.Console.exe</NCover>
</PropertyGroup>
<Import Project="$(TypeMockLocation)\TypeMock.MSBuild.Tasks"/>
<Target Name="TestWithTypeMock">
<TypeMockStart Link="NCover3.0" ProfilerLaunchedFirst="true" Target="2.0"/>
<Exec ContinueOnError="true" Command="$(NUnit) v2.0 x86 NUnit-2.5.9 SqlDatabases.Core.Tests\bin\Debug\SqlDatabases.Core.Tests.dll SqlDatabases.SqlServer.Tests\bin\Debug\SqlDatabases.SqlServer.Tests.dll /ncover:%22$(NCover)%22 /ncover-arg://ias /ncover-arg:SqlDatabases.Core /ncover-arg://ias /ncover-arg:SqlDatabases.SqlServer /ncover-arg://et /ncover-arg:.*Exception /ncover-arg://x /ncover-arg:c:\temp\coverage.xml"/>
<TypeMockStop/>
</Target>
</Project>
我将此文件保存到我的 TeamCity 服务器上的目录中。因为我不希望测试脚本成为我的存储库的一部分,所以我没有将它添加到源代码控制中(如果我得到的东西与我的构建服务器我以后可能会改变这个决定)。此外,我的 TeamCity 服务器只有 1 个构建代理,所以这对我来说暂时有效。
除了上述文件,我还添加了以下批处理文件:
@echo off
setlocal
set CURDIR=%CD%
copy c:\dev\sqldatabases\tests.msbuild .\
msbuild tests.msbuild /target:TestWithTypeMock
rd /s /q c:\dev\sqldatabases\codecoverage
md c:\dev\sqldatabases\codecoverage
"c:\program files\ncover\ncover.reporting.exe" c:\temp\coverage.xml //or FullCoverageReport:Html:c:\dev\sqldatabases\codecoverage
cd \dev\sqldatabases\codecoverage
del %CURDIR%\coverage.zip
7z a -r %CURDIR%\coverage.zip
然后我在我的 TeamCity 构建配置中添加了以下两个构建步骤:
- Visual Studio 解决方案:构建调试配置。
- 执行 C:\Dev\SqlDatabases\Tests.bat(上面的批处理文件)
我确保它coverage.zip
被列在我的构建配置中的工件下,现在我得到了代码覆盖率、类型模拟和单元测试。
到目前为止,我唯一不知道的事情是,如果我单击使用普通 TeamCity GUI 设置所有内容(减去 TypeMock)的构建配置的构建结果,我会得到列出的代码覆盖率简短摘要,这在上述设置中不存在,但完整报告存在,并且 TeamCity 构建结果中的选项卡。
希望这可以为其他人节省一些麻烦。