.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

的人