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.
cd
nella 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
. cd
nel progetto ed eseguiresbt test
. Questo eseguirà la test suiteCubeCalculatorTest
con 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.scala
src/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 CubeCalculatorTest
significa che stiamo testando l’oggettoCubeCalculator
extends AnyFunSuite
ci permette di utilizzare la funzionalità della classe AnyFunSuite, come ad esempio la funzionetest
test
è 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”.assert
prende una condizione booleana e stabilisce se il test è superato o no.CubeCalculator.cube(3) === 27
controlla se l’output della funzionecube
sia 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
assert
che 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 test
nuovamente 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.