14

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 ≡]>

问题:有没有办法用一个来运行所有测试(多个project.jsondotnet test

4

6 回答 6

9

如果有人在寻找 Windows 答案,可以使用 PowerShell 中的 oneliner 来完成这项工作:

dir test | % { dotnet test $_.FullName }

于 2016-10-05T13:58:24.450 回答
6

由于已经快一个月没有答案了,我至少会分享一下我一直在做的事情。(一旦 Visual Studio “15” RTM 启动,这将不再相关,因为project.json 已死

只需在所有 project.json 上使用for循环:

在本地,从测试目录,我只是运行:

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 中的 % 用于变量,因此第三个 % 对其进行了转义。

于 2016-06-03T15:45:04.767 回答
3

Serilog的有一个在他们的 CI 管道中构建多个测试项目的例子。查看这个 powershell 脚本https://github.com/serilog/serilog/blob/dev/Build.ps1#L44

于 2016-12-12T12:11:05.530 回答
2

感谢Andrzej Lichnerowicz的初始指针。我一直在尝试与 AppVeyor 集成,虽然此修复程序执行了所有测试程序集,但如果任何测试失败,构建将不再中断。

进入下一个级别,我创建了一个 powershell 宏,导入到 appveyor 构建中......

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 整理所有测试结果,如果任何测试失败,则构建再次失败。

于 2016-10-30T16:50:09.883 回答
1

对于跨平台解决方案,您可以将 Node 和 NPM 与foreach-cli包一起使用。package.json如果根文件夹中没有 a ,请执行npm init,然后:

npm install foreach-cli -D

package.json

"scripts : {
  ...
  "test": "foreach -g 'test/**/project.json' -x 'cd #{dir} && dotnet test'"
}

运行测试:

npm test
于 2016-07-19T19:19:59.910 回答
1

鉴于 CLI 团队对最近关于项目搜索算法的 github 问题的最新反馈,这看起来根本不可能通过命令行实现:

...尽管团队决定朝不同的方向前进。具体来说,我们决定让所有命令都需要一个指向根工件的路径,从该路径确定闭包。

但是,如果您使用的是 TFS 构建,则在dotnet构建步骤(当前为“预览”)中确实存在一个名为“Project(s)”的选项,它接受通配符,因此您可以使用以下设置在所有 dotnet 中运行所有测试;

Command: 'test' Projects: '**/project.json'

但是请注意,**/project.json 将尝试在所有项目中执行测试,即使它们没有testrunner定义,这可能会导致构建失败。

于 2016-11-03T09:16:00.377 回答