Ci sono diverse librerie e modalità per testare il codice Scala, ma in questo tutorial verrà mostrato come eseguire il testing usando AnyFunSuite del framework ScalaTest. Si assume che si sappia creare un progetto Scala con sbt.
Setup
- Da linea di comando, creare una nuova directory in una posizione a propria scelta.
cdnella cartella appena creata ed eseguiresbt new scala/scalatest-example.g8- Quando richiesto, rinominare il progetto come
ScalaTestTutorial. - Il progetto avrà già in se la libreria ScalaTest come dipendenza indicata nel file
build.sbt. cdnel progetto ed eseguiresbt test. Questo eseguirà la test suiteCubeCalculatorTestcon un unico test chiamatoCubeCalculator.cube.
sbt test
[info] Loading global plugins from /Users/username/.sbt/0.13/plugins
[info] Loading project definition from /Users/username/workspace/sandbox/my-something-project/project
[info] Set current project to scalatest-example (in build file:/Users/username/workspace/sandbox/my-something-project/)
[info] CubeCalculatorTest:
[info] - CubeCalculator.cube
[info] Run completed in 267 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[success] Total time: 1 s, completed Feb 2, 2017 7:37:31 PM
Comprendere i test
- In qualsiasi editor di testo aprire i seguenti due file:
src/main/scala/CubeCalculator.scalasrc/test/scala/CubeCalculatorTest.scala
- Nel file
CubeCalculator.scala, è riportata la definizione della funzionecube. - Nel file
CubeCalculatorTest.scala, è presente una classe chiamata allo stesso modo dell’oggetto che stiamo testando.
import org.scalatest.funsuite.AnyFunSuite
class CubeCalculatorTest extends AnyFunSuite {
test("CubeCalculator.cube") {
assert(CubeCalculator.cube(3) === 27)
}
}
Analizziamo ogni riga di codice.
class CubeCalculatorTestsignifica che stiamo testando l’oggettoCubeCalculatorextends AnyFunSuiteci permette di utilizzare la funzionalità della classe AnyFunSuite, come ad esempio la funzionetesttestè una funzione proveniente da AnyFunSuite che raccoglie i risultati delle asserzioni all’interno del corpo della funzione."CubeCalculator.cube"è il nome del test. Può essere chiamato in qualsiasi modo, ma la convenzione è “NomeClasse.nomeMetodo”.assertprende una condizione booleana e stabilisce se il test è superato o no.CubeCalculator.cube(3) === 27controlla se l’output della funzionecubesia realmente 27. Il simbolo===è parte di ScalaTest e restituisce messaggi di errore comprensibili.
Aggiungere un altro test case
-
Aggiungere un altro blocco di testo contenente il proprio enunciato
assertche verificherà il cubo di0.import org.scalatest.funsuite.AnyFunSuite class CubeCalculatorTest extends AnyFunSuite { test("CubeCalculator.cube 3 should be 27") { assert(CubeCalculator.cube(3) === 27) } test("CubeCalculator.cube 0 should be 0") { assert(CubeCalculator.cube(0) === 0) } } -
Lanciare
sbt testnuovamente e controllare i risultati.sbt test [info] Loading project definition from C:\projects\scalaPlayground\scalatestpractice\project [info] Loading settings for project root from build.sbt ... [info] Set current project to scalatest-example (in build file:/C:/projects/scalaPlayground/scalatestpractice/) [info] Compiling 1 Scala source to C:\projects\scalaPlayground\scalatestpractice\target\scala-2.13\test-classes ... [info] CubeCalculatorTest: [info] - CubeCalculator.cube 3 should be 27 [info] - CubeCalculator.cube 0 should be 0 [info] Run completed in 257 milliseconds. [info] Total number of tests run: 2 [info] Suites: completed 1, aborted 0 [info] Tests: succeeded 2, failed 0, canceled 0, ignored 0, pending 0 [info] All tests passed. [success] Total time: 3 s, completed Dec 4, 2019 10:34:04 PM
Conclusioni
In questo tutorial è stato mostrato una delle modalità per testare il codice Scala. Per saperne di più su FunSuite si può consultare il sito ufficiale. Si possono anche consultare altri framework di testing come ScalaCheck e Specs2.