【发布时间】:2015-09-11 17:47:07
【问题描述】:
总体目标
我正在尝试创建一个 PowerShell 脚本,该脚本将在整个解决方案中无头(通过命令行)运行所有测试,以用于 CI 目的。我们有 UnitTests 和 IntegrationTests 应该能够单独运行。
解决方案结构
解决方案是 Visual Studio 2013 解决方案(使用专业版)。每个项目可选地有一个或两个单独的项目进行测试。一个项目用于单元测试,另一个项目用于集成测试。我们遵循一个简单的命名约定:
- 组件:Namespace.ComponentName
- 单元测试:Namespace.ComponentName.Test
- 诠释。测试:Namespace.ComponentName.IntegrationTest
测试工具
我正在使用 VSTest.Console.exe 运行测试。
当前失败的解决方案
我正在尝试运行 OR 仅单元测试或仅集成测试。所以想法是扫描所有的测试dll文件并在后缀上过滤它们。
单元测试示例:
# Declare my parameter that will contain the targeted TestFileNames
$Parameters = '';
# Get all the test project names, space separated that match *.Test.dll in my solution
Get-ChildItem $RepositoryRootLocation -Filter *.Test.dll -Recurse | ? {$_.fullname -notmatch 'obj'} | % { $Parameters = $Parameters + $_.FullName+ " "};
#Run the VSTest.Console.Exe with the specified test project names
& $MsTestConsolePath $Parameters ;
这应该可以正常工作,唯一的问题是我在嵌套子文件夹中有 40 多个测试项目。运行此脚本时会导致异常:
Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
该消息是不言自明的,所以问题是,这个问题不是可扩展的,因为我遇到了一些烦人的简单限制。
主要问题
是否有另一种使用 VSTest.Console.exe 的方法,我只能运行基于过滤器的测试项目的某个子集,因此我只能运行 OR 单元测试或集成测试。
我应该换个角度来解决这个问题吗?或者当所有测试项目都在我的解决方案存储库的子文件夹中时,我可以只使用测试项目名称而不是完整文件路径吗?
重要:它应该很容易扩展,所以我不需要每个新创建的测试项目都将它添加到 testsettings 文件或类似文件中。我只想说,运行解决方案中的所有测试项目,过滤它们是单元类型还是集成类型。
将我的存储库放在磁盘的根目录中以缩短测试项目名称的完整路径名并不灵活,因为该脚本可能在任何机器上运行。
【问题讨论】:
-
我在构建服务器上遇到了类似的问题,这篇 SO 帖子是我在寻找解决方案时出现的主要结果之一。我不知道这是否会帮助你,但也许它会帮助别人:alexdresko.com/2015/10/12/vstest-says-path-too-long-i-fix
标签: c# powershell visual-studio-2013 vstest