使用VSTest而非MSTest来运行单元测试用例

13

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

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

3个回答

17

通过使用VSTest执行单元测试并通过MSTest发布测试结果,让我获得了成功的结果。以下是PowerShell脚本:

#  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

太好了。特别是找到生成的trx文件的部分。谢谢。 - paulroho
为什么声明了$MSTestpath却从未使用?$TestResDir在哪里声明并设置为什么? - Ian Kemp

4
我也有与使用VSTest.Console.exe代替MSTest.exe进行TFS2010构建过程的确切需求,编译VS2012/.NET 4.5 x64应用程序,同时等待升级到TFS2012开始。
我采取的方法是编辑构建脚本XAML,删除现有的单元测试工作流,并替换为一个自定义工作流,该工作流构建VSTest.Console.exe参数并通过InvokeProcess执行VSTest.Console.exe。然后,我确保在Finally块中,无论测试结果如何,我们都会使用来自构建服务器上VS2012安装的MSTest.exe将测试结果和代码覆盖率发布到TFS。
不幸的是,我无法在答案中发布XAML,因为它超出了字符长度,但我确实有一个文本文件,其中包含要在DefaultTemplate.xaml中替换的片段以及要替换的内容。该文件可以在此处找到。请注意,尽管这种方法有效,但它是一种hack。
另一种选择是使用NUnit而不是MSTest或VSTest.Console,因为它支持64位二进制文件。这篇文章解释了如何在TFS2010构建脚本中集成NUnit,并提供了使此过程发生所需的工具和资源的链接。 NUnit的唯一问题是代码覆盖率(需要另一个工具以及弄清楚如何将这些结果发布到TFS)和使用属性(例如DeploymentItem和TestContext)的MSTest-style集成测试,这就是为什么我们选择了VSTest.Console.exe方法。
从我所读的内容来看,TFS2012可以轻松地将VSTest.Console.exe与构建脚本集成在一起,因此,如果您升级到TFS2012,则可能不需要我记录的VSTest.Console.exe hack。

我发现在指定测试类别时存在问题,特别是当您想要设置测试执行以忽略属于特定测试类别的测试时。我通过向构建 XAML 添加一个名为 TestCaseFilter 的新参数来克服这个问题,并且如果已指定构建定义的 TestCaseFilter 参数,则设置 VSTest.Console.exe 的 TestCaseFilter 参数。在 Misc 下的构建定义中,您可以将 TestCaseFilter 设置为您需要的任何内容,在我的情况下为“TestCategory!= IntegrationTest”。 - Kosta Tenedios
非常感谢Kosta :) 我已经通过PowerShell脚本完成了单元测试用例的vstest执行部分。但是我在发布结果方面遇到了一些问题。我会查看您的解决方案。再次感谢! - Arkanoid
你好 @Arkanoid,你可能不需要放弃你的PowerShell脚本,因为从我所了解的情况来看,它将会做与我在XAML中直接完成的事情相同。只要在你的PowerShell脚本中,你使用VSTest.Console.exe生成TRX文件,然后调用MSTest.exe将该TRX文件发布到TFS,并且无论VSTest.Console.exe是否成功,都会调用MSTest.exe。 - Kosta Tenedios
@KostaTenedios 感谢分享这个伟大的解决方案。对于任何其他实施此方案的人,请注意团队项目和 TFS 服务器 URI 都是硬编码的;您可以用变量替换它们。此外,您需要将“st”命名空间导入到构建定义中。 - codechurn

1
这并不是直接回答你的问题,但可能会有所帮助。我曾经为TeamCity做过类似的事情。我使用命令行调用vstest.console.exe并创建了一个.runsettings文件。
我使用了Microsoft模板来创建runsettings文件。请注意,在我的机器上,第5行中提到的路径是相对于.runsettings位置而不是.sln。
如果你使用vstest.console.exe的/logger:trx选项,它将生成与MSTest相同格式的输出(适合结果可视化)。

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