wake-up-neo.com

.NET Core 1.0 - Ausführen von "Alle Tests in Lösung" mit xUnit-Befehlszeile

Die SeiteErste Schritte mit xUnit.net (.NET Core/ASP.NET Core)beschreibt, wie Tests mit der dotnet test-Befehlszeile ausgeführt werden. 

Es besagt, dass es ein spezifisches project.json erfordert, in dem wir Xunit-Abhängigkeiten hinzufügen und den Runner testen:

  "testRunner": "xunit",
    "dependencies": {
        "xunit": "2.1.0",
        "dotnet-test-xunit": "1.0.0-rc2-build10015"
    }

Wenn ich versuche, es aus dem übergeordneten Verzeichnis aufzurufen:

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

Frage: Gibt es eine Möglichkeit, alle Tests (multiple project.json ) mit einem einzigen dotnet test auszuführen?

14
Bruno Garcia

Da es fast einen Monat her ist und keine Antwort vorliegt, werde ich wenigstens mitteilen, was ich getan habe. (Dies ist nicht relevant, sobald Visual Studio "15" RTM gestartet wird, da project.json tot ist ).

Verwenden Sie einfach eine for-Schleife für alle project.json:

Lokal aus dem Verzeichnis test starte ich gerade:

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

Ausführen auf allen project.json, außer wenn der Pfad Folgendes enthält: TestUtilities

Beachten Sie, dass Sie auf TeamCity Sie müssen Escape-Zeichen (und in Skripts benötigen Sie doppelt: %%), so dass es von:

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

Beachten Sie das %%%. Da% in TeamCity für Variablen verwendet wird, kann das dritte% nicht verwendet werden.

6
Bruno Garcia

Für den Fall, dass jemand nach einer Windows-Antwort sucht, finden Sie in PowerShell einen Online-Server, der die Aufgabe erfüllt:

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

Jungs von Serilog haben ein Beispiel für das Erstellen mehrerer Testprojekte in ihrer CI-Pipeline. Schauen Sie sich dieses Powershell-Skript an https://github.com/serilog/serilog/blob/dev/Build.ps1#L44

3
Artur Karbone

Danke Andrzej Lichnerowicz für den ersten Zeiger. Ich habe versucht, AppVeyor zu integrieren, und während dieser Fix alle Testassemblys ausführte, konnte der Build nicht mehr abgebrochen werden, wenn Tests fehlschlugen.

Mit dem nächsten Level habe ich ein Powershell-Makro erstellt, das in den Appveyor-Build importiert wurde ...

version: 1.0.{build}
install:
  - ps: Import-Module .\Appveyor.psm1
before_build:
- ps: dotnet restore
build:
  verbosity: minimal
test_script: 
- ps: Invoke-AppVeyorTest 

... und dann das folgende Makro ausgeführt:

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 stellt alle Testergebnisse zusammen und der Build schlägt erneut fehl, wenn Tests fehlgeschlagen sind.

2
9swampy

Es sieht nicht so aus, als wäre dies über die Kommandozeile überhaupt möglich, wenn man das letzte Feedback des CLI-Teams zu einem aktuellen github-Problem bezüglich des Projektsuchalgorithmus :

... obwohl das Team beschlossen hat, sich in eine andere Richtung zu bewegen. Insbesondere entschieden wir uns dafür, dass alle Befehle einen Pfad zu einem Wurzelartefakt benötigen, aus dem eine Schließung bestimmt wird.

Wenn Sie jedoch TFS-Builds verwenden, gibt es im dotnet-Build-Schritt (derzeit 'Vorschau') eine Option mit dem Namen "Project (s)", mit der Platzhalterzeichen akzeptiert werden. Mit den folgenden Einstellungen können Sie alle Tests ausführen Punkt net;

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

Beachten Sie jedoch, dass **/project.json versucht, Tests in allen Projekten auszuführen, auch wenn keine testrunner definiert ist. Dies kann dazu führen, dass der Build fehlschlägt.

1
Squiggle

Für eine plattformübergreifende Lösung können Sie Node und NPM mit dem Paket foreach-cli verwenden. Wenn Sie keinen package.json im Stammordner haben, führen Sie npm init aus.

npm install foreach-cli -D

In package.json:

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

Tests ausführen: 

npm test
1
Geir Sagberg