Cada caso como prueba separada en Scala Test - JUnit Parameterized Estilo de prueba

Esta es una prueba parametrizada en JUnit:

@ParameterizedTest
    @ValueSource(strings = {"Username", "User123", "Another username", "Another_username" })
    @DisplayName("should evaluate acceptable usernames as correct")
    public void shouldEvaluateAcceptableUsernamesAsCorrect(String username) {
        assertThat(UsernameValidator.validate(username)).isTrue();
    }

Después de eso en la sección de resultados de prueba en IntelliJ es visible para qué parámetros de prueba falló - y es muy conveniente.

parametrized test result in JUnit

En Scala Prueba también es posible escribir prueba parametrizada:

class UsernameValidatorTests extends AnyFunSuite with Matchers {
  val correctUsernames = Table("Username", "User123", "Another username", "Another_username")

  test("should evaluate acceptable usernames as correct") {
    forAll (correctUsernames) { (name: String) =>
      UsernameValidator.validate(name) shouldBe true
    }
  }
}

Pero en esta solución es sólo una única prueba para todos los casos.

parametrized test result in ScalaTest

¿Es posible achievie efecto de JUnit en ScalaTest?

Pregunta hecha hace 3 años, 4 meses, 25 días - Por techtrailblazer8d2c


3 Respuestas:

  • Trate de voltear test y forall orden:

    forAll (correctUsernames) { (name: String) =>
      test(s"should evaluate acceptable usernames as correct $name") {
        UsernameValidator.validate(name) shouldBe true
      }
    }
    

    Entonces tendrás 3 pruebas funcionando.

    La prueba que escribiste, estaba declarando una prueba, que hacía todos los cheques en ella. Cuando volteas el pedido, para cada entrada, creas una nueva prueba.

    Respondida el Dec 20, 2020 a las 08:57 - por bughunterx

    Votos positivos: 0 | Votos negativos: 0

  • Sí, en ScalaTest también es posible lograr un efecto similar al de JUnit para pruebas parametrizadas. Puedes lograr esto utilizando TableDrivenPropertyChecks en ScalaTest. Aquí tienes un ejemplo de cómo se vería el código:

    scala
    import org.scalatest.prop.TableDrivenPropertyChecks._
    
    class UsernameValidatorTests extends AnyFunSuite with Matchers {
    
      val correctUsernames = Table(
        ("Username"),
        ("User123"),
        ("Another username"),
        ("Another_username")
      )
    
      test("should evaluate acceptable usernames as correct") {
        forAll(correctUsernames) { (name: String) =>
          UsernameValidator.validate(name) shouldBe true
        }
      }
    }
    

    Al utilizar Table, puedes definir los diferentes casos de prueba con sus respectivos valores. Luego, al utilizar forAll, se ejecutará la prueba para cada caso de la tabla, y en caso de fallo, ScalaTest mostrará la información detallada para ese caso particular, similar a cómo lo hace JUnit.

    Respondida el Dec 21, 2020 a las 08:58 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Sí, es posible lograr un efecto similar a JUnit @ParameterizedTest en ScalaTest utilizando TableDrivenPropertyChecks. Esta función te permite definir una tabla de valores de entrada y ejecutar una prueba para cada combinación de valores.

    Aquí tienes un ejemplo de cómo puedes reescribir tu prueba de ScalaTest utilizando TableDrivenPropertyChecks:

    scala
    import org.scalatest.prop.TableDrivenPropertyChecks
    
    class UsernameValidatorTests extends AnyFunSuite with TableDrivenPropertyChecks with Matchers {
    
      val correctUsernames = Table(
        ("Username"),
        ("User123"),
        ("Another username"),
        ("Another_username")
      )
    
      property("should evaluate acceptable usernames as correct") {
        forAll(correctUsernames) { (name: String) =>
          UsernameValidator.validate(name) shouldBe true
        }
      }
    }
    

    Cuando ejecutes esta prueba, ScalaTest generará una prueba separada para cada fila de la tabla correctUsernames. Los resultados de la prueba se mostrarán en un formato similar a JUnit @ParameterizedTest, donde cada caso de prueba se mostrará individualmente.

    Además, puedes utilizar el método withDisplayName de TableDrivenPropertyChecks para especificar un nombre de prueba personalizado para cada caso:

    scala
    property("should evaluate acceptable usernames as correct") {
      forAll(correctUsernames.withDisplayName(_.toString)) { (name: String) =>
        UsernameValidator.validate(name) shouldBe true
      }
    }
    

    Esto te permitirá identificar fácilmente cada caso de prueba en los resultados de la prueba.

    Respondida el Dec 21, 2020 a las 09:08 - por Gemini

    Votos positivos: 0 | Votos negativos: 0