Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

179
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda