.NET Core 1.0 - 如何使用 xUnit 命令行 运行 "All tests in Solution"
.NET Core 1.0 - How to run "All tests in Solution" with xUnit command line
Getting started with xUnit.net (.NET Core / ASP.NET Core) 页面介绍了如何使用 dotnet test
命令行 运行 进行测试。
它声明它需要一个特定的project.json,这里我们添加xunit依赖并测试运行ner:
"testRunner": "xunit",
"dependencies": {
"xunit": "2.1.0",
"dotnet-test-xunit": "1.0.0-rc2-build10015"
}
如果我尝试从父目录调用它:
C:\git\Project\test [master ≡]> dotnet test
dotnet-test Error: 0 : System.InvalidOperationException: C:\git\Project\test\project.json does not exist.
at Microsoft.DotNet.Tools.Test.TestCommand.GetProjectPath(String projectPath)
at Microsoft.DotNet.Tools.Test.TestCommand.DoRun(String[] args)
C:\git\Project\test [master ≡]>
问题:有没有办法 运行 所有测试(多个 project.json)与单个 dotnet test
?
既然快一个月了还没有回复,我至少会分享一下我一直在做的事情。 (一旦 Visual Studio“15”RTM 启动,这将不再相关,因为 project.json is dead)
对所有 project.json:
简单地使用 for
循环
在本地,从 test 目录,我只是 运行:
for /f %a in ('dir /b /s project.json ^| find /v "TestUtilities"') do dotnet test %a
运行 它在所有 project.json 上,除非路径有:TestUtilities
请注意,在 TeamCity 上,您需要转义 %(在脚本中,您需要加倍:%%),所以它通过:
for /f %%%a in ('dir /b /s project.json ^| find /v "TestUtilities"') do dotnet test %%%a
记下 %%%。由于 TeamCity 中的 % 用于变量,因此第三个 % 将其转义。
对于跨平台解决方案,您可以将 Node 和 NPM 与 foreach-cli
包一起使用。如果根文件夹中没有 package.json
,请执行 npm init
,然后:
npm install foreach-cli -D
在package.json
中:
"scripts : {
...
"test": "foreach -g 'test/**/project.json' -x 'cd #{dir} && dotnet test'"
}
运行 个测试:
npm test
万一有人寻找 Windows 答案,PowerShell 中的 oneliner 可以完成这项工作:
dir test | % { dotnet test $_.FullName }
感谢 Andrzej Lichnerowicz 的初始指示。我一直在尝试与 AppVeyor 集成,虽然此修复程序执行了所有测试程序集,但如果任何测试失败,构建将不再中断。
更进一步,我创建了一个 powershell 宏,导入到应用程序构建中...
version: 1.0.{build}
install:
- ps: Import-Module .\Appveyor.psm1
before_build:
- ps: dotnet restore
build:
verbosity: minimal
test_script:
- ps: Invoke-AppVeyorTest
...然后执行下面的宏:
function Invoke-AppVeyorTest
{
[CmdletBinding()]
param()
$result = "true"
Get-ChildItem NetCoreXunit* -Recurse -Directory | % {
$test_path = $_.FullName
$output = & dotnet test $test_path
if ($output -Match ", Failed: 0, ")
{
Write-Output "All tests passed in $test_path"
}
else
{
Write-Output "Located failed tests in $test_path"
$result = "false"
}
}
if ($result -eq "false")
{
$host.ui.WriteErrorLine("Failed tests detected.")
exit 1
}
}
Appveyor 整理所有测试结果,如果任何测试失败,构建将再次失败。
根据 CLI 团队对最近 github issue regarding the project search algorithm:
的最新反馈,这看起来根本不可能通过命令行实现
...though the team decided to move in a different direction. Specifically, we decided to have all of the commands require a path to a root artifact from which a closure is determined.
但是,如果您使用的是 TFS 构建,dotnet
构建步骤(当前 'Preview')中确实存在一个名为 "Project(s)" 的选项,它接受通配符,因此您可以使用以下设置 运行 所有 dotnet 中的所有测试;
Command: 'test'
Projects: '**/project.json'
但是请注意,**/project.json 将尝试在所有项目中执行测试,即使它们没有定义 testrunner
,这可能会导致构建失败。
来自 Serilog have an example of building multiple test projects in their CI pipeline . Check out this powershell script https://github.com/serilog/serilog/blob/dev/Build.ps1#L44
的人
Getting started with xUnit.net (.NET Core / ASP.NET Core) 页面介绍了如何使用 dotnet test
命令行 运行 进行测试。
它声明它需要一个特定的project.json,这里我们添加xunit依赖并测试运行ner:
"testRunner": "xunit",
"dependencies": {
"xunit": "2.1.0",
"dotnet-test-xunit": "1.0.0-rc2-build10015"
}
如果我尝试从父目录调用它:
C:\git\Project\test [master ≡]> dotnet test
dotnet-test Error: 0 : System.InvalidOperationException: C:\git\Project\test\project.json does not exist.
at Microsoft.DotNet.Tools.Test.TestCommand.GetProjectPath(String projectPath)
at Microsoft.DotNet.Tools.Test.TestCommand.DoRun(String[] args)
C:\git\Project\test [master ≡]>
问题:有没有办法 运行 所有测试(多个 project.json)与单个 dotnet test
?
既然快一个月了还没有回复,我至少会分享一下我一直在做的事情。 (一旦 Visual Studio“15”RTM 启动,这将不再相关,因为 project.json is dead)
对所有 project.json:
简单地使用for
循环
在本地,从 test 目录,我只是 运行:
for /f %a in ('dir /b /s project.json ^| find /v "TestUtilities"') do dotnet test %a
运行 它在所有 project.json 上,除非路径有:TestUtilities
请注意,在 TeamCity 上,您需要转义 %(在脚本中,您需要加倍:%%),所以它通过:
for /f %%%a in ('dir /b /s project.json ^| find /v "TestUtilities"') do dotnet test %%%a
记下 %%%。由于 TeamCity 中的 % 用于变量,因此第三个 % 将其转义。
对于跨平台解决方案,您可以将 Node 和 NPM 与 foreach-cli
包一起使用。如果根文件夹中没有 package.json
,请执行 npm init
,然后:
npm install foreach-cli -D
在package.json
中:
"scripts : {
...
"test": "foreach -g 'test/**/project.json' -x 'cd #{dir} && dotnet test'"
}
运行 个测试:
npm test
万一有人寻找 Windows 答案,PowerShell 中的 oneliner 可以完成这项工作:
dir test | % { dotnet test $_.FullName }
感谢 Andrzej Lichnerowicz 的初始指示。我一直在尝试与 AppVeyor 集成,虽然此修复程序执行了所有测试程序集,但如果任何测试失败,构建将不再中断。
更进一步,我创建了一个 powershell 宏,导入到应用程序构建中...
version: 1.0.{build}
install:
- ps: Import-Module .\Appveyor.psm1
before_build:
- ps: dotnet restore
build:
verbosity: minimal
test_script:
- ps: Invoke-AppVeyorTest
...然后执行下面的宏:
function Invoke-AppVeyorTest
{
[CmdletBinding()]
param()
$result = "true"
Get-ChildItem NetCoreXunit* -Recurse -Directory | % {
$test_path = $_.FullName
$output = & dotnet test $test_path
if ($output -Match ", Failed: 0, ")
{
Write-Output "All tests passed in $test_path"
}
else
{
Write-Output "Located failed tests in $test_path"
$result = "false"
}
}
if ($result -eq "false")
{
$host.ui.WriteErrorLine("Failed tests detected.")
exit 1
}
}
Appveyor 整理所有测试结果,如果任何测试失败,构建将再次失败。
根据 CLI 团队对最近 github issue regarding the project search algorithm:
的最新反馈,这看起来根本不可能通过命令行实现...though the team decided to move in a different direction. Specifically, we decided to have all of the commands require a path to a root artifact from which a closure is determined.
但是,如果您使用的是 TFS 构建,dotnet
构建步骤(当前 'Preview')中确实存在一个名为 "Project(s)" 的选项,它接受通配符,因此您可以使用以下设置 运行 所有 dotnet 中的所有测试;
Command: 'test'
Projects: '**/project.json'
但是请注意,**/project.json 将尝试在所有项目中执行测试,即使它们没有定义 testrunner
,这可能会导致构建失败。
来自 Serilog have an example of building multiple test projects in their CI pipeline . Check out this powershell script https://github.com/serilog/serilog/blob/dev/Build.ps1#L44
的人