diff --git a/Fake.sln b/Fake.sln index 2679c107c88..3741c25e656 100644 --- a/Fake.sln +++ b/Fake.sln @@ -164,6 +164,8 @@ Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Fake.DotNet.Testing.VSTest" EndProject Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Fake.Tools.Rsync", "src\app\Fake.Tools.Rsync\Fake.Tools.Rsync.fsproj", "{26367457-80C0-44C9-9020-56F4013C13E1}" EndProject +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Fake.DotNet.Testing.DotCover", "src\app\Fake.DotNet.Testing.DotCover\Fake.DotNet.Testing.DotCover.fsproj", "{E656E3E2-18D2-4D8E-935C-200DB00E1F19}" +EndProject Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Fake.Tools.Octo", "src\app\Fake.Tools.Octo\Fake.Tools.Octo.fsproj", "{F1641150-B89D-40B7-A3BE-9DC357410FDA}" EndProject Global @@ -1016,6 +1018,18 @@ Global {26367457-80C0-44C9-9020-56F4013C13E1}.Release|x64.Build.0 = Release|Any CPU {26367457-80C0-44C9-9020-56F4013C13E1}.Release|x86.ActiveCfg = Release|Any CPU {26367457-80C0-44C9-9020-56F4013C13E1}.Release|x86.Build.0 = Release|Any CPU + {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Debug|x64.ActiveCfg = Debug|Any CPU + {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Debug|x64.Build.0 = Debug|Any CPU + {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Debug|x86.ActiveCfg = Debug|Any CPU + {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Debug|x86.Build.0 = Debug|Any CPU + {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Release|Any CPU.Build.0 = Release|Any CPU + {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Release|x64.ActiveCfg = Release|Any CPU + {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Release|x64.Build.0 = Release|Any CPU + {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Release|x86.ActiveCfg = Release|Any CPU + {E656E3E2-18D2-4D8E-935C-200DB00E1F19}.Release|x86.Build.0 = Release|Any CPU {F1641150-B89D-40B7-A3BE-9DC357410FDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F1641150-B89D-40B7-A3BE-9DC357410FDA}.Debug|Any CPU.Build.0 = Debug|Any CPU {F1641150-B89D-40B7-A3BE-9DC357410FDA}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -1105,6 +1119,7 @@ Global {3B0A5EE3-6696-4EBA-BCF9-8136C7F17040} = {7BFFAE76-DEE9-417A-A79B-6A6644C4553A} {C4C9D7EE-6A52-42F1-9E04-7C44F0EA8922} = {7BFFAE76-DEE9-417A-A79B-6A6644C4553A} {26367457-80C0-44C9-9020-56F4013C13E1} = {901F162F-8925-4390-89C5-9EE2C343F744} + {E656E3E2-18D2-4D8E-935C-200DB00E1F19} = {7BFFAE76-DEE9-417A-A79B-6A6644C4553A} {F1641150-B89D-40B7-A3BE-9DC357410FDA} = {7BFFAE76-DEE9-417A-A79B-6A6644C4553A} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution diff --git a/build.fsx b/build.fsx index f6fc2898f35..837b61fb5ee 100644 --- a/build.fsx +++ b/build.fsx @@ -259,6 +259,7 @@ let dotnetAssemblyInfos = "Fake.DotNet.Testing.VSTest", "Running vstest test runner" "Fake.DotNet.Testing.NUnit", "Running nunit test runner" "Fake.DotNet.Testing.OpenCover", "Code coverage with OpenCover" + "Fake.DotNet.Testing.DotCover", "Code coverage with DotCover" "Fake.DotNet.Testing.SpecFlow", "BDD with Gherkin and SpecFlow" "Fake.DotNet.Testing.XUnit2", "Running xunit test runner" "Fake.DotNet.Xamarin", "Running Xamarin builds" diff --git a/help/templates/template.cshtml b/help/templates/template.cshtml index c26b6c47fec..0c9217d962a 100644 --- a/help/templates/template.cshtml +++ b/help/templates/template.cshtml @@ -139,6 +139,7 @@
  • Testing - VSTest
  • Testing - SpecFlow
  • Testing - OpenCover
  • +
  • Testing - DotCover
  • NuGet
  • Mage
  • Paket
  • diff --git a/src/app/Fake.DotNet.Testing.DotCover/AssemblyInfo.fs b/src/app/Fake.DotNet.Testing.DotCover/AssemblyInfo.fs new file mode 100644 index 00000000000..3f852cd9fd5 --- /dev/null +++ b/src/app/Fake.DotNet.Testing.DotCover/AssemblyInfo.fs @@ -0,0 +1,17 @@ +// Auto-Generated by FAKE; do not edit +namespace System +open System.Reflection + +[] +[] +[] +[] +[] +do () + +module internal AssemblyVersionInformation = + let [] AssemblyTitle = "FAKE - F# Make Code coverage with DotCover" + let [] AssemblyProduct = "FAKE - F# Make" + let [] AssemblyVersion = "5.0.0" + let [] AssemblyInformationalVersion = "5.0.0-beta025" + let [] AssemblyFileVersion = "5.0.0" diff --git a/src/app/Fake.DotNet.Testing.DotCover/DotCover.fs b/src/app/Fake.DotNet.Testing.DotCover/DotCover.fs new file mode 100644 index 00000000000..7e370fdd519 --- /dev/null +++ b/src/app/Fake.DotNet.Testing.DotCover/DotCover.fs @@ -0,0 +1,331 @@ +/// Contains a task which can be used to run [DotCover](http://www.jetbrains.com/dotcover/) on .NET assemblies. +[] +module Fake.DotNet.Testing.DotCover + +open System +open System.IO +open System.Text +open Fake +open Fake.Core +open Fake.IO.FileSystemOperators +open Fake.IO.Globbing +open Fake.Testing.Common +open Fake.DotNet.Testing.MSTest +open Fake.DotNet.Testing.MSpec +open Fake.DotNet.Testing.NUnit3 +open Fake.DotNet.Testing.XUnit2 + +type ReportType = + | Html = 0 + | Json = 1 + | Xml = 2 + | NDependXml = 3 + +/// The dotCover parameter type for running coverage +type Params = + { ToolPath: string + WorkingDir: string + TargetExecutable: string + TargetArguments: string + TargetWorkingDir: string + Output: string + Filters: string + ErrorLevel: TestRunnerErrorLevel + AttributeFilters: string + CustomParameters: string } + +/// The dotCover default parameters +let internal Defaults = + { ToolPath = Fake.IO.Globbing.Tools.findToolInSubPath "dotCover.exe" ((Path.GetFullPath ".") @@ "tools" @@ "DotCover") + WorkingDir = "" + TargetExecutable = "" + TargetArguments = "" + TargetWorkingDir = "" + Filters = "" + AttributeFilters = "" + Output = "dotCoverSnapshot.dcvr" + CustomParameters = "" + ErrorLevel = ErrorLevel.Error} + +type MergeParams = + { ToolPath: string + WorkingDir: string + Source: string list + Output: string + TempDir: string + CustomParameters: string } + +let internal MergeDefaults = + { ToolPath = Fake.IO.Globbing.Tools.findToolInSubPath "dotCover.exe" ((Path.GetFullPath ".") @@ "tools" @@ "DotCover") + WorkingDir = "" + Source = [] + Output = "dotCoverSnapshot.dcvr" + TempDir = "" + CustomParameters = "" } + +type ReportParams = + { ToolPath: string + WorkingDir: string + Source: string + Output: string + ReportType: ReportType + CustomParameters: string } + +let internal ReportDefaults : ReportParams = + { ToolPath = Fake.IO.Globbing.Tools.findToolInSubPath "dotCover.exe" ((Path.GetFullPath ".") @@ "tools" @@ "DotCover") + WorkingDir = "" + Source = "" + Output = "dotCoverReport.xml" + ReportType = ReportType.Xml + CustomParameters = "" } + +let internal buildArgs parameters = + new StringBuilder() + |> StringBuilder.append "cover" + |> StringBuilder.appendIfNotNullOrEmpty parameters.TargetExecutable "/TargetExecutable=" + |> StringBuilder.appendIfNotNullOrEmpty (parameters.TargetArguments.Trim()) "/TargetArguments=" + |> StringBuilder.appendIfNotNullOrEmpty parameters.TargetWorkingDir "/TargetWorkingDir=" + |> StringBuilder.appendIfNotNullOrEmpty parameters.Filters "/Filters=" + |> StringBuilder.appendIfNotNullOrEmpty parameters.AttributeFilters "/AttributeFilters=" + |> StringBuilder.appendIfNotNullOrEmpty parameters.Output "/Output=" + |> StringBuilder.appendWithoutQuotes parameters.CustomParameters + |> StringBuilder.toText + +let internal buildMergeArgs (parameters:MergeParams) = + new StringBuilder() + |> StringBuilder.append "merge" + |> StringBuilder.appendIfNotNullOrEmpty (parameters.Source |> String.concat ";") "/Source=" + |> StringBuilder.appendIfNotNullOrEmpty parameters.Output "/Output=" + |> StringBuilder.appendIfNotNullOrEmpty parameters.TempDir "/TempDir=" + |> StringBuilder.appendWithoutQuotes parameters.CustomParameters + |> StringBuilder.toText + +let internal buildReportArgs parameters = + new StringBuilder() + |> StringBuilder.append "report" + |> StringBuilder.appendIfNotNullOrEmpty parameters.Source "/Source=" + |> StringBuilder.appendIfNotNullOrEmpty parameters.Output "/Output=" + |> StringBuilder.appendIfNotNullOrEmpty (parameters.ReportType.ToString()) "/ReportType=" + |> StringBuilder.appendWithoutQuotes parameters.CustomParameters + |> StringBuilder.toText + + +let internal getWorkingDir workingDir = + Seq.find String.isNotNullOrEmpty [workingDir; Fake.Core.Environment.environVar("teamcity.build.workingDir"); "."] + |> Path.GetFullPath + +let internal buildParamsAndExecute parameters buildArguments toolPath workingDir failBuild = + let args = buildArguments parameters + Trace.trace (toolPath + " " + args) + let result = Fake.Core.Process.execSimple (fun info -> + {info with + FileName = toolPath + WorkingDirectory = getWorkingDir workingDir + Arguments = args + }) + TimeSpan.MaxValue + let ExitCodeForFailedTests = -3 + if (result = ExitCodeForFailedTests && not failBuild) then + Trace.trace (sprintf "DotCover %s exited with errorcode %d" toolPath result) + else if (result = ExitCodeForFailedTests && failBuild) then + failwithf "Failing tests, use ErrorLevel.DontFailBuild to ignore failing tests. Exited %s with errorcode %d" toolPath result + else if (result <> 0) then + failwithf "Error running %s with exitcode %d" toolPath result + else + Trace.trace (sprintf "DotCover exited successfully") + +/// Runs the dotCover "cover" command, using a target executable (such as NUnit or MSpec) and generates a snapshot file. +/// +/// ## Parameters +/// +/// - `setParams` - Function used to overwrite the dotCover default parameters. +let run (setParams: Params -> Params) = + let parameters = (Defaults |> setParams) + buildParamsAndExecute parameters buildArgs parameters.ToolPath parameters.WorkingDir (parameters.ErrorLevel <> ErrorLevel.DontFailBuild) + +/// Runs the dotCover "merge" command. This combines dotCover snaphots into a single +/// snapshot, enabling you to merge test coverage from multiple test running frameworks +/// ## Parameters +/// +/// - `setParams` - Function used to overwrite the dotCover merge default parameters. +/// +/// ## Sample +/// +/// merge (fun p -> { p with +/// Source = [artifactsDir @@ "NUnitDotCoverSnapshot.dcvr" +/// artifactsDir @@ "MSpecDotCoverSnapshot.dcvr"] +/// Output = artifactsDir @@ "dotCoverSnapshot.dcvr" }) +let merge (setParams: MergeParams -> MergeParams) = + let parameters = (MergeDefaults |> setParams) + buildParamsAndExecute parameters buildMergeArgs parameters.ToolPath parameters.WorkingDir false + +/// Runs the dotCover "report" command. This generates a report from a dotCover snapshot +/// ## Parameters +/// +/// - `setParams` - Function used to overwrite the dotCover report default parameters. +/// +/// ## Sample +/// +/// report (fun p -> { p with +/// Source = artifactsDir @@ "dotCoverSnapshot.dcvr" +/// Output = artifactsDir @@ "dotCoverReport.xml" +/// ReportType = ReportType.Xml }) +let report (setParams: ReportParams -> ReportParams) = + let parameters = (ReportDefaults |> setParams) + buildParamsAndExecute parameters buildReportArgs parameters.ToolPath parameters.WorkingDir + +/// Runs the dotCover "cover" command against the NUnit test runner. +/// ## Parameters +/// +/// - `setDotCoverParams` - Function used to overwrite the dotCover report default parameters. +/// - `setNUnitParams` - Function used to overwrite the NUnit default parameters. +/// +/// ## Sample +/// +/// !! (buildDir @@ buildMode @@ "/*.Unit.Tests.dll") +/// |> runNUnit +/// (fun dotCoverOptions -> { dotCoverOptions with +/// Output = artifactsDir @@ "NUnitDotCoverSnapshot.dcvr" }) +/// (fun nUnitOptions -> { nUnitOptions with +/// DisableShadowCopy = true }) +let runNUnit (setDotCoverParams: Params -> Params) (setNUnitParams: NUnit.Common.NUnitParams -> NUnit.Common.NUnitParams) (assemblies: string seq) = + let assemblies = assemblies |> Seq.toArray + let details = assemblies |> String.separated ", " + use __ = Trace.traceTask "DotCoverNUnit" details + + let parameters = NUnit.Common.NUnitDefaults |> setNUnitParams + let args = NUnit.Common.buildArgs parameters assemblies + + run (fun p -> + {p with + TargetExecutable = parameters.ToolPath @@ parameters.ToolName + TargetArguments = args + } |> setDotCoverParams) + +/// Runs the dotCover "cover" command against the NUnit test runner. +/// ## Parameters +/// +/// - `setDotCoverParams` - Function used to overwrite the dotCover report default parameters. +/// - `setNUnitParams` - Function used to overwrite the NUnit default parameters. +/// +/// ## Sample +/// +/// !! (buildDir @@ buildMode @@ "/*.Unit.Tests.dll") +/// |> runNUnit3 +/// (fun dotCoverOptions -> { dotCoverOptions with +/// Output = artifactsDir @@ "NUnit3DotCoverSnapshot.dcvr" }) +/// (fun nUnit3Options -> { nUnit3Options with +/// DisableShadowCopy = true }) +let runNUnit3 (setDotCoverParams: Params -> Params) (setNUnitParams: NUnit3Params -> NUnit3Params) (assemblies: string seq) = + let assemblies = assemblies |> Seq.toArray + let details = assemblies |> String.separated ", " + use __ = Trace.traceTask "DotCoverNUnit3" details + + let parameters = NUnit3Defaults |> setNUnitParams + let args = NUnit3.buildArgs parameters assemblies + + run (fun p -> + {p with + TargetExecutable = parameters.ToolPath + TargetArguments = args + } |> setDotCoverParams) + +/// Runs the dotCover "cover" command against the XUnit2 test runner. +/// ## Parameters +/// +/// - `setDotCoverParams` - Function used to overwrite the dotCover report default parameters. +/// - `setXUnit2Params` - Function used to overwrite the XUnit2 default parameters. +/// +/// ## Sample +/// +/// !! (buildDir @@ buildMode @@ "/*.Unit.Tests.dll") +/// |> runXUnit2 +/// (fun -> dotCoverOptions ) +/// (fun nUnitOptions -> nUnitOptions) +let runXUnit2 (setDotCoverParams: Params -> Params) (setXUnit2Params: XUnit2.XUnit2Params -> XUnit2.XUnit2Params) (assemblies: string seq) = + let assemblies = assemblies |> Seq.toArray + let details = assemblies |> String.separated ", " + use __ = Trace.traceTask "DotCoverXUnit2" details + + let parameters = XUnit2.XUnit2Defaults |> setXUnit2Params + let args = XUnit2.buildArgs parameters assemblies + + run (fun p -> + {p with + TargetExecutable = parameters.ToolPath + TargetArguments = args + } |> setDotCoverParams) + +/// Builds the command line arguments from the given parameter record and the given assemblies. +/// Runs all test assemblies in the same run for easier coverage management. +/// [omit] +let internal buildMSTestArgsForDotCover parameters assemblies = + let testcontainers = assemblies |> Array.map (fun a -> "/testcontainer:" + a) |> String.concat " " + + let testResultsFile = + if parameters.ResultsDir <> null then + sprintf @"%s\%s.trx" parameters.ResultsDir (DateTime.Now.ToString("yyyyMMdd-HHmmss.ff")) + else null + new StringBuilder() + |> StringBuilder.appendWithoutQuotesIfNotNull testcontainers "" + |> StringBuilder.appendWithoutQuotesIfNotNull parameters.Category "/category:" + |> StringBuilder.appendWithoutQuotesIfNotNull parameters.TestMetadataPath "/testmetadata:" + |> StringBuilder.appendWithoutQuotesIfNotNull parameters.TestSettingsPath "/testsettings:" + |> StringBuilder.appendWithoutQuotesIfNotNull testResultsFile "/resultsfile:" + |> StringBuilder.appendIfTrueWithoutQuotes parameters.NoIsolation "/noisolation" + |> StringBuilder.toText + +/// Runs the dotCover "cover" command against the MSTest test runner. +/// ## Parameters +/// +/// - `setDotCoverParams` - Function used to overwrite the dotCover report default parameters. +/// - `setMSTestParams` - Function used to overwrite the MSTest default parameters. +/// +/// ## Sample +/// +/// !! (buildDir @@ buildMode @@ "/*.Unit.Tests.dll") +/// |> runMSTest +/// (fun -> dotCoverOptions ) +/// (fun MSTestOptions -> MSTestOptions) +let runMSTest (setDotCoverParams: Params -> Params) (setMSTestParams: MSTestParams -> MSTestParams) (assemblies: string seq) = + let assemblies = assemblies |> Seq.toArray + let details = assemblies |> String.separated ", " + use __ = Trace.traceTask "DotCoverMSTest " details + + let parameters = MSTestDefaults |> setMSTestParams + let args = buildMSTestArgsForDotCover parameters assemblies + + run (fun p -> + {p with + TargetExecutable = parameters.ToolPath + TargetArguments = args + } |> setDotCoverParams) + +/// Runs the dotCover "cover" command against the MSpec test runner. +/// ## Parameters +/// +/// - `setDotCoverParams` - Function used to overwrite the dotCover report default parameters. +/// - `setMSpecParams` - Function used to overwrite the MSpec default parameters. +/// +/// ## Sample +/// +/// !! (buildDir @@ buildMode @@ "/*.Unit.Tests.dll") +/// |> runMSpec +/// (fun dotCoverOptions -> { dotCoverOptions with +/// Output = artifactsDir @@ "MSpecDotCoverSnapshot.dcvr" }) +/// (fun mSpecOptions -> { mSpecOptions with +/// Silent = true }) +let runMSpec (setDotCoverParams: Params -> Params) (setMSpecParams: MSpecParams -> MSpecParams) (assemblies: string seq) = + let assemblies = assemblies |> Seq.toArray + let details = assemblies |> String.separated ", " + use __ = Trace.traceTask "DotCoverMSpec" details + + let parameters = MSpecDefaults |> setMSpecParams + + let args = MSpec.buildArgs parameters assemblies + + run (fun p -> + {p with + TargetExecutable = parameters.ToolPath + TargetArguments = args + } |> setDotCoverParams) diff --git a/src/app/Fake.DotNet.Testing.DotCover/Fake.DotNet.Testing.DotCover.fsproj b/src/app/Fake.DotNet.Testing.DotCover/Fake.DotNet.Testing.DotCover.fsproj new file mode 100644 index 00000000000..c4c0a8cf2ef --- /dev/null +++ b/src/app/Fake.DotNet.Testing.DotCover/Fake.DotNet.Testing.DotCover.fsproj @@ -0,0 +1,26 @@ + + + net46;netstandard1.6;netstandard2.0 + $(DefineConstants);NO_DOTNETCORE_BOOTSTRAP + Fake.DotNet.Testing.DotCover + Library + + + $(DefineConstants);NETSTANDARD;USE_HTTPCLIENT + + + $(DefineConstants);RELEASE + + + + + + + + + + + + + + diff --git a/src/app/Fake.DotNet.Testing.DotCover/paket.references b/src/app/Fake.DotNet.Testing.DotCover/paket.references new file mode 100644 index 00000000000..2c8a7ddfd73 --- /dev/null +++ b/src/app/Fake.DotNet.Testing.DotCover/paket.references @@ -0,0 +1,4 @@ +group netcore + +FSharp.Core +NETStandard.Library \ No newline at end of file diff --git a/src/app/Fake.DotNet.Testing.MSTest/MSTest.fs b/src/app/Fake.DotNet.Testing.MSTest/MSTest.fs index 5ad9e26ed1d..daf252c162d 100644 --- a/src/app/Fake.DotNet.Testing.MSTest/MSTest.fs +++ b/src/app/Fake.DotNet.Testing.MSTest/MSTest.fs @@ -69,8 +69,7 @@ let MSTestDefaults = NoIsolation = true } /// Builds the command line arguments from the given parameter record and the given assemblies. -/// [omit] -let internal buildMSTestArgs parameters assembly = +let buildArgs (parameters:MSTestParams) (assembly: string) = let testResultsFile = if parameters.ResultsDir <> null then sprintf @"%s\%s.trx" parameters.ResultsDir (DateTime.Now.ToString("yyyyMMdd-HHmmss.ff")) @@ -111,7 +110,7 @@ let exec (setParams : MSTestParams -> MSTestParams) (assemblies : string seq) = Trace.traceError message failwith message for assembly in assemblies do - let args = buildMSTestArgs parameters assembly + let args = buildArgs parameters assembly Process.execSimple ((fun info -> { info with FileName = parameters.ToolPath diff --git a/src/app/Fake.DotNet.Testing.MSpec/MSpec.fs b/src/app/Fake.DotNet.Testing.MSpec/MSpec.fs index 5c00575c67c..4a907e18feb 100644 --- a/src/app/Fake.DotNet.Testing.MSpec/MSpec.fs +++ b/src/app/Fake.DotNet.Testing.MSpec/MSpec.fs @@ -43,8 +43,7 @@ let MSpecDefaults = ErrorLevel = Error } /// Builds the command line arguments from the given parameter record and the given assemblies. -/// [omit] -let internal buildMSpecArgs parameters assemblies = +let buildArgs (parameters:MSpecParams) (assemblies: string seq) = let html, htmlText = if String.isNotNullOrEmpty parameters.HtmlOutputDir then true, sprintf "--html\" \"%s" <| parameters.HtmlOutputDir.TrimEnd Path.DirectorySeparatorChar @@ -87,7 +86,7 @@ let exec setParams assemblies = let details = String.separated ", " assemblies use __ = Trace.traceTask "MSpec" details let parameters = setParams MSpecDefaults - let args = buildMSpecArgs parameters assemblies + let args = buildArgs parameters assemblies Trace.trace (parameters.ToolPath + " " + args) if 0 <> Process.execSimple ((fun info -> { info with diff --git a/src/app/Fake.DotNet.Testing.NUnit/Common.fs b/src/app/Fake.DotNet.Testing.NUnit/Common.fs index 70e2fff7da4..4b78544f03c 100644 --- a/src/app/Fake.DotNet.Testing.NUnit/Common.fs +++ b/src/app/Fake.DotNet.Testing.NUnit/Common.fs @@ -156,8 +156,7 @@ let NUnitDefaults = Fixture = ""} /// Builds the command line arguments from the given parameter record and the given assemblies. -/// [omit] -let internal buildNUnitdArgs parameters assemblies = +let buildArgs (parameters: NUnitParams) (assemblies: string seq) = new StringBuilder() |> StringBuilder.append "-nologo" |> StringBuilder.appendIfTrue parameters.DisableShadowCopy "-noshadow" diff --git a/src/app/Fake.DotNet.Testing.NUnit/NUnit3.fs b/src/app/Fake.DotNet.Testing.NUnit/NUnit3.fs index 5d331eeb330..393cb78030b 100644 --- a/src/app/Fake.DotNet.Testing.NUnit/NUnit3.fs +++ b/src/app/Fake.DotNet.Testing.NUnit/NUnit3.fs @@ -273,7 +273,8 @@ let getWorkingDir parameters = "." ] |> Path.GetFullPath -let internal buildNUnit3Args parameters assemblies = +/// Builds the command line arguments from the given parameter record and the given assemblies. +let buildArgs (parameters:NUnit3Params) (assemblies: string seq) = let appendResultString results sb = match results, sb with | [], sb -> StringBuilder.append "--noresult" sb @@ -315,7 +316,7 @@ let run (setParams : NUnit3Params -> NUnit3Params) (assemblies : string seq) = let assemblies = assemblies |> Seq.toArray if Array.isEmpty assemblies then failwith "NUnit: cannot run tests (the assembly list is empty)." let tool = parameters.ToolPath - let args = buildNUnit3Args parameters assemblies + let args = buildArgs parameters assemblies Trace.trace (tool + " " + args) let processTimeout = TimeSpan.MaxValue // Don't set a process timeout. The timeout is per test. let result = diff --git a/src/app/Fake.DotNet.Testing.NUnit/Parallel.fs b/src/app/Fake.DotNet.Testing.NUnit/Parallel.fs index 4b6e37cfaa7..0d43888bd30 100644 --- a/src/app/Fake.DotNet.Testing.NUnit/Parallel.fs +++ b/src/app/Fake.DotNet.Testing.NUnit/Parallel.fs @@ -48,7 +48,7 @@ let run (setParams : NUnitParams -> NUnitParams) (assemblies : string seq) = let tool = parameters.ToolPath @@ parameters.ToolName let runSingleAssembly parameters name outputFile = - let args = buildNUnitdArgs { parameters with OutputFile = outputFile } [ name ] + let args = buildArgs { parameters with OutputFile = outputFile } [ name ] let errout = StringBuilder() let stdout = StringBuilder() Trace.tracefn "Run NUnit tests from %s." name diff --git a/src/app/Fake.DotNet.Testing.NUnit/Sequential.fs b/src/app/Fake.DotNet.Testing.NUnit/Sequential.fs index 0782ac3bb6e..5911deb907b 100644 --- a/src/app/Fake.DotNet.Testing.NUnit/Sequential.fs +++ b/src/app/Fake.DotNet.Testing.NUnit/Sequential.fs @@ -33,7 +33,7 @@ let run (setParams : NUnitParams -> NUnitParams) (assemblies : string seq) = let assemblies = assemblies |> Seq.toArray if Array.isEmpty assemblies then failwith "NUnit: cannot run tests (the assembly list is empty)." let tool = parameters.ToolPath @@ parameters.ToolName - let args = buildNUnitdArgs parameters assemblies + let args = buildArgs parameters assemblies Trace.trace (tool + " " + args) let result = Process.execSimple ((fun info -> diff --git a/src/app/Fake.DotNet.Testing.VSTest/VSTest.fs b/src/app/Fake.DotNet.Testing.VSTest/VSTest.fs index f1e6620a4f1..5eba8133af2 100644 --- a/src/app/Fake.DotNet.Testing.VSTest/VSTest.fs +++ b/src/app/Fake.DotNet.Testing.VSTest/VSTest.fs @@ -91,8 +91,7 @@ let private VSTestDefaults = TestAdapterPath = null } /// Builds the command line arguments from the given parameter record and the given assemblies. -/// [omit] -let private buildVSTestArgs (parameters : VSTestParams) assembly = +let buildArgs (parameters : VSTestParams) (assembly: string) = let testsToRun = if not (Seq.isEmpty parameters.Tests) then sprintf @"/Tests:%s" (parameters.Tests |> String.separated ",") @@ -141,7 +140,7 @@ let run (setParams : VSTestParams -> VSTestParams) (assemblies : string seq) = Trace.traceError message failwith message for assembly in assemblies do - let args = buildVSTestArgs parameters assembly + let args = buildArgs parameters assembly Process.execSimple (fun info -> { info with FileName = parameters.ToolPath diff --git a/src/app/Fake.DotNet.Testing.XUnit2/XUnit2.fs b/src/app/Fake.DotNet.Testing.XUnit2/XUnit2.fs index eedb93a5d5a..3075f315f2d 100644 --- a/src/app/Fake.DotNet.Testing.XUnit2/XUnit2.fs +++ b/src/app/Fake.DotNet.Testing.XUnit2/XUnit2.fs @@ -190,7 +190,8 @@ let XUnit2Defaults = Class = None Method = None } -let internal buildXUnit2Args assemblies parameters = +/// Builds the command line arguments from the given parameter record and the given assemblies. +let buildArgs (parameters:XUnit2Params) (assemblies: string seq)= let formatTrait traitFlag (name, value) = sprintf @"%s ""%s=%s""" traitFlag name value let appendTraits traitsList traitFlag sb = @@ -279,7 +280,7 @@ let run setParams assemblies = { info with FileName = parameters.ToolPath WorkingDirectory = defaultArg parameters.WorkingDir "." - Arguments = parameters |> buildXUnit2Args assemblies}) >> Process.withFramework) parameters.TimeOut + Arguments = buildArgs parameters assemblies}) >> Process.withFramework) parameters.TimeOut ResultHandling.failBuildIfXUnitReportedError parameters.ErrorLevel result __.MarkSuccess() diff --git a/src/legacy/FakeLib/DotCover.fs b/src/legacy/FakeLib/DotCover.fs index d2cff314318..9e55488074c 100644 --- a/src/legacy/FakeLib/DotCover.fs +++ b/src/legacy/FakeLib/DotCover.fs @@ -1,5 +1,5 @@ /// Contains a task which can be used to run [DotCover](http://www.jetbrains.com/dotcover/) on .NET assemblies. -[] +[] module Fake.DotCover open Fake @@ -9,7 +9,7 @@ open System.Text open Fake.Testing.XUnit2 open Fake.Testing.NUnit3 open Fake.MSTest -[] +[] type DotCoverReportType = | Html = 0 @@ -19,7 +19,7 @@ type DotCoverReportType = /// The dotCover parameter type for running coverage [] -[] +[] type DotCoverParams = { ToolPath: string WorkingDir: string @@ -33,7 +33,7 @@ type DotCoverParams = CustomParameters: string } /// The dotCover default parameters -[] +[] let DotCoverDefaults = { ToolPath = findToolInSubPath "dotCover.exe" (currentDirectory @@ "tools" @@ "DotCover") WorkingDir = "" @@ -47,7 +47,7 @@ let DotCoverDefaults = ErrorLevel = ErrorLevel.Error} [] -[] +[] type DotCoverMergeParams = { ToolPath: string WorkingDir: string @@ -56,7 +56,7 @@ type DotCoverMergeParams = TempDir: string CustomParameters: string } -[] +[] let DotCoverMergeDefaults = { ToolPath = findToolInSubPath "dotCover.exe" (currentDirectory @@ "tools" @@ "DotCover") WorkingDir = "" @@ -66,7 +66,7 @@ let DotCoverMergeDefaults = CustomParameters = "" } [] -[] +[] type DotCoverReportParams = { ToolPath: string WorkingDir: string @@ -75,7 +75,7 @@ type DotCoverReportParams = ReportType: DotCoverReportType CustomParameters: string } -[] +[] let DotCoverReportDefaults : DotCoverReportParams = { ToolPath = findToolInSubPath "dotCover.exe" (currentDirectory @@ "tools" @@ "DotCover") WorkingDir = "" @@ -84,7 +84,7 @@ let DotCoverReportDefaults : DotCoverReportParams = ReportType = DotCoverReportType.Xml CustomParameters = "" } -[] +[] let buildDotCoverArgs parameters = new StringBuilder() |> append "cover" @@ -97,7 +97,7 @@ let buildDotCoverArgs parameters = |> appendWithoutQuotes parameters.CustomParameters |> toText -[] +[] let buildDotCoverMergeArgs (parameters:DotCoverMergeParams) = new StringBuilder() |> append "merge" @@ -107,7 +107,7 @@ let buildDotCoverMergeArgs (parameters:DotCoverMergeParams) = |> appendWithoutQuotes parameters.CustomParameters |> toText -[] +[] let buildDotCoverReportArgs parameters = new StringBuilder() |> append "report" @@ -118,12 +118,12 @@ let buildDotCoverReportArgs parameters = |> toText -[] +[] let getWorkingDir workingDir = Seq.find isNotNullOrEmpty [workingDir; environVar("teamcity.build.workingDir"); "."] |> Path.GetFullPath -[] +[] let buildParamsAndExecute parameters buildArguments toolPath workingDir failBuild = let args = buildArguments parameters trace (toolPath + " " + args) @@ -146,7 +146,7 @@ let buildParamsAndExecute parameters buildArguments toolPath workingDir failBuil /// ## Parameters /// /// - `setParams` - Function used to overwrite the dotCover default parameters. -[] +[] let DotCover (setParams: DotCoverParams -> DotCoverParams) = let parameters = (DotCoverDefaults |> setParams) buildParamsAndExecute parameters buildDotCoverArgs parameters.ToolPath parameters.WorkingDir (parameters.ErrorLevel <> ErrorLevel.DontFailBuild) @@ -163,7 +163,7 @@ let DotCover (setParams: DotCoverParams -> DotCoverParams) = /// Source = [artifactsDir @@ "NUnitDotCoverSnapshot.dcvr" /// artifactsDir @@ "MSpecDotCoverSnapshot.dcvr"] /// Output = artifactsDir @@ "dotCoverSnapshot.dcvr" }) -[] +[] let DotCoverMerge (setParams: DotCoverMergeParams -> DotCoverMergeParams) = let parameters = (DotCoverMergeDefaults |> setParams) buildParamsAndExecute parameters buildDotCoverMergeArgs parameters.ToolPath parameters.WorkingDir false @@ -179,7 +179,7 @@ let DotCoverMerge (setParams: DotCoverMergeParams -> DotCoverMergeParams) = /// Source = artifactsDir @@ "dotCoverSnapshot.dcvr" /// Output = artifactsDir @@ "dotCoverReport.xml" /// ReportType = DotCoverReportType.Xml }) -[] +[] let DotCoverReport (setParams: DotCoverReportParams -> DotCoverReportParams) = let parameters = (DotCoverReportDefaults |> setParams) buildParamsAndExecute parameters buildDotCoverReportArgs parameters.ToolPath parameters.WorkingDir @@ -198,7 +198,7 @@ let DotCoverReport (setParams: DotCoverReportParams -> DotCoverReportParams) = /// Output = artifactsDir @@ "NUnitDotCoverSnapshot.dcvr" }) /// (fun nUnitOptions -> { nUnitOptions with /// DisableShadowCopy = true }) -[] +[] let DotCoverNUnit (setDotCoverParams: DotCoverParams -> DotCoverParams) (setNUnitParams: NUnitParams -> NUnitParams) (assemblies: string seq) = let assemblies = assemblies |> Seq.toArray let details = assemblies |> separated ", " @@ -227,7 +227,7 @@ let DotCoverNUnit (setDotCoverParams: DotCoverParams -> DotCoverParams) (setNUni /// Output = artifactsDir @@ "NUnitDotCoverSnapshot.dcvr" }) /// (fun nUnitOptions -> { nUnitOptions with /// DisableShadowCopy = true }) -[] +[] let DotCoverNUnit3 (setDotCoverParams: DotCoverParams -> DotCoverParams) (setNUnitParams: NUnit3Params -> NUnit3Params) (assemblies: string seq) = let assemblies = assemblies |> Seq.toArray let details = assemblies |> separated ", " @@ -254,7 +254,7 @@ let DotCoverNUnit3 (setDotCoverParams: DotCoverParams -> DotCoverParams) (setNUn /// |> DotCoverXUnit2 /// (fun -> dotCoverOptions ) /// (fun nUnitOptions -> nUnitOptions) -[] +[] let DotCoverXUnit2 (setDotCoverParams: DotCoverParams -> DotCoverParams) (setXUnit2Params: XUnit2Params -> XUnit2Params) (assemblies: string seq) = let assemblies = assemblies |> Seq.toArray let details = assemblies |> separated ", " @@ -300,7 +300,7 @@ let internal buildMSTestArgsForDotCover parameters assemblies = /// |> MSTest /// (fun -> dotCoverOptions ) /// (fun MSTestOptions -> MSTestOptions) -[] +[] let DotCoverMSTest (setDotCoverParams: DotCoverParams -> DotCoverParams) (setMSTestParams: MSTestParams -> MSTestParams) (assemblies: string seq) = let assemblies = assemblies |> Seq.toArray let details = assemblies |> separated ", " @@ -329,7 +329,7 @@ let DotCoverMSTest (setDotCoverParams: DotCoverParams -> DotCoverParams) (setMST /// Output = artifactsDir @@ "MSpecDotCoverSnapshot.dcvr" }) /// (fun mSpecOptions -> { mSpecOptions with /// Silent = true }) -[] +[] let DotCoverMSpec (setDotCoverParams: DotCoverParams -> DotCoverParams) (setMSpecParams: MSpecParams -> MSpecParams) (assemblies: string seq) = let assemblies = assemblies |> Seq.toArray let details = assemblies |> separated ", " diff --git a/src/legacy/FakeLib/FakeLib.fsproj b/src/legacy/FakeLib/FakeLib.fsproj index c44eb3c2bae..bb683e6533f 100644 --- a/src/legacy/FakeLib/FakeLib.fsproj +++ b/src/legacy/FakeLib/FakeLib.fsproj @@ -428,6 +428,9 @@ Fake.DotNet.Fsi\Fsi.fs + + Fake.DotNet.Testing.DotCover/DotCover.fs +