13

我在 TFS2010 服务器上有一个 x64 平台 C# 解决方案(VS2012)。我已将一个单元测试项目(也是 x64)附加到此解决方案并创建了一个构建定义。当我排队构建时,它会成功,但不会执行单元测试用例。这是因为 MSTest 是 32 位应用程序。因此,我决定自定义默认构建过程模板 (DefaultTemplate.xaml) 以调用 VSTest(VSTest.console.exe) 而不是 MSTest。这非常复杂,我无法将构建活动添加到 VSTest 的工具箱中。

有人做过这种定制吗?我还考虑了其​​他方法,例如配置 .runsettings 文件。我们是否有可以在 .runsettings 文件中添加的 VSTest 适配器接口?

4

3 回答 3

17

Executing unit tests through VSTest and publishing the test results through MSTest gave me a successful outcome. Given below is the Powershell script:

#  Get the UnitTest Binaries
$files = Get-ChildItem $TestAssembliesDir\*est*.dll

#  VSTest.console.exe path
$VSTestPath = 'C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe'

#  MSTest path
$MSTestpath = "C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\mstest.exe"
#  Loop through the test assemblies and add them to the VSTestFiles

$VSTestFiles = ''  
foreach($file in $files)  
{   
    $VSTestFiles += "`"$file`"" 
    $VSTestFiles += " "
} 

#  Run the UnitTests using VSTest 
&$VSTestPath  $vstestplatform "/Framework:Framework45" "/InIsolation" $VSTestFiles "/logger:trx"

#  Get TRX files
$TrxFilesList = Get-ChildItem $TestResDir\*.trx
$TrxFiles = ''  
$loop = 1
foreach($file in $TrxFilesList)  
{   
    $TrxFiles = "$file" 
    # copy the trx file into a space-less named trx
    $newTrxFileName = "$BuildUri" + "_" + "$loop" + ".trx"

    copy-item $TrxFiles -destination $TestResDir\$newTrxFileName

    $loop = $loop + 1
    $newTrxFile += "$TestResDir\$newTrxFileName"
    $newTrxFile += " "
} 

#  specify MSTest arguments 
$mspubl = "/publish:"+$TeamProjColUri
$msteampr = "/teamproject:" + $TeamProj
$mspublbuild = "/publishbuild:" +$BuildUri
$mspubresfile = "/publishresultsfile:" +"`"$newTrxFile`""
#Publish test results through MSTest
&$MSTestpath  $mstestplatform $flavor $mspubl $msteampr $mspublbuild $mspubresfile
于 2013-08-20T05:13:16.753 回答
4

我也同样需要使用 VSTest.Console.exe 而不是 MSTest.exe 来编译 VS2012/.NET 4.5 x64 应用程序的 TFS2010 构建过程,同时等待升级到 TFS2012 开始。

我采用的方法是编辑构建脚本 XAML,删除现有的单元测试工作流,并将其替换为自定义工作流,该工作流构建 VSTest.Console.exe 参数,然后通过 InvokeProcess 执行 VSTest.Console.exe。然后,我确保在 finally 块中,无论测试结果如何,我们都使用构建服务器上的 VS2012 安装中的 MSTest.exe 将测试结果和代码覆盖率发布到 TFS。

不幸的是,我无法在答案中发布 XAML,因为它超过了字符长度,但我确实有一个文本文件,其中包含要在 DefaultTemplate.xaml 中替换的片段以及替换它的内容。该文件可以在这里找到。请注意,尽管这种方法有效,但它是一种 hack。

另一种选择是使用 NUnit 代替 MSTest 或 VSTest.Console,因为它支持 64 位二进制文​​件。本文解释了如何将 NUnit 集成到 TFS2010 构建脚本中,并提供了实现这一目标所需的工具和资源的链接NUnit 的唯一问题是代码覆盖率(需要另一个工具以及如何将这些结果发布到 TFS)和 MSTest 样式的集成测试,使用诸如 DeploymentItem 和诸如 TestContext 之类的属性,这就是为什么我选择使用的原因VSTest.Console.exe 方法。

从我读过的内容来看,TFS2012 提供了从构建脚本轻松集成到 VSTest.Console.exe 的功能,因此如果您升级到 TFS2012,可能不需要我记录的 VSTest.Console.exe hack。

于 2013-03-26T01:55:10.457 回答
1

这不会直接回答您的问题,但可能会有所帮助。我为 TeamCity 做了类似的事情。我使用命令行调用 vstest.console.exe 并创建了一个 .runsettings 文件。

我将此Microsoft 模板用于运行设置文件。但是请注意,在我的机器上,第 5 行注释中提到的路径是相对于 .runsettings 位置的,而不是相对于 .sln 的。

如果您使用 vstest.console.exe 的 /logger:trx 选项,它将生成与 MSTest 相同格式的输出(有利于结果可视化)。

于 2013-02-20T09:36:59.843 回答