如何从“解决方案”项目中调用项目中的单元测试目标

时间:2009-09-22 19:05:27

标签: msbuild teamcity

我正在尝试让Team City构建我的.NET解决方案并运行我的nUnit测试。

我知道我可以修改单个项目并告诉他们总是运行单元测试。当我在visual studio中单击“build”时,希望单元测试运行,但我希望在Team City启动msbuild时运行单元测试任务。

我尝试了“msbuild solutionname.sln”,并为团队城市提供了“BUILD”和我的自定义构建标记“TEST”的目标。但是,在针对sln解决方案调用时,msbuild无法找到任何指定的目标。 所以,我运行msbuild将我的解决方案转换为一个具有以下目标的项目:

  <Target Name="Build">
    <MSBuild  Projects="@(BuildLevel0)" >
  </Target>

我天真地以为我可以写一个像这样的新任务:

<Target Name="BuildAndTest">
    <CallTarget Targets="Build"/> <!-- This builds everything in solution -->
    <CallTarget Targets="Test"/> <!-- DOES NOT WORK. This target exists in project that gets built by this solution -->
</Target>

nunit目标如下所示:

  <Target Name="Test" DependsOnTargets="Build" Condition=" '$(Configuration)' == 'Release'">
    <NUnit Assemblies="$(OutputPath)\Tsa.BaseTest.dll" ContinueOnError="false" ToolPath="C:\Program Files\NUnit 2.5.2\bin\net-2.0\" DisableShadowCopy="true" OutputXmlFile="$(OutputPath)\nunit-results.xml" />
  </Target>

正如您所看到的,它引用了OutputPath,只有项目知道 - 解决方案没有引用$ OutputPath,否则我只是将所有测试目标放入“解决方案项目”。

关于如何让它发挥作用的任何建议?

2 个答案:

答案 0 :(得分:1)

我认为你做的比现在要困难得多。 TeamCity内置支持在构建后运行NUnit单元测试 - 您根本不需要修改MSBuild文件。只需设置构建配置(我认为它在Runner下)来指定NUnit的版本以及哪些程序集是测试程序集。

注意:我检查过,我们在TeamCity企业版4.5.4中的Runner:sln2008(部分NUnit测试设置)下有这个,但我在JetBrains网站上没有看到任何声明它特定于Enterprise的内容。但是,它可能需要进行版本升级。请参阅TeamCity Testing Frameworks

答案 1 :(得分:0)

这是最终奏效的。它被视觉工作室忽略,msbuild将正确运行此部分,并且团队城市也将如此,尽管它用自己的运行时替换目标(根据构建日志)。

TeamCity将“自动”运行nunit测试并显示结果,只是在手动编辑msbuild文件后执行此操作,执行大量手动teak并告诉TeamCity每个程序集的位置以及每个输出文件的位置。

<Project (snip) DefaultTargets="BuildAndTest" (snip)>
<Target Name="BuildAndTest">
    <CallTarget Targets="Build" />
    <CallTarget Targets="TestBase" />
</Target>

  <Target Name="TestBase" DependsOnTargets="Build">
    <NUnit Assemblies="Tsa.BaseTest\bin\RELEASE\Tsa.BaseTest.dll" ContinueOnError="false" ToolPath="C:\Program Files\NUnit 2.5.2\bin\net-2.0\" DisableShadowCopy="true" OutputXmlFile="$(SolutionDir)\Tsa.BaseTest\bin\RELEASE\nunit-results.xml" />
  </Target>
  </Target>
</Project>