Getting started with xUnit.net (.NET Core / ASP.NET Core) 页面介绍了如何使用dotnet test
命令行运行测试。
它声明它需要一个特定的 project.json ,我们在其中添加xunit依赖项和测试运行器:
"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 ≡]>
问题:有没有办法用一个dotnet test
运行所有测试(多个 project.json )?
答案 0 :(得分:9)
如果有人在寻找Windows答案,那么PowerShell中的oneliner可以完成这项工作:
dir test | % { dotnet test $_.FullName }
答案 1 :(得分:6)
由于它差不多一个月而且没有答案,我至少可以分享我一直在做的事情。 (一旦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中的%用于变量,因此第三个%转义它。
答案 2 :(得分:3)
来自Serilog的家伙有一个在CI管道中构建多个测试项目的示例。查看此powershell脚本https://github.com/serilog/serilog/blob/dev/Build.ps1#L44
答案 3 :(得分:2)
感谢Andrzej Lichnerowicz获取初始指针。我一直在尝试与AppVeyor集成,虽然此修复程序执行了所有测试程序集,但如果任何测试失败,构建将不再中断。
进入下一级别,我创建了一个PowerShell宏,导入到appveyor build ...
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整理所有测试结果,如果任何测试失败,构建将再次失败。
答案 4 :(得分:1)
对于跨平台解决方案,您可以将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
答案 5 :(得分:1)
鉴于CLI团队最近对github issue regarding the project search algorithm的最新反馈意见,看起来根本无法通过命令行实现这一点:
......虽然团队决定朝着不同的方向前进。具体来说,我们决定让所有命令都需要一个确定闭包的根工件的路径。
但是,如果您正在使用TFS构建,则dotnet
构建步骤(当前为“预览”)中存在一个名为“Project(s)”的选项,该选项接受通配符,因此您可以使用以下在所有dotnet中运行所有测试的设置;
Command: 'test'
Projects: '**/project.json'
请注意,** / project.json将尝试在所有项目中执行测试,即使它们没有定义testrunner
,这可能会导致构建失败。