Códigos promocionales: de la solicitud al lanzamiento
En resumen: Una solicitud, «quiero códigos promocionales para el otoño», pasa por todo el curso. Las preguntas encuentran la necesidad y a las personas a las que nadie pregunta. La historia se divide por sus reglas, el plazo de vigencia pasa por Example Mapping. Las reglas del código se convierten en escenarios contra un sistema con errores, y como el cambio toca el total, también se protege el envío de la regresión. El error atrapado se convierte en un informe, dos escenarios se convierten en código, y la matriz dice qué se toca cuando cambia el requisito.
Problema
La solicitud
El dueño de la tienda escribe un lunes por la mañana:
«Quiero códigos promocionales para el otoño. 10 % de descuento, hasta finales de noviembre. Lanzamos en dos semanas».
Tres frases. Contienen al menos cinco reglas que nadie ha enunciado todavía, un tema abierto con dinero de por medio, y una persona que se enterará del cambio solo cuando no pueda hacer su trabajo. En este proyecto recorres todo el camino: de las tres frases al cambio lanzado y comprobado.
La idea
El camino
Cada paso viene de un módulo del curso:
- las preguntas: la necesidad detrás de la solicitud y las personas a las que hay que preguntar;
- la historia y la división: la solicitud es grande; se corta por sus reglas;
- Example Mapping: las reglas, los ejemplos y las preguntas sobre el plazo de vigencia del código;
- los escenarios y las pruebas: las reglas del código se convierten en escenarios; el cambio toca además el total, y el envío depende de él, así que se protege de la regresión;
- el informe: el error que trajo el cambio, descrito para que se corrija a la primera;
- la automatización: dos escenarios del código promocional se convierten en código en los cuatro lenguajes;
- la matriz y el cambio: qué cubren las pruebas y qué se toca cuando cambia el requisito.
Más precisamente, para curiosos
En el navegador, los escenarios se ejecutan contra un sistema con errores. Para el código promocional conoce tres de las reglas: el 10 %, los productos en oferta y qué descuento vale con la fidelidad. El plazo de vigencia y «El código ya se usó» no están en él: están en el mapa, en la matriz y en la automatización, donde los escenarios se ejecutan con las herramientas reales. La regresión, la tabla y el informe son sobre el envío: el cambio del código altera el total del que depende el envío, y el envío tiene que seguir siendo correcto.
Pruébalo
Las preguntas
La idea
Las respuestas
Después de hablar con el dueño, marketing y contabilidad, la solicitud queda así:
- la necesidad: más clientes nuevos en otoño. Métrica: primeros pedidos de clientes nuevos al mes, comparados con el otoño pasado; se mide a finales de noviembre;
- las reglas: el código da un 10 % de descuento; no vale en productos en oferta; se usa en un pedido pagado («El código ya se usó»); vale hasta su último día inclusive («El código ha caducado»); no se suma con la fidelidad, vale el mayor;
- contabilidad: quiere ver qué código dio cada descuento;
- pregunta abierta: si el umbral de 50 € del envío gratis se cuenta antes del descuento o después. Lo decide el dueño; hasta entonces no lo decide nadie más.
Cinco reglas en una historia son muchas. El siguiente paso es la división.
Ejercicio
La historia y el mapa
1. La división. La historia con todas las reglas del código es demasiado grande para una iteración.
Elige el patrón por el que se corta la historia, luego construye la división en el orden en que se hace.
Como cliente quiero introducir un código promocional y obtener un descuento, para comprar más barato.
Paso 2: ¿Qué piezas y en qué orden?
Añade las piezas que forman la división y ordénalas: la primera se hace primero.
Las piezas
La división
Patrón
- Por las reglas del negocio: El descuento es uno, pero las reglas son cinco: 10 %, no en productos en oferta, un pedido pagado, un plazo de vigencia y qué descuento vale con la fidelidad. Cada regla se puede construir, mostrar y comprobar por separado.
La división de ejemplo
- El código da un 10 % en los productos normales
- Los productos en oferta quedan sin el descuento del código
- El código se usa en un pedido pagado; después «El código ya se usó»
- El código vale hasta su último día; después «El código ha caducado»
- Cliente fiel con código: vale el descuento mayor
Cada regla es una historia que se puede mostrar por sí sola. El 10 % es la base y va primero. «Vale el mayor» tiene sentido cuando hay dos descuentos, así que va el último. El campo del carrito y la tabla de la base de datos son capas: nadie puede probar solo eso.
2. El plazo de vigencia. El primer trozo después del 10 % es el plazo de vigencia. Los tres amigos (three amigos) se sentaron con las tarjetas.
Pon cada tarjeta en su lugar, luego decide qué es la historia.
Como cliente quiero saber hasta cuándo vale el código, para usarlo a tiempo.
En cada tarjeta pulsa «Poner como…» y elige: regla (se convierte en columna), ejemplo de una regla o pregunta. Las flechas cambian de opción, Esc cierra. También se puede con el ratón: arrastra la tarjeta a su sitio.
Reglas
Todavía no hay reglas. Pon una tarjeta como regla y se convierte en columna.
Preguntas
- Todavía no hay preguntas.
Tarjetas sin colocar
Un código caducado se rechaza con «El código ha caducado», y el total queda sin descuento
Pedido el 30 de noviembre con OTONO10: una camiseta de 20,00 € cuesta 18,00 €
El código se introdujo el 30 de noviembre a las 23:50, y el pedido se pagó el 1 de diciembre a las 00:10. ¿Vale?
¿El último día termina a medianoche según el reloj de quién: el de la tienda o el del cliente?
El código vale hasta su último día inclusive
Pedido el 1 de diciembre con OTONO10: «El código ha caducado», la camiseta sigue en 20,00 €
OTONO10 vale hasta el 30 de noviembre. Pedido el 15 de noviembre: una camiseta de 20,00 € cuesta 18,00 €
El tablero ordenado
- El código vale hasta su último día inclusive
- OTONO10 vale hasta el 30 de noviembre. Pedido el 15 de noviembre: una camiseta de 20,00 € cuesta 18,00 €
- Pedido el 30 de noviembre con OTONO10: una camiseta de 20,00 € cuesta 18,00 €
- Un código caducado se rechaza con «El código ha caducado», y el total queda sin descuento
- Pedido el 1 de diciembre con OTONO10: «El código ha caducado», la camiseta sigue en 20,00 €
Preguntas
- ¿El último día termina a medianoche según el reloj de quién: el de la tienda o el del cliente?
- El código se introdujo el 30 de noviembre a las 23:50, y el pedido se pagó el 1 de diciembre a las 00:10. ¿Vale?
¿Qué es la historia? Lista para trabajar. Las dos preguntas son sobre el mismo momento, la medianoche del último día, y el dueño las resuelve con una frase. Las reglas y los ejemplos están claros, el trabajo puede empezar, y la respuesta pasa a ser un ejemplo más.
Las dos preguntas son sobre la medianoche del último día. Parecen pequeñas, pero la respuesta decide qué cliente ve «El código ha caducado» a las 00:10. Te las volverás a encontrar en la automatización.
Ejercicio
Los escenarios del código
Tres de las reglas de la división se ejecutan aquí mismo: el 10 %, los productos en oferta y el cliente fiel con código. Un escenario por ejemplo, en el lenguaje del dueño.
Escribe los escenarios del código promocional de modo que se atrapen los seis errores en torno a los descuentos.
Solución
# language: es
Característica: Código promocional
Escenario: El código da un 10 % en un producto a precio normal
Dado un código promocional válido
Y un producto a precio normal
Y un cliente que no es fiel
Cuando el cliente paga
Entonces el descuento es del 10 %
Escenario: El código no vale para un producto en oferta
Dado un código promocional válido
Y un producto en oferta
Y un cliente que no es fiel
Cuando el cliente paga
Entonces no hay descuento
Escenario: Un cliente fiel con código recibe el descuento mayor
Dado un cliente fiel
Y un código promocional válido
Y un producto a precio normal
Cuando el cliente paga
Entonces el descuento es del 10 %
Escenario: Un cliente fiel con código en un producto en oferta conserva la fidelidad
Dado un cliente fiel
Y un código promocional válido
Y un producto en oferta
Cuando el cliente paga
Entonces el descuento es del 5 %
Escenario: Un cliente fiel sin código
Dado un cliente fiel
Y un pedido sin código promocional
Y un producto a precio normal
Cuando el cliente paga
Entonces el descuento es del 5 %
Los errores más traicioneros son los del cliente fiel: si los descuentos se suman, cuál gana, y qué pasa con la fidelidad cuando el código no vale para el producto. Y un cliente fiel sin código también es un ejemplo.
La idea
El cambio toca el envío
El código promocional cambia el total del carrito. El envío depende del total: gratis desde 50,00 € inclusive, si no 4,90 €. El programador del código tocará justo el cálculo del total.
Decida lo que decida el dueño sobre el umbral antes o después del descuento, la regla del envío a partir del total tiene que seguir siendo correcta. Por eso, antes del cambio, el envío se protege de la regresión: escenarios para los ejemplos acordados y pruebas para los casos técnicos, que fallan si algo se rompe en torno al límite.
Ejercicio
La regresión del envío
1. Los escenarios. Pocos escenarios, uno por cada ejemplo acordado.
Escribe los escenarios del envío de modo que atrapen los cinco errores en torno al límite y el carrito vacío.
Solución
# language: es
Característica: Envío gratis
Escenario: Pedido justo en el límite
Dado un carrito de 50,00 €
Cuando hago el pedido
Entonces el envío es gratis
Escenario: Pedido justo por debajo del límite
Dado un carrito de 49,99 €
Cuando hago el pedido
Entonces el envío es de 4,90 €
Escenario: Carrito vacío
Dado un carrito vacío
Cuando hago el pedido
Entonces el pedido se rechaza
Los tres ejemplos son los del Example Mapping del envío: exactamente 50,00 €, 49,99 € y un carrito vacío. 49,00 € está por debajo del límite, pero lejos de él: si el total se redondea a euros enteros, 49,00 € sigue siendo 49, y el error se cuela.
2. Los casos técnicos. La tabla es para la prueba del nivel de componente: los casos que el negocio no quiere leer.
Escribe los casos que atrapan los seis errores, incluido el resto de la tarifa vieja para los pedidos grandes.
La regla: El envío es gratis en un pedido desde 50 € (incluidos), si no, cuesta 4,90 €. Un carrito vacío no se puede pedir.
| Entrada | Esperado | El sistema correcto | |||
|---|---|---|---|---|---|
| # | Total del carrito | Rechazado | Envío | ||
Una celda de resultado vacía no se comprueba. Los importes se escriben como 49,99.
Solución
| Total del carrito | Rechazado | Envío |
|---|---|---|
| 0 | sí | |
| 49,99 | no | 4,90 |
| 50 | no | 0 |
| 150 | no | 0 |
El pedido grande (150 €) no está en los escenarios, porque el negocio no lo ha acordado como ejemplo. Pero el resto de la tarifa vieja («desde 100 € vuelve a ser 4,90 €») solo se ve por encima de 100 €.
Ejercicio
El error atrapado
1. El informe. El programador del código promocional calcula el total con números fraccionarios y lo redondea a euros enteros. El escenario de 49,99 € falla.
Encuentra un total donde se vea el error, y escribe el informe.
con importes con céntimos justo por debajo de 50 €
La regla: El envío es gratis en un pedido desde 50 € (incluidos), si no, cuesta 4,90 €. Un carrito vacío no se puede pedir.
Pasos para reproducirlo
- Todavía no hay pasos. Añádelos desde el vocabulario de abajo.
Los pasos vienen del vocabulario de la funcionalidad, como en los escenarios. Los valores se escriben en el propio paso: el importe como 50,00.
El informe de ejemplo
- Título
- El envío es gratis para un pedido de 49,50 €
- Pasos para reproducirlo
- Dado un carrito de 49,50 €
- Cuando hago el pedido
- Esperado
- el envío es de 4,90 €
- Obtenido
- el envío es gratis
- Gravedad
- media. La tienda pierde 4,90 € solo en los pedidos entre 49,50 € y 49,99 €. El alcance es estrecho, pero el error es real, y los clientes que lo descubran lo aprovecharán.
- Prioridad
- alta. El error entró con el cambio del código promocional, que sale con la campaña. La corrección es pequeña y tiene que ir en el mismo lanzamiento; si no, la campaña lo difundirá.
El error se ve entre 49,50 € y 49,99 €: ahí el redondeo da 50 €. Con 49,00 € los dos sistemas cobran 4,90 €, así que un informe así no reproduce nada. La prioridad es alta, porque el error sale con la campaña.
La idea
Automatizar dos escenarios
Los dos escenarios del código promocional que el dueño leyó y aceptó:
# language: esCaracterística: Código promocional Un código promocional da un 10 % de descuento hasta su último día inclusive.
Escenario: El código da un 10 % Dado un carrito de 20,00 € Cuando aplico el código OTONO10 Entonces el total es de 18,00 €
Escenario: Un código caducado Dado un carrito de 20,00 € Y el código OTONO10 ha caducado Cuando aplico el código OTONO10 Entonces veo que el código ha caducado Y el total es de 20,00 €La clase que aplica el código. El total está en céntimos, y el día es una entrada, no «hoy»: esta es la respuesta a la pregunta de la medianoche del mapa y a la lección sobre las pruebas en CI:
package shop;
import java.time.LocalDate;
public class PromoCode { private final String code; private final LocalDate lastDay;
public PromoCode(String code, LocalDate lastDay) { this.code = code; this.lastDay = lastDay; }
// 10 % del total en céntimos. Un código caducado se rechaza. public int apply(int total, LocalDate day) { if (day.isAfter(lastDay)) { throw new IllegalArgumentException("El código ha caducado"); } return total - total / 10; }}namespace Shop;
public class PromoCode(string code, DateOnly lastDay){ public string Code => code;
// 10 % del total en céntimos. Un código caducado se rechaza. public int Apply(int total, DateOnly day) { if (day > lastDay) { throw new ArgumentException("El código ha caducado"); } return total - total / 10; }}class PromoCode: def __init__(self, code, last_day): self.code = code self.last_day = last_day
def apply(self, total, day): """10 % del total en céntimos. Un código caducado se rechaza.""" if day > self.last_day: raise ValueError("El código ha caducado") return total - total // 10export class PromoCode { constructor(code, lastDay) { this.code = code; this.lastDay = lastDay; }
// 10 % del total en céntimos. Un código caducado se rechaza. apply(total, day) { if (day > this.lastDay) { throw new Error("El código ha caducado"); } return total - Math.floor(total / 10); }}El paso «Cuando» aplica el código, y el paso «Entonces» comprueba el mensaje:
@When("aplico el código {word}")public void apply(String code) { try { total = new PromoCode(code, LAST_DAY).apply(total, today); } catch (IllegalArgumentException e) { refusal = e.getMessage(); }}[When("aplico el código {word}")]public void Apply(string code){ try { total = new PromoCode(code, LastDay).Apply(total, today); } catch (ArgumentException e) { refusal = e.Message; }}@when("aplico el código {code}")def step_apply(context, code): try: context.total = PromoCode(code, LAST_DAY).apply(context.total, context.today) except ValueError as e: context.refusal = str(e)When("aplico el código {word}", function (code) { try { this.total = new PromoCode(code, LAST_DAY).apply(this.total, this.today); } catch (e) { this.refusal = e.message; }});@Then("veo que el código ha caducado")public void toldExpired() { assertEquals("El código ha caducado", refusal);}[Then("veo que el código ha caducado")]public void ToldExpired() => Assert.Equal("El código ha caducado", refusal);@then("veo que el código ha caducado")def step_told_expired(context): assert context.refusal == "El código ha caducado", f"mensaje: {context.refusal}"Then("veo que el código ha caducado", function () { assert.equal(this.refusal, "El código ha caducado");});El archivo de pasos entero, ejecutado con la herramienta real. Los dos escenarios pasan:
package shop;
import io.cucumber.java.ParameterType;import io.cucumber.java.en.Given;import io.cucumber.java.en.Then;import io.cucumber.java.en.When;
import java.time.LocalDate;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class PromoSteps { // El último día del código en los escenarios. private static final LocalDate LAST_DAY = LocalDate.of(2026, 11, 30);
private int total; private LocalDate today = LocalDate.of(2026, 11, 15); private String refusal;
@ParameterType(name = "importe", value = "\\d+,\\d{2}") public int amount(String text) { return Integer.parseInt(text.replace(",", "")); }
@Given("un carrito de {importe} €") public void cart(int cents) { total = cents; }
@Given("el código {word} ha caducado") public void expired(String code) { today = LAST_DAY.plusDays(1); }
@When("aplico el código {word}") public void apply(String code) { try { total = new PromoCode(code, LAST_DAY).apply(total, today); } catch (IllegalArgumentException e) { refusal = e.getMessage(); } }
@Then("el total es de {importe} €") public void totalIs(int cents) { assertEquals(cents, total); }
@Then("veo que el código ha caducado") public void toldExpired() { assertEquals("El código ha caducado", refusal); }}OK El código da un 10 %OK Un código caducadoEscenarios: 2, pasan: 2, fallan: 0using Reqnroll;using Xunit;
namespace Shop;
[Binding]public class PromoSteps{ // El último día del código en los escenarios. private static readonly DateOnly LastDay = new(2026, 11, 30);
private int total; private DateOnly today = new(2026, 11, 15); private string refusal;
[StepArgumentTransformation(@"(\d+,\d{2})", Name = "importe")] public int Amount(string text) => int.Parse(text.Replace(",", ""));
[Given("un carrito de {importe} €")] public void Cart(int cents) => total = cents;
[Given("el código {word} ha caducado")] public void Expired(string code) => today = LastDay.AddDays(1);
[When("aplico el código {word}")] public void Apply(string code) { try { total = new PromoCode(code, LastDay).Apply(total, today); } catch (ArgumentException e) { refusal = e.Message; } }
[Then("el total es de {importe} €")] public void TotalIs(int cents) => Assert.Equal(cents, total);
[Then("veo que el código ha caducado")] public void ToldExpired() => Assert.Equal("El código ha caducado", refusal);}OK El código da un 10 %OK Un código caducadoEscenarios: 2, pasan: 2, fallan: 0from datetime import date, timedelta
from behave import given, register_type, then, when
from promo_code import PromoCode
# El último día del código en los escenarios.LAST_DAY = date(2026, 11, 30)
def parse_amount(text): return int(text.replace(",", ""))
parse_amount.pattern = r"\d+,\d{2}"register_type(Amount=parse_amount)
@given("un carrito de {total:Amount} €")def step_cart(context, total): context.total = total
@given("el código {code} ha caducado")def step_expired(context, code): context.today = LAST_DAY + timedelta(days=1)
@when("aplico el código {code}")def step_apply(context, code): try: context.total = PromoCode(code, LAST_DAY).apply(context.total, context.today) except ValueError as e: context.refusal = str(e)
@then("el total es de {total:Amount} €")def step_total(context, total): assert context.total == total, f"el total es {context.total}, esperado {total}"
@then("veo que el código ha caducado")def step_told_expired(context): assert context.refusal == "El código ha caducado", f"mensaje: {context.refusal}"OK El código da un 10 %OK Un código caducadoEscenarios: 2, pasan: 2, fallan: 0import { Given, When, Then, defineParameterType } from "@cucumber/cucumber";import assert from "node:assert/strict";import { PromoCode } from "../../promo-code.js";
// El último día del código en los escenarios.const LAST_DAY = "2026-11-30";
defineParameterType({ name: "importe", regexp: /\d+,\d{2}/, transformer: (text) => Number(text.replace(",", "")),});
Given("un carrito de {importe} €", function (cents) { this.total = cents;});
Given("el código {word} ha caducado", function (code) { this.today = "2026-12-01";});
When("aplico el código {word}", function (code) { try { this.total = new PromoCode(code, LAST_DAY).apply(this.total, this.today); } catch (e) { this.refusal = e.message; }});
Then("el total es de {importe} €", function (cents) { assert.equal(this.total, cents);});
Then("veo que el código ha caducado", function () { assert.equal(this.refusal, "El código ha caducado");});OK El código da un 10 %OK Un código caducadoEscenarios: 2, pasan: 2, fallan: 0Y si el programador olvida el plazo de vigencia, el código caducado sigue dando un 10 % de descuento, y el escenario «Un código caducado» falla:
package shop;
import java.time.LocalDate;
public class PromoCode { private final String code; private final LocalDate lastDay;
public PromoCode(String code, LocalDate lastDay) { this.code = code; this.lastDay = lastDay; }
// 10 % del total en céntimos. Un código caducado se rechaza. public int apply(int total, LocalDate day) { return total - total / 10; }}FALLA Un código caducado: expected: <El código ha caducado> but was: <null>OK El código da un 10 %Escenarios: 2, pasan: 1, fallan: 1namespace Shop;
public class PromoCode(string code, DateOnly lastDay){ public string Code => code;
// 10 % del total en céntimos. Un código caducado se rechaza. public int Apply(int total, DateOnly day) { return total - total / 10; }}FALLA Un código caducado: Assert.Equal() Failure: Strings differ Expected: "El código ha caducado" Actual: nullOK El código da un 10 %Escenarios: 2, pasan: 1, fallan: 1class PromoCode: def __init__(self, code, last_day): self.code = code self.last_day = last_day
def apply(self, total, day): """10 % del total en céntimos. Un código caducado se rechaza.""" return total - total // 10FALLA Un código caducado: ASSERT FAILED: mensaje: NoneOK El código da un 10 %Escenarios: 2, pasan: 1, fallan: 1export class PromoCode { constructor(code, lastDay) { this.code = code; this.lastDay = lastDay; }
// 10 % del total en céntimos. Un código caducado se rechaza. apply(total, day) { return total - Math.floor(total / 10); }}FALLA Un código caducado: null !== 'El código ha caducado'OK El código da un 10 %Escenarios: 2, pasan: 1, fallan: 1Más precisamente, para curiosos
Estos escenarios no están en el vocabulario del motor del curso, así que no se comprueban en el navegador contra un sistema con un error. Se ejecutan con Cucumber-JVM, Reqnroll, behave y cucumber-js, como en el módulo «Automatización», y su salida está verificada. El descuento se redondea hacia abajo a un céntimo entero (total / 10 con enteros); para totales como 20,00 € no hace diferencia, pero es una decisión que contabilidad tiene que confirmar.
Ejercicio
La matriz y el cambio
1. Cobertura e impacto. El otoño ha terminado. La métrica mostró que la mayoría de los códigos los usaron clientes que ya existían, y el dueño cambia la regla: el código vale solo para el primer pedido del cliente.
Marca los vínculos. Luego, en el segundo paso, elige qué pruebas hay que revisar por el cambio.
Tests
- P-1: Cliente nuevo, una camiseta de 20,00 € con OTONO10: 18,00 €.
- P-2: Cliente nuevo, unos jeans en oferta de 40,00 € con OTONO10: 40,00 €.
- P-3: Cliente nuevo, una camiseta de 20,00 € y unos jeans en oferta de 40,00 € con OTONO10: 58,00 €.
- P-4: El cliente ya pagó un pedido con OTONO10. En un pedido nuevo introduce OTONO10: «El código ya se usó».
- P-5: Un cliente nuevo introduce OTONO10 el 1 de diciembre, después del último día: «El código ha caducado».
- P-6: Cliente fiel con OTONO10, una camiseta de 20,00 €: 18,00 €, no 17,00 €.
- P-7: Un cliente nuevo introduce OTONO10 el 30 de noviembre, el último día: una camiseta de 20,00 € cuesta 18,00 €.
Pulsa la celda donde el test comprueba el requisito; otra vez para quitar la relación. Las flechas se mueven entre las celdas, Espacio o Enter marca.
| Requisitos | P-1: Cliente nuevo, una camiseta de 20,00 € con OTONO10: 18,00 €. | P-2: Cliente nuevo, unos jeans en oferta de 40,00 € con OTONO10: 40,00 €. | P-3: Cliente nuevo, una camiseta de 20,00 € y unos jeans en oferta de 40,00 € con OTONO10: 58,00 €. | P-4: El cliente ya pagó un pedido con OTONO10. En un pedido nuevo introduce OTONO10: «El código ya se usó». | P-5: Un cliente nuevo introduce OTONO10 el 1 de diciembre, después del último día: «El código ha caducado». | P-6: Cliente fiel con OTONO10, una camiseta de 20,00 €: 18,00 €, no 17,00 €. | P-7: Un cliente nuevo introduce OTONO10 el 30 de noviembre, el último día: una camiseta de 20,00 € cuesta 18,00 €. | Cubierto por |
|---|---|---|---|---|---|---|---|---|
| R-1 Un código promocional da un 10 % de descuento. | 0 | |||||||
| R-2 Un código promocional no vale para productos en oferta. | 0 | |||||||
| R-3 Un código se usa en un pedido pagado. Un segundo intento: «El código ya se usó». | 0 | |||||||
| R-4 Un código vale hasta su último día inclusive. Después: «El código ha caducado». | 0 | |||||||
| R-5 Los descuentos no se suman: vale el mayor. | 0 | |||||||
| R-6 En el pedido se ve con qué código se dio el descuento. | 0 | |||||||
| Comprueba | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
La matriz de referencia
- R-1: P-1, P-3
- R-2: P-2, P-3
- R-3: P-4
- R-4: P-5, P-7
- R-5: P-6
- R-6: sin cubrir
¿Qué tests hay que revisar? P-4, P-6. «P-4» se revisa: el cliente ya tiene un pedido, el código se rechaza igualmente, pero con qué mensaje hay que decidirlo. «P-6» no está vinculado con «R-3», pero el cliente fiel tiene pedidos pasados: el código ya no vale para él, y la camiseta pasa a 19,00 € por la fidelidad. «P-1», «P-2», «P-3», «P-5» y «P-7» son con un cliente nuevo y se quedan. Hace falta también una prueba nueva: un cliente con un pedido pasado sin código introduce OTONO10, y el código se rechaza.
«R-6» salió de las pruebas de aceptación (contabilidad) y todavía no tiene prueba. Para el cambio, «P-4» está vinculada con el requisito, pero «P-6» no: el cliente fiel, sin embargo, tiene pedidos pasados, y el código ya no vale para él. Los vínculos de la matriz son el comienzo del análisis, no el final.
Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: Pruebas de componentes · Pruebas en CI · Pruebas de aceptación con el negocio · Medir después del lanzamiento
- Ejercicios sobre el tema: Proyecto: códigos promocionales