.NET Core 1.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 ≡]>

Вопрос: Есть ли способ запустить все тесты (multiple project.json) с помощью одного dotnet test?

Ответы

Ответ 1

Поскольку это был почти месяц и ответа, я по крайней мере делюсь тем, что делаю. (это не будет иметь значения после запуска Visual Studio "15" RTM, потому что project.json мертв)

Просто используя цикл for для всех project.json:

Локально, из тестового каталога я просто запускаю:

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

В случае, если кто-либо ищет ответ Windows, здесь oneliner в PowerShell выполняет эту работу:

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

Ответ 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 относительно алгоритм поиска проектов:

... хотя команда решила двигаться в другом направлении. В частности, мы решили, что для всех команд требуется путь к корневому артефакту, из которого определяется замыкание.

Однако, если вы используете сборки TFS, существует опция на этапе сборки dotnet (в настоящее время "Preview" ), называемая "Project (s)", которая принимает подстановочные знаки, поэтому вы можете использовать следующие настройки для запускать все тесты во всех точках;

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

Остерегайтесь, однако, **/project.json попытается выполнить тесты во всех проектах, даже если они не имеют testrunner, которые могут привести к сбою сборки.