VSTest只运行一种类型的测试

时间:2015-06-25 08:24:40

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

一般目标

我正在尝试创建一个PowerShell脚本,该脚本将在整个解决方案中运行所有测试,无头(通过命令行)用于CI目的。我们有UnitTests和IntegrationTests,它们应该能够单独运行。

解决方案结构

该解决方案是Visual Studio 2013解决方案(使用专业版)。每个项目都有一个或两个单独的项目进行测试。一个项目用于单元测试,另一个项目用于集成测试。我们遵循一个简单的命名约定:

  • 组件:Namespace.ComponentName
  • 单元测试:Namespace.ComponentName.Test
  • Int。 test:Namespace.ComponentName.IntegrationTest

测试工具

我正在使用VSTest.Console.exe来运行测试。

当前失败的解决方案

我正在尝试运行或仅运行单元测试或仅运行集成测试。因此,我们的想法是扫描所有测试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文件或类似的东西。我希望能够说,在解决方案中运行所有测试项目,如果它们是Unit或Integration类型则进行过滤。

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

1 个答案:

答案 0 :(得分:1)

我会尝试几件事。

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

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

为项目配置路径是一项常见的devops /持续集成任务。不要欺骗自己,不要试图过于聪明,也不要假设你的构建脚本在任何情况下都应该运行。当你的项目有任何复杂性(依赖于外部依赖)时,你将不得不定义构建要求,如“有这个和那个已安装”,那么为什么不“从磁盘根目录中获取最多2或3个文件夹”?