FAKE (F# Make) покрытие dotCover в TeamCity

У меня есть сценарий сборки FAKE, который содержит шаг покрытия DotCover с использованием расширения DotCoverNUnit3:

let filters = ""

!! (buildDir @@ "/*.UnitTests.dll")
    |> DotCoverNUnit3 (fun p -> 
        { p with
            Output = artifactsDir @@ "NUnitDotCover.snapshot"
            Filters = filters }) nunitOptions

Снимок создается правильно, но обзор покрытия не отображается в сборке TeamCity.

Затем я попытался вызвать DotCoverReport после создания моментального снимка:

DotCoverReport (fun p -> 
    { p with 
        Source = artifactsDir @@ "NUnitDotCover.snapshot"
        Output = artifactsDir @@ "NUnitDotCover.xml"
        ReportType = DotCoverReportType.Xml }) true

Это создает ожидаемый отчет XML, но опять же, обзор покрытия не отображается на странице обзора сборки.

В качестве примечания: я не уверен, что такое логический параметр в конце метода DotCoverReport, не могу найти ссылку на него в документах FAKE. Я попытался изменить значение, но это не имело значения.

Кто-нибудь знает, как заставить TeamCity получить отчет DotCover?


person Dan Ellis    schedule 13.07.2016    source источник
comment
Отсюда github.com/fsharp/FAKE/blob/ master/src/app/FakeLib/DotCover.fs, я вижу, что логическое значение заключается в том, следует ли завершать сборку в целом в случае сбоя задачи. У параметра нет имени, потому что DotCoverReport возвращает каррированную функцию. Вероятно, он должен явно получать и передавать именованный параметр вместо документации.   -  person TheQuickBrownFox    schedule 13.07.2016
comment
Ах, я вижу, я думаю, так что bool - это параметр failBuild для buildParamsAndExecute   -  person Dan Ellis    schedule 13.07.2016


Ответы (1)


Нашел решение.

Изучив множество уровней документации TeamCity, я нашел эту страницу: https://confluence.jetbrains.com/display/TCD9/Manually+Configuring+Reporting+Coverage

В котором описывается использование служебных сообщений, чтобы указать TeamCity в направлении моментального снимка.

Итак, в итоге мне не нужен был DotCoverReport, только снимок:

Для dotCover необходимо отправить пути к файлу моментального снимка, созданному командой покрытия dotCover.exe.

Это моя результирующая цель:

let artifactsDir = environVarOrDefault "ARTIFACT_DIR" (currentDirectory @@ "artifacts")

let nunitOptions nUnit3Defaults =
{ NUnit3Defaults with
    TimeOut = TimeSpan.MaxValue
    WorkingDir  = artifactsDir }

Target "TestCoverage" (fun _ ->
    let filters = ""

    !! (buildDir @@ "/*.UnitTests.dll")
        |> DotCoverNUnit3 (fun p -> 
            { p with
                Output = artifactsDir @@ "NUnitDotCover.snapshot"
                Filters = filters }) nunitOptions

    tracefn "##teamcity[importData type='dotNetCoverage' tool='dotcover' path='%s']" (artifactsDir @@ "NUnitDotCover.snapshot") 
)
person Dan Ellis    schedule 13.07.2016
comment
Привет, я пытался использовать это, но это дает ошибку, которая `nunitOptions не определена` - person ; 24.03.2017
comment
@johnfernandes Я думаю, что Дэн-Эллис, должно быть, объявил nunitOptions во внешней области. Если у вас нет параметров для установки, вы можете просто заменить nunitOptions на id - person Joachim Chapman; 28.03.2017
comment
@joachim-chapman правильно, @johnfernandes Я обновил свой ответ кодом, который определяет nunitOptions - person Dan Ellis; 29.03.2017
comment
что такое path='%s' здесь? - person KMittal; 05.04.2017
comment
@KMittal path='%s' является частью строки формата, предоставляемой tracefn, %s заменяется путем к файлу моментального снимка, который является вторым аргументом вызова функции tracefn. Думайте об этом как о замене строки, где мы заменяем %s путем к файлу моментального снимка, tracefn выполняет замену строки, а затем записывает полученную строку в командную строку. - person Dan Ellis; 06.04.2017