Les proves unitàries són una part essencial del desenvolupament de programari, ja que permeten verificar que les unitats individuals de codi funcionin correctament. En aquest tema, aprendrem a utilitzar NUnit, un marc de proves popular per a .NET, per escriure i executar proves unitàries en F#.
Continguts
- Introducció a NUnit
- Configuració de l'Entorn
- Estructura d'una Prova Unitària
- Escriure Proves Unitàries en F#
- Executar Proves Unitàries
- Exercicis Pràctics
- Introducció a NUnit
NUnit és un marc de proves unitàries per a .NET que permet als desenvolupadors escriure proves per verificar el comportament del seu codi. NUnit proporciona una API rica per definir i executar proves, així com per verificar els resultats esperats.
Característiques Clau de NUnit
- Atributs de Prova: Permeten marcar mètodes com a proves.
- Assert: Proporciona mètodes per verificar condicions.
- Categories de Prova: Permeten agrupar proves per facilitar-ne l'execució.
- Configuració i Desconfiguració: Permeten inicialitzar i netejar recursos abans i després de les proves.
- Configuració de l'Entorn
Abans de començar a escriure proves unitàries, necessitem configurar el nostre entorn de desenvolupament.
Passos per Configurar l'Entorn
-
Instal·lar NUnit: Afegiu NUnit al vostre projecte F# utilitzant NuGet.
dotnet add package NUnit dotnet add package NUnit3TestAdapter dotnet add package Microsoft.NET.Test.Sdk
-
Crear un Projecte de Proves: Creeu un projecte de proves separat si encara no en teniu un.
dotnet new nunit -n MyFSharpTests cd MyFSharpTests
-
Afegir Referència al Projecte Principal: Assegureu-vos que el projecte de proves tingui una referència al projecte principal.
dotnet add reference ../MyFSharpProject/MyFSharpProject.fsproj
- Estructura d'una Prova Unitària
Una prova unitària en NUnit es defineix com un mètode marcat amb l'atribut [<Test>]
. Aquí teniu un exemple bàsic:
open NUnit.Framework [<TestFixture>] type MyTests() = [<Test>] member this.``Test Example``() = Assert.AreEqual(4, 2 + 2)
Explicació del Codi
[<TestFixture>]
: Marca una classe que conté proves.[<Test>]
: Marca un mètode com a prova.Assert.AreEqual(expected, actual)
: Verifica que el valor actual sigui igual al valor esperat.
- Escriure Proves Unitàries en F#
Ara que tenim la configuració bàsica, escrivim algunes proves unitàries per a una funció simple.
Exemple de Funció a Provar
Proves Unitàries per a la Funció add
open NUnit.Framework open MyMath [<TestFixture>] type MyMathTests() = [<Test>] member this.``Add 2 and 3 should equal 5``() = let result = add 2 3 Assert.AreEqual(5, result) [<Test>] member this.``Add -1 and 1 should equal 0``() = let result = add -1 1 Assert.AreEqual(0, result)
Explicació del Codi
let result = add 2 3
: Crida la funcióadd
amb els arguments 2 i 3.Assert.AreEqual(5, result)
: Verifica que el resultat sigui 5.
- Executar Proves Unitàries
Per executar les proves unitàries, utilitzeu la següent comanda:
Aquesta comanda compilarà el projecte de proves i executarà totes les proves definides.
- Exercicis Pràctics
Exercici 1: Escriure Proves per a una Funció de Multiplicació
- Creeu una funció
multiply
que multipliqui dos nombres. - Escriu proves unitàries per verificar el comportament de la funció
multiply
.
Solució
module MyMath = let multiply x y = x * y open NUnit.Framework open MyMath [<TestFixture>] type MyMathTests() = [<Test>] member this.``Multiply 2 and 3 should equal 6``() = let result = multiply 2 3 Assert.AreEqual(6, result) [<Test>] member this.``Multiply -1 and 1 should equal -1``() = let result = multiply -1 1 Assert.AreEqual(-1, result)
Exercici 2: Escriure Proves per a una Funció de Divisió
- Creeu una funció
divide
que divideixi dos nombres. - Escriu proves unitàries per verificar el comportament de la funció
divide
, incloent-hi la divisió per zero.
Solució
module MyMath = let divide x y = if y = 0 then failwith "Cannot divide by zero" else x / y open NUnit.Framework open MyMath [<TestFixture>] type MyMathTests() = [<Test>] member this.``Divide 6 by 3 should equal 2``() = let result = divide 6 3 Assert.AreEqual(2, result) [<Test>] member this.``Divide by zero should throw exception``() = Assert.Throws<System.Exception>(fun () -> divide 6 0 |> ignore)
Conclusió
En aquesta secció, hem après a configurar l'entorn per a proves unitàries amb NUnit, a escriure i executar proves unitàries en F#, i hem practicat amb alguns exercicis. Les proves unitàries són una eina poderosa per assegurar la qualitat del codi i detectar errors de manera primerenca en el procés de desenvolupament.
Curs de Programació en F#
Mòdul 1: Introducció a F#
Mòdul 2: Conceptes Bàsics
- Tipus de Dades i Variables
- Funcions i Immutabilitat
- Coincidència de Patrons
- Col·leccions: Llistes, Matrius i Seqüències
Mòdul 3: Programació Funcional
Mòdul 4: Estructures de Dades Avançades
Mòdul 5: Programació Orientada a Objectes en F#
- Classes i Objectes
- Herència i Interfícies
- Barreja de Programació Funcional i Orientada a Objectes
- Mòduls i Espais de Noms
Mòdul 6: Programació Asíncrona i Paral·lela
- Fluxos de Treball Asíncrons
- Biblioteca de Tasques Paral·leles
- MailboxProcessor i Agents
- Patrons de Concurrència
Mòdul 7: Accés i Manipulació de Dades
Mòdul 8: Proves i Depuració
- Proves Unitàries amb NUnit
- Proves Basades en Propietats amb FsCheck
- Tècniques de Depuració
- Perfilat de Rendiment