.NET Core 1.0 - 如何运行"解决方案中的所有测试"使用xUnit命令行

时间:2016-05-19 12:33:29

标签: asp.net-core xunit .net-core dotnet-cli .net-core-rc2

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 )?

6 个答案:

答案 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,这可能会导致构建失败。