Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

176
Vistas
¿Es reproducible usar Arbitrary.sample desde dentro de una Acción?

Tenemos una prueba con estado para un sistema de pedidos. Hay un objeto Arbitrary que generará un objeto de Order que tiene una cantidad de LineItem de línea.

Hay acciones para:

  • Crear un Order
  • Cancelar una línea de LineItem

La acción para crear una orden toma la orden en sí, por ejemplo:

 Arbitraries.defaultFor(Order.class).map(CreateOrderAction::new)

El estado de las acciones tiene conocimiento sobre todas las órdenes creadas.

Para cancelar un LineItem , necesitamos saber qué pedidos se crean. Dentro CancelLineItemAction , ¿es seguro hacer lo siguiente?

 LineItem line = Arbitraries.<Collection<Order>>of(state.orders()) .flatMap(order -> Arbitraries.<Collection<LineItem>>of(order.lineItems())) .sample();

Basado en el javadoc de Arbitrary.sample() , parece seguro, pero esta construcción no se menciona explícitamente en la documentación sobre pruebas con estado, y no queremos usarla extensamente solo para romper la reproducibilidad de nuestras pruebas.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

TLDR

  • Arbitrary.sample() no está diseñado para usarse de esa manera
  • Recomiendo usar un índice de cancelación aleatoria con módulo sobre la cantidad de elementos de línea

1. Por qué no se recomienda Arbitrary.sample()

Arbitrary.sample() está diseñado para usarse fuera de las propiedades, por ejemplo, para experimentar con valores generados o para usarlo en otros contextos como JUnit Jupiter. Hay al menos tres razones:

  • La semilla aleatoria subyacente utilizada para generar valores depende de lo que suceda antes del muestreo. Por lo tanto, los resultados no son realmente reproducibles.
  • El muestreo no considerará ningún contexto de dominio agregado que pueda cambiar lo que se está generando.
  • Los valores generados por sample() NO PARTICIPAN EN LA REDUCCIÓN

2. Opción 1: entregar un objeto aleatorio y usarlo para generar

Entregue una instancia aleatoria al generar un CancelLineItemAction:

 Arbitraries.random().map(random -> new CancelLineItemAction(random))

Usa el aleatorio para invocar un generador:

 LineItem line = Arbitraries.of(state.orders()) .flatMap(order -> Arbitraries.of(order.lineItems())) .generator(100).next(random).value();

Pero en realidad eso es muy complicado para lo que quieres hacer. Aquí hay una simplificación:

3. Opción 2: entregar un objeto aleatorio y usarlo para elegir una línea de pedido

Igual que el anterior, pero no se desvíe con el muestreo:

 List<LineItem> lineItems = state.orders().stream() .flatMap(order -> order.lineItems().stream()) .collect(Collectors.toList()); int randomIndex = random.nextInt(lineItems.size()); LineItem line = lineItems.get(randomIndex);

Tanto la opción 1 como la 2 (con suerte) se comportarán razonablemente en el ciclo de vida de jqwik, pero no intentarán ninguna reducción. Por eso recomiendo la siguiente opción.

4. Opción 3: entregar un índice de cancelación y modularlo sobre el número de líneas de pedido

Para generar la acción:

 Arbitraries.integer().between(0, MAX_LINE_ITEMS) .map(cancelIndex -> new CancelLineItemAction(cancelIndex))

Úsalo en acción:

 List<LineItem> lineItems = state.orders().stream() .flatMap(order -> order.lineItems().stream()) .collect(Collectors.toList()); int randomIndex = cancelIndex % lineItems.size(); LineItem line = lineItems.get(randomIndex);

El enfoque se describe con más detalle aquí: https://blog.johanneslink.net/2020/03/11/model-based-testing/

5. Perspectivas de futuro

En un futuro más o menos lejano, jqwik puede permitir entregar el estado actual al generar acciones. Esto haría cosas como la tuya un poco más simples. Pero esta característica aún no ha sido priorizada.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda