@@ -123,6 +123,32 @@ let buildscript () =
123123
124124 " FSharp.Data.sln" |> DotNet.test setParams)
125125
126+ // --------------------------------------------------------------------------------------
127+ // Run tests with code coverage (uses Coverlet collector already present in test projects)
128+
129+ Target.create " Coverage" ( fun _ ->
130+ let setParams ( o : DotNet.TestOptions ) =
131+ { o with
132+ Configuration = DotNet.BuildConfiguration.Release
133+ Collect = Some " XPlat Code Coverage"
134+ ResultsDirectory = Some " coverage-results"
135+ MSBuildParams =
136+ { o.MSBuildParams with
137+ DisableInternalBinLog = true }
138+ Logger = if isCI then Some " GitHubActions" else None }
139+
140+ " FSharp.Data.sln" |> DotNet.test setParams
141+
142+ Trace.log " "
143+ Trace.log " Coverage results written to ./coverage-results/"
144+ Trace.log " To generate an HTML report, install dotnet-reportgenerator-globaltool:"
145+ Trace.log " dotnet tool install -g dotnet-reportgenerator-globaltool"
146+
147+ Trace.log
148+ " reportgenerator -reports:coverage-results/**/coverage.cobertura.xml -targetdir:coverage-report -reporttypes:Html"
149+
150+ Trace.log " " )
151+
126152 // --------------------------------------------------------------------------------------
127153 // Build packages
128154
@@ -179,6 +205,7 @@ let buildscript () =
179205 printfn " Targets for building:"
180206 printfn " * Build"
181207 printfn " * RunTests"
208+ printfn " * Coverage (run tests with Coverlet code coverage; results in ./coverage-results/)"
182209 printfn " * GenerateDocs"
183210 printfn " * Pack (creates package only, doesn't publish)"
184211 printfn " * All (calls previous 5)"
@@ -247,6 +274,7 @@ let buildscript () =
247274 " Build" ==> " Pack" ==> " All"
248275 " Build" ==> " All"
249276 " Build" ==> " RunTests" ==> " All"
277+ " Build" ==> " Coverage"
250278 " Build" ==> " RunBenchmarks"
251279
252280[<EntryPoint>]
0 commit comments