使用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发布测试结果给了我一个成功的结果。下面给出的是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相同的格式生成输出(有利于结果可视化)。