如何让TeamCity运行同时集成了NCover和TypeMock的NUnit测试?

3
基本上,我想使用TeamCity的NUnit插件(程序,而不一定是使用它的具体构建步骤)来运行我的单元测试,使用NCover进行代码覆盖率,并且由于我的单元测试使用TypeMock 6,因此我也需要使其正常工作。
到目前为止,我已经尝试了以下方法:
- 基本上只是将TeamCity NUnit构建步骤指向我的dll,但是会出现以下错误消息:
Typemock Isolator 需要链接覆盖工具才能运行,要启用,请执行以下操作之一:
1.通过Typemock Isolator Configuration链接覆盖工具 2.通过TMockRunner.exe -link运行测试 3.使用TypeMockStart tasks for MSBuild或NAnt with Link
- 尝试找到正确的命令行,我尝试了这个:
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的额外选项,因此我希望在到达那一步时只需启用它即可。

你可以在TeamCity论坛上提问,可能会获得更多的成功。 - adrianbanks
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服务器上的一个目录中。由于我不希望测试脚本成为我的存储库的一部分,因此我没有将其添加到源代码控制中(如果我得到与我的构建服务器不那么紧密相关的内容,我可能会更改这个决定,但是我可以在Visual Studio中构建、右键单击和运行测试)。另外,我只有一个TeamCity服务器的构建代理,所以这对我来说现在还有效。
除了上述文件之外,我还添加了以下批处理文件:
@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列在构件下,现在我得到了代码覆盖率、typemock和单元测试。
到目前为止,我唯一没有弄清楚的事情是,如果我点击使用正常的TeamCity GUI设置所有内容(减去TypeMock)的构建配置的构建结果,我会看到一个代码覆盖短摘要列表,在上述设置中不存在,但完整报告是有的,并且在TeamCity构建结果的选项卡中。
希望这能帮助其他人节省一些麻烦。

0

Lasse,

只要您使用TeamCity GUI,使用NCover覆盖率运行应该只是选择运行它的简单问题。我从未尝试将Typemock混合在一起,所以我期待听到它的进展。


TypeMock 要求您通过它运行所有内容,这意味着我不能在 GUI 中执行此操作。既然我已经弄清楚如何做到这一点,现在我将添加自己的答案。 - Lasse V. Karlsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接