问题
The Getting started with xUnit.net (.NET Core / ASP.NET Core) page describes how to run tests with dotnet test
command line.
It states that it requires a specific project.json, where we add xunit dependencies and test runner:
"testRunner": "xunit",
"dependencies": {
"xunit": "2.1.0",
"dotnet-test-xunit": "1.0.0-rc2-build10015"
}
If I try calling it from the parent directory:
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 ≡]>
Question: Is there a way to run all tests (multiple project.json) with a single dotnet test
?
回答1:
In case anyone looks for a Windows answer, here's oneliner in PowerShell that does the job:
dir test | % { dotnet test $_.FullName }
回答2:
Since it's been almost a month and no answer, I'll at least share what I've been doing. (this won't be relevant once Visual Studio "15" RTM is launched because project.json is dead)
Simply using a for
loop on all project.json:
Locally, from the test directory, I just run:
for /f %a in ('dir /b /s project.json ^| find /v "TestUtilities"') do dotnet test %a
Running it on all project.json except where the path has: TestUtilities
Mind that on TeamCity you need to escape % (and in scripts you need double: %%) so it goes by:
for /f %%%a in ('dir /b /s project.json ^| find /v "TestUtilities"') do dotnet test %%%a
Note the %%%. Since % in TeamCity is used for variables, the third % escapes it.
回答3:
Guys from 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
回答4:
Thanks Andrzej Lichnerowicz for initial pointer. I've been trying to integrate with AppVeyor and while this fix executed all test assemblies the build would no longer break if any tests failed.
Taking to next level I created a powershell macro, imported in to the 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
...and then executed the following macro:
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 collates all the test results and the build once again fails if any tests failed.
回答5:
For a cross-platform solution, you can use Node and NPM with the foreach-cli
package. If you don't have a package.json
in the root folder, do npm init
, then:
npm install foreach-cli -D
In package.json
:
"scripts : {
...
"test": "foreach -g 'test/**/project.json' -x 'cd #{dir} && dotnet test'"
}
To run tests:
npm test
回答6:
It doesn't look like this will be possible at all via the commandline, given the latest feedback from the CLI team on a recent 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.
However, if you're using TFS builds there does exist an option in the dotnet
build step (currently 'Preview') called "Project(s)", which accepts wildcards, so you can use the following settings to run all tests in all dotnet;
Command: 'test'
Projects: '**/project.json'
Beware however, **/project.json will attempt to execute tests in all projects even if they don't have a testrunner
defined, which may cause the build to fail.
来源:https://stackoverflow.com/questions/37323364/net-core-1-0-how-to-run-all-tests-in-solution-with-xunit-command-line