3

基本上我想使用 TeamCity 的 NUnit 插件(程序,不一定是使用它的特定构建步骤)来运行我的单元测试,使用 NCover 进行代码覆盖,并且由于我的单元测试使用 TypeMock 6,我也需要它在职的。

到目前为止,我已经尝试过:

  • 只是基本上将 TeamCity NUnit 构建步骤指向我的 dll,但失败并显示以下错误消息:

    Typemock Isolator 需要与 Coverage Tool 链接才能运行,以启用以下操作之一:

    1. 通过 Typemock 隔离器配置链接 Coverage 工具
    2. 通过 TMockRunner.exe -link 运行测试
    3. 使用带有链接的 MSBuild 或 NAnt 的 TypeMockStart 任务
  • 试图找出正确的命令行,我试过这个:

    C:...\Isolator\6.0\TMockRunner.exe "C:\TeamCity...\JetBrains.BuildServer.NUnitLauncher.exe" v4.0 MSIL NUnit-2.5.9 MyAssembly.dll

    这失败并出现完全相同的错误。

  • 设置在 TypeMock 的文件部分中找到的环境变量mocking_on.bat,这不会改变结果。

请注意,上面的示例不包含对 NCover 的任何引用(还),这是因为我已经在命令行上使用上面的示例进行了几个小时的修改,但仍然没有运行基本的单元测试。NCover 是 TeamCity 的 nunit-launcher 的额外选项,所以我希望这就像在我做到这一点时启用它一样简单。

4

2 回答 2

4

由于 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 构建配置中添加了以下两个构建步骤:

  1. Visual Studio 解决方案:构建调试配置。
  2. 执行 C:\Dev\SqlDatabases\Tests.bat(上面的批处理文件)

我确保它coverage.zip被列在我的构建配置中的工件下,现在我得到了代码覆盖率、类型模拟和单元测试。

到目前为止,我唯一不知道的事情是,如果我单击使用普通 TeamCity GUI 设置所有内容(减去 TypeMock)的构建配置的构建结果,我会得到列出的代码覆盖率简短摘要,这在上述设置中不存在,但完整报告存在,并且 TeamCity 构建结果中的选项卡。

希望这可以为其他人节省一些麻烦。

于 2011-02-01T17:44:13.310 回答
0

拉斯,

只要您使用的是 TeamCity GUI,使用 NCover 覆盖运行应该只是选择使用它运行的简单问题。我从未尝试过将 Typemock 加入其中,所以我期待听到它是如何进行的。

于 2011-02-01T16:52:16.660 回答