Projets de test unitaires F # sous Linux avec mono (FAKE, NUnit 3)

J’essaie de configurer un projet de test F # très simple sous Linux avec mono, en utilisant Forge pour configurer le projet et installer les paquets nuget. Forge crée un fichier build.fsx qui utilise FAKE. J’ai essayé d’ajuster ce fichier de compilation (afin d’append des tests) en s’inspirant de ce tutoriel http://fsharp.github.io/FAKE/gettingstarted.html . Le tutoriel, cependant, utilise C # pour tester et suppose Windows avec .Net comme environnement. Je veux utiliser F # pour tester et Linux avec mono comme environnement.

Je pense que je l’ai presque fait fonctionner, mais je reçois des messages d’erreur cryptiques de NUnit. Lors de l’exécution du fichier build.fsx , j’obtiens les erreurs suivantes à la fin:

 ... Invalid argument: -nologo The value '/home/michel/Documents/FSHARP/UnitTests/test/NUnit.Test.MyTests.dll' is not valid for option '--labels'. Invalid argument: -xml:./test/TestResults.xml Running build failed. Error: NUnit test failed (255). --------------------------------------------------------------------- Build Time Report --------------------------------------------------------------------- Target Duration ------ -------- Clean 00:00:00.0036366 Build 00:00:00.0402828 BuildTest 00:00:00.4911710 Total: 00:00:00.7494956 Status: Failure --------------------------------------------------------------------- 1) Fake.UnitTestCommon+FailedTestsException: NUnit test failed (255). at Fake.NUnitSequential.NUnit (Microsoft.FSharp.Core.FSharpFunc`2 setParams, IEnumerable`1 assemblies)  in :0 at [email protected] (Microsoft.FSharp.Core.Unit _arg4)  in :0 at Fake.TargetHelper+targetFromTemplate@195[a].Invoke (Microsoft.FSharp.Core.Unit unitVar0)  in :0 at Fake.TargetHelper.runSingleTarget (Fake.TargetTemplate`1 target)  in :0 

Mon fichier build.fsx ressemble à ceci

 // include Fake libs #r "./packages/FAKE/tools/FakeLib.dll" open Fake // Directories let buildDir = "./build/" let testDir = "./test/" // version info let version = "0.1" // or resortingeve from CI server // Targets Target "Clean" (fun _ -> CleanDirs [buildDir; testDir] ) Target "Build" (fun _ -> //MSBuildDebug buildDir "Build" appReferences !! "/UnitTesting/*.fsproj" |> MSBuildRelease buildDir "Build" |> Log "AppBuild-Output: " ) Target "BuildTest" (fun _ -> !! "src/NUnit.Test.MyTests/*.fsproj" |> MSBuildDebug testDir "Build" |> Log "TestBuild-Output: " ) Target "Test" (fun _ -> !! (testDir + "/NUnit.Test.MyTests.dll") |> NUnit (fun p -> { p with ToolPath = "packages/NUnit.ConsoleRunner/tools" //DisableShadowCopy = true; OutputFile = testDir + "TestResults.xml" }) ) Target "Default" (fun _ -> trace "HEEEELLOOOOOO world from FAKE!!!") "Clean" ==> "Build" ==> "BuildTest" ==> "Test" ==> "Default" RunTargetOrDefault "Default" 

FAKE semble rechercher un fichier nunit-console.exe sous le packages/NUnit.ConsoleRunner/tools , mais ce fichier n’existe pas. Cependant, il existe un fichier nunit3-console.exe , je viens donc de faire une copie de ce fichier sous le nom nunit-console.exe .

Mon fichier de test simple NUnit.Test.MyTests.fs ressemble à ceci:

 namespace NUnit.Test.MyTests module testmodule = open NUnit.Framework let SayHello name = "Hello" [] type myFixture() = [] member self.myTest() = Assert.AreEqual("Hello World!", SayHello "World") 

et le fichier test/NUnit.Test.MyTests.dll semble bien être généré.

Que signifie le message d’erreur cryptique et comment puis-je le résoudre pour que je puisse exécuter mes tests?

Comme mentionné par rmunn dans le commentaire, je dois utiliser la fonction NUnit3 car j’utilise la version 3.4.1 de NUnit. La fonction réside dans le module FAKE.Testing http://fsharp.github.io/FAKE/apidocs/fake-testing-nunit3.html . J’ai modifié mon fichier build.fsx pour qu’il ressemble maintenant à ceci:

 // include Fake libs #r "./packages/FAKE/tools/FakeLib.dll" open Fake open Fake.Testing // NUnit3 is in here // Directories let buildDir = "./build/" let testDir = "./test/" // version info let version = "0.1" // or resortingeve from CI server // Targets Target "Clean" (fun _ -> CleanDirs [buildDir; testDir] ) Target "Build" (fun _ -> !! "/UnitTesting/*.fsproj" |> MSBuildRelease buildDir "Build" |> Log "AppBuild-Output: " ) Target "BuildTest" (fun _ -> !! "src/NUnit.Test.MyTests/*.fsproj" |> MSBuildDebug testDir "Build" |> Log "TestBuild-Output: " ) Target "Test" (fun _ -> !! (testDir + "/NUnit.Test.*.dll") |> NUnit3 (fun p -> { p with ToolPath = "packages/NUnit.ConsoleRunner/tools/nunit3-console.exe" }) ) Target "Default" (fun _ -> trace "HEEEELLOOOOOO world from FAKE!!!") "Clean" ==> "Build" ==> "BuildTest" ==> "Test" ==> "Default" RunTargetOrDefault "Default" 

Notez que vous devez spécifier ToolPath nunit3-console.exe fichier nunit3-console.exe , et pas uniquement au répertoire dans lequel il réside.

Maintenant, tout semble fonctionner, et j’obtiens un simple «résumé de test» dans la sortie de la console lorsque je lance build.fsx . 🙂