【问题标题】:.NET Core 1.0 - How to run "All tests in Solution" with xUnit command line.NET Core 1.0 - 如何使用 xUnit 命令行运行“解决方案中的所有测试”
【发布时间】:2016-09-16 08:12:44
【问题描述】:

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

【问题讨论】:

  • 我认为没有。 dotnet 驱动程序需要更聪明。这就是为什么他们会为 .NET Core 构建系统切换回 msbuild 的原因之一。
  • 对于 Core 2.1,您可以使用 dotnet vstest。见stackoverflow.com/questions/47632734/…

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


【解决方案1】:

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

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

【讨论】:

  • 这个在 VSTS 上成功了,而本地的老派脚本总是能胜任!
【解决方案2】:

由于已经快一个月了,还没有答案,我至少会分享一下我一直在做的事情。 (一旦 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 中的 % 用于变量,因此第三个 % 对其进行转义。

【讨论】:

  • 做一些与@Bruno 非常相似的事情,但添加了更多帮助。在我的项目根目录 dotnet publish 之后,在我的 CI 作业中将此作为 powershell 脚本运行,多个单元测试项目位于 /test$dir = dir -dir test foreach($d in $dir){ dotnet test test\$d --no-build -xml ../TEST-$d.xml }
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      对于跨平台解决方案,您可以将 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
      

      【讨论】:

        【解决方案6】:

        鉴于 CLI 团队对最近 github issue regarding the project search algorithm 的最新反馈,这看起来根本不可能通过命令行实现:

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

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

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

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

        【讨论】:

        • 这正是我想要达到的目标,但测试结果看起来很奇怪
        • 测试结果“看起来很奇怪”?你能详细说明一下吗?我有这种方法在 VSTS 中工作,到目前为止还没有任何问题。
        猜你喜欢
        • 2011-04-27
        • 1970-01-01
        • 1970-01-01
        • 2017-08-24
        • 2020-11-05
        • 1970-01-01
        • 2013-03-27
        • 1970-01-01
        相关资源
        最近更新 更多