web-dev-qa-db-ja.com

.NET Core1.0-xUnitコマンドラインで「ソリューション内のすべてのテスト」を実行する方法

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)を実行する方法はありますか?

14
Bruno Garcia

ほぼ1か月が経ち、答えがないので、少なくとも私が行ってきたことを共有します。 (これは、Visual Studio "15" RTMが起動されると、 project.jsonが停止している )は関係ありません)

すべてのproject.jsonでforループを使用するだけです。

ローカルでは、testディレクトリから、次のコマンドを実行します。

for /f %a in ('dir /b /s project.json ^| find /v "TestUtilities"') do dotnet test %a

パスに次の場所がある場合を除いて、すべてのproject.jsonで実行します:TestUtilities

TeamCityでは、%をエスケープする必要があることに注意してください(スクリプトでは、double:%%が必要です)。

for /f %%%a in ('dir /b /s project.json ^| find /v "TestUtilities"') do dotnet test %%%a

%%%に注意してください。 TeamCityの%は変数に使用されるため、3番目の%はそれをエスケープします。

6
Bruno Garcia

誰かがWindowsの答えを探している場合に備えて、PowerShellのワンライナーがその仕事をします。

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

Serilog の人たちは、CIパイプラインで複数のテストプロジェクトを構築する例を持っています。このPowerShellスクリプトを確認してください https://github.com/serilog/serilog/blob/dev/Build.ps1#L44

3
Artur Karbone

ありがとう 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はすべてのテスト結果を照合し、テストが失敗した場合はビルドが再度失敗します。

2
9swampy

最近の プロジェクト検索アルゴリズムに関するgithubの問題 に関するCLIチームからの最新のフィードバックを考えると、これがコマンドラインを介してまったく可能になるとは思えません。

...チームは別の方向に進むことにしましたが。具体的には、すべてのコマンドに、クロージャが決定されるルートアーティファクトへのパスが必要になるようにすることにしました。

ただし、TFSビルドを使用している場合は、dotnetビルドステップ(現在は「プレビュー」)に「プロジェクト」と呼ばれるオプションがあり、ワイルドカードを受け入れるため、次の設定を使用してすべてのdotnetですべてのテストを実行します。

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

ただし、**/project.jsonは、testrunnerが定義されていない場合でも、すべてのプロジェクトでテストを実行しようとするため、ビルドが失敗する可能性があることに注意してください。

1
Squiggle

クロスプラットフォームソリューションの場合、Nodeおよびforeach-cliパッケージでNPMを使用できます。ルートフォルダーに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
1
Geir Sagberg