Powershell 将多个测试 dll 传递给 vstest.console.exe

Powershell pass multiple test dlls to vstest.console.exe

https://docs.microsoft.com/en-us/visualstudio/test/vstest-console-options?view=vs-2019#general-command-line-options

我可以通过传递由 space 分隔的文件名来成功 运行 单元测试。 例如

>vstest.console.exe a.dll b.dll 

但是当我使用 PS 脚本做类似

的事情时
> $TestDlls = Get-ChildItem -Path "Folder" -Filter "Test.*.dll" -Recurse -File
> $JoinedPath = $TestDlls -join " " #Try to join the paths by ' ' ??? Is it a wrong command?
> vstest.console.exe $JoinedPath

我得到了一些意想不到的东西...

因为 $JoinedPath 是一个带有引号的字符串,例如 "a.dll b.dll"

因此 vstest.console.exe 将始终收到单个“a.dll”(vstest.console.exe “a.dll b.dll”)

我不知道如何准确表达我的问题...

总之我想用powershell模拟命令

vstest.console.exe a.dll b.dll

没有

vstest.console.exe "a.dll b.dll"

我是 PowerShell 的新手,不知道是否可行。

您可以使用数组来帮助您处理命令行实用程序的参数,尤其是当您需要开始指定参数名称时。

$TestDlls = Get-ChildItem -Path $Folder -Filter "Test.*.dll" -Recurse  # -File is not needed unless you have folders also named Test.*.dll
$VSTestArgs = @()
foreach ($TestDll in $TestDlls) {
    $VSTestArgs = $VSTestArgs + $TestDll.FullName
}
& vstest.console.exe $VSTestArgs  # & is the call operator.

Call Operator

如果您必须添加其他参数,可以在 foreach 块之后添加它们。

$TestDlls = Get-ChildItem -Path $Folder -Filter "Test.*.dll" -Recurse  # -File is not needed unless you have folders also named Test.*.dll
$VSTestArgs = @()
foreach ($TestDll in $TestDlls) {
    $VSTestArgs = $VSTestArgs + $TestDll.FullName
}
$VSTestArgs = $VSTestArgs + "/Settings:local.runsettings"
$VSTestArgs = $VSTestArgs + "/Tests:TestMethod1,testMethod2"
$VSTestArgs = $VSTestArgs + "/EnableCodeCoverage"
& vstest.console.exe $VSTestArgs

如果参数与参数是分开的(此实用程序似乎不是这种情况),您可以像这样将参数和参数添加在一起。

$dotnetArgs = @()
$dotnetArgs = "new"
$dotnetArgs = "classlib"
$dotnetArgs = $dotnetArgs + "--output" + "TestLib"
$dotnetArgs = $dotnetArgs + "--name" + "TestLib"
$dotnetArgs = $dotnetArgs + "--language" + "C#"
& dotnet $dotnetArgs