Skip to main content

Recolección de estadísticas en ScalaTest

⏱ Dedicación recomendada: 0 minutos
Esto considera el contenido visible y relevante, e ignora texto colapsado o marcado como opcional.


r8vnhill/

🧪 Ejemplo práctico: clasificando triángulos

En Kotest, usamos collect para observar cuántos triángulos de cada tipo generábamos. Veamos cómo se hace algo equivalente en ScalaTest con ScalaCheck:

import org.scalatest.propspec.AnyPropSpec
import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks
import org.scalacheck.Gen
import org.scalacheck.Prop.{forAll, collect, classify}

class TriangleSpec extends AnyPropSpec with ScalaCheckPropertyChecks {

case class Triangle(a: Int, b: Int, c: Int) {
def triangleType: String =
if (a == b && b == c) "Equilateral"
else if (a == b || b == c || a == c) "Isosceles"
else "Scalene"
}

val triangleGen: Gen[Triangle] = for {
a <- Gen.choose(1, 10)
b <- Gen.choose(1, 10)
c <- Gen.choose(1, 10)
} yield Triangle(a, b, c)

property("should generate all triangle types with balanced distribution") {
forAll(triangleGen) { triangle =>
val tpe = triangle.triangleType

classify(tpe == "Equilateral", "Equilateral") {
classify(tpe == "Isosceles", "Isosceles") {
classify(tpe == "Scalene", "Scalene") {
collect(tpe)(true)
}
}
}
}
}
}

📊 ¿Qué obtienes al correr esta prueba?

ScalaCheck (a través de ScalaTest) imprime automáticamente estadísticas como:

+ OK, passed 100 tests.
> Collected test results:
> Equilateral -> 31%
> Isosceles -> 46%
> Scalene -> 23%

Esto te permite identificar posibles sesgos en la generación de datos, de forma similar a lo que hicimos con collect en Kotest.


🧭 ¿Qué puedes hacer en ScalaTest + ScalaCheck que no en Kotest?

ScalaTest + ScalaCheck ofrece funcionalidades más expresivas para clasificar y etiquetar datos:

Funcionalidad¿Disponible en Kotest?¿Disponible en ScalaTest + ScalaCheck?
collect para registrar categorías✅ Sí✅ Sí
classify para categorizar por condición❌ No✅ Sí
label para agregar etiquetas múltiples❌ No✅ Sí
Análisis combinado de etiquetas❌ No✅ Sí

En ScalaTest con ScalaCheck puedes, por ejemplo:

classify(condition1, "label1") {
classify(condition2, "label2") {
collect(someCategory)(true)
}
}

Esto permite recolectar estadísticas condicionales y múltiples etiquetas al mismo tiempo, cosa que Kotest no soporta directamente.


✅ ¿Cuándo usar cada enfoque?

Si necesitas...Usa...
Simplicidad y buena integración con Kotlin✅ Kotest
Clasificación condicional y múltiples etiquetas✅ ScalaTest + ScalaCheck
Recolección básica para detectar errores en generadores✅ Ambos
Análisis detallado de casos límite o combinaciones✅ ScalaTest + ScalaCheck