【问题标题】:VSTest Run only one type of testsVSTest 只运行一种类型的测试
【发布时间】: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 文件或类似文件中。我只想说,运行解决方案中的所有测试项目,过滤它们是单元类型还是集成类型。

将我的存储库放在磁盘的根目录中以缩短测试项目名称的完整路径名并不灵活,因为该脚本可能在任何机器上运行。

【问题讨论】:

标签: c# powershell visual-studio-2013 vstest


【解决方案1】:

我会尝试几件事。

首先,将构建服务器的路径更改为驱动器根目录下的文件夹。更少的文件夹,更少的机会遇到“路径太长”的问题。
您说缩短路径可能不是正确的解决方案,但确实如此。您可以对构建机器有要求(例如,“安装 .net”就是其中之一),并且“不要将源代码放在疯狂的子文件夹中”是一个合理的要求。

其次,您可以将项目的输出路径更改为另一个文件夹。例如,在解决方案的根目录下创建一个“bin”文件夹,以及“debug”、“release”和“test”子文件夹。
然后,将您的项目配置为在根目录下输出其二进制文件,具体取决于它们的类型和配置(常规项目到 bin\debug|release ;测试项目到 bin\test,无论调试还是发布)。
您可能不想像这样配置“每个新创建的测试项目”,但实际上,一旦您的解决方案变得更加稳定,您将创建多少个新项目?

为您的项目配置路径是一项常见的 devops/持续集成任务。不要自欺欺人,不要过于聪明,也不要假设你的构建脚本在任何情况下都应该在任何地方运行。当您的项目具有任何类型的复杂性(依赖于外部依赖项)时,您将必须定义构建要求,例如“安装了这个和那个”,那么为什么不“从磁盘根目录深处拥有最多 2 或 3 个文件夹”? .

【讨论】:

  • 感谢您的反馈,我考虑了很多事情。但是对于这种特殊情况,我通过使用 RoboCopy 列出超过 260 个字符的文件路径找到了解决方法。当我有更多时间(或我可以委托的人)时,我可以在我们的 CI 服务器和设置上研究更根本的变化。谢谢
猜你喜欢
  • 2015-11-20
  • 1970-01-01
  • 2017-10-19
  • 2020-08-13
  • 2020-12-14
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多