0Pricing
Scala for Backend Engineering & Functional Programming · Lección

Pruebas basadas en propiedades

ScalaCheck

Pruebas basadas en propiedades es una lección gratuita de Scala for Backend Engineering & Functional Programming en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Scala for Backend Engineering & Functional Programming, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Scala for Backend Engineering & Functional Programming incluye 4 lecciones en total.

¿Qué son las pruebas basadas en propiedades?

En las pruebas basadas en propiedades, se especifica una propiedad general que debe cumplirse para todas las entradas, y el framework genera muchas entradas aleatorias para intentar refutarla. Esto permite encontrar casos límite que las pruebas escritas manualmente no detectan.

Ejemplo frente a propiedad

Una prueba de ejemplo comprueba un caso: reverse(List(1,2,3)) == List(3,2,1). Una propiedad establece una regla: invertir dos veces produce la lista original, para cualquier lista. El framework comprueba esa regla con cientos de listas generadas.

ScalaCheck

ScalaCheck es la biblioteca de pruebas basadas en propiedades de Scala. Añádala como dependencia de prueba; se integra con ScalaTest.

libraryDependencies += "org.scalatestplus" %% "scalacheck-1-17" % "3.2.18.0" % Test

forAll

La construcción principal es forAll: genera valores aleatorios y comprueba el cuerpo de la propiedad para cada uno. Aquí comprobamos que la suma es conmutativa.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks

class AddSpec extends AnyFlatSpec with Matchers with ScalaCheckPropertyChecks {
  "addition" should "be commutative" in {
    forAll { (a: Int, b: Int) =>
      a + b shouldBe b + a
    }
  }
}

Una propiedad de ida y vuelta

Un patrón muy útil es el de ida y vuelta: codificar y después decodificar (o invertir dos veces) debe devolver el valor original para cualquier entrada.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks

class RevSpec extends AnyFlatSpec with Matchers with ScalaCheckPropertyChecks {
  "reverse" should "be its own inverse" in {
    forAll { (xs: List[Int]) =>
      xs.reverse.reverse shouldBe xs
    }
  }
}

Generadores

ScalaCheck proporciona automáticamente generadores Gen para los tipos integrados. También puede crear generadores personalizados, como Gen.choose(1, 100) para un entero dentro de un rango.

import org.scalacheck.Gen

val smallInt: Gen[Int] = Gen.choose(1, 100)
val nonEmpty: Gen[List[Int]] = Gen.nonEmptyListOf(Gen.choose(0, 9))

Usar un generador personalizado

Pase un generador a forAll para restringir las entradas, por ejemplo, a números positivos.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks
import org.scalacheck.Gen

class PosSpec extends AnyFlatSpec with Matchers with ScalaCheckPropertyChecks {
  "abs" should "stay positive" in {
    forAll(Gen.choose(1, 1000)) { (n: Int) =>
      math.abs(n) should be > 0
    }
  }
}

Reducción

Cuando falla una propiedad, ScalaCheck reduce la entrada que provoca el fallo hasta obtener el ejemplo más pequeño que sigue fallando. En lugar de una lista aleatoria enorme, obtiene un contraejemplo mínimo fácil de depurar.

Propiedades condicionales

Use whenever para limitar una propiedad a las entradas que cumplen una precondición. Las entradas que no cumplen la condición se descartan.

import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
import org.scalatestplus.scalacheck.ScalaCheckPropertyChecks

class DivSpec extends AnyFlatSpec with Matchers with ScalaCheckPropertyChecks {
  "division" should "hold for nonzero divisors" in {
    forAll { (a: Int, b: Int) =>
      whenever(b != 0) {
        (a / b) * b + (a % b) shouldBe a
      }
    }
  }
}

Buenas propiedades que probar

Categorías de propiedades útiles:

  • Idas y vueltas: codificar/decodificar, invertir/invertir.
  • Invariantes: ordenar conserva la longitud.
  • Leyes algebraicas: conmutatividad, asociatividad, identidad.

Cuándo usarlo

Las pruebas basadas en propiedades complementan las pruebas de ejemplo; no las sustituyen. Úselas para funciones puras con reglas matemáticas o estructurales claras. Mantenga pruebas de ejemplo específicas para casos conocidos y regresiones.

Comprobación rápida

Compruebe sus conocimientos sobre las pruebas basadas en propiedades.

Resumen

Ha aprendido las pruebas basadas en propiedades con ScalaCheck:

  • Especifique propiedades verdaderas para todas las entradas; el framework genera muchas.
  • forAll controla la generación; Gen crea entradas personalizadas.
  • whenever añade precondiciones; los fallos se reducen a ejemplos mínimos.
  • Son ideales para idas y vueltas, invariantes y leyes algebraicas.

Preguntas frecuentes

¿La lección «Pruebas basadas en propiedades» es gratis?

Sí — el texto completo de «Pruebas basadas en propiedades» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Scala for Backend Engineering & Functional Programming, actualiza a CoddyKit PRO. El curso de Scala for Backend Engineering & Functional Programming incluye 4 lecciones en total.

¿Qué aprenderé en «Pruebas basadas en propiedades»?

ScalaCheck Practicas Scala for Backend Engineering & Functional Programming con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Scala for Backend Engineering & Functional Programming?

No se requiere experiencia previa. Scala for Backend Engineering & Functional Programming en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Pruebas basadas en propiedades»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Scala for Backend Engineering & Functional Programming?

Sí. Cada lección de Scala for Backend Engineering & Functional Programming incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Estilos de ScalaTest
  2. Matchers
  3. Pruebas basadas en propiedades
  4. Mocking y fixtures
← Volver a Scala for Backend Engineering & Functional Programming