使用VSTest来运行单元测试用例,而不是MSTest

本文关键字:MSTest 测试用例 VSTest 运行 单元 使用 | 更新日期: 2023-09-27 18:00:08

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

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

使用VSTest来运行单元测试用例,而不是MSTest

通过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

对于编译VS2012/.NET 4.5 x64应用程序的TFS2010生成进程,我也有完全相同的需求,需要使用VSTest.Console.exe而不是MSTest.exe,同时等待开始升级到TFS2012。

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

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

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

从我所读到的内容来看,TFS2012提供了从构建脚本到VSTest.Console.exe的简单集成,因此,如果您升级到TFS2012,可能不需要我所记录的VSTest.Controle.exe破解。

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

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

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