Package giis.demo.descuento


package giis.demo.descuento
Ejemplo de descuentos a clientes (implementacion MVC con Swing).

Este ejemplo se ha desarrollado siguiendo la secuencia de las historias de usuario que se muestran más abajo. A continuacón de los criterios de aceptación de cada una se indican detalles sobre las partes de la aplicación que se han desarrollado y las pruebas automatizadas correspondientes.
NOTA: Para facilitar el uso de este ejemplo todos los arhcivos se incluyen en un único paquete. En una aplicación donde aumentará el número de archivos de código fuente, deberán clasificarse en los subpaquetes correspondientes (p.e. separando las vistas, controladores y modelos).

  • Como empleado del banco quiero obtener el porcentaje de descuento a aplicar en las compras mediante tarjeta (Problema 3).
    • Criterios de aceptación: Una función que determina el descuento a aplicar para un cliente como se indica a continuación: Los descuentos son acumulables. Si el cliente acaba de abrir una cuenta de crédito obtiene el 15% de descuento en todas sus compras de hoy, si es un cliente habitual con tarjeta de fidelización obtiene un 10% de descuento. Si el cliente tiene un cupón de descuento obtiene el 20% de descuento (no acumulable con el descuento de nuevo cliente).
    • Notas sobre la implementación: Implementad método getDescuento del modelo (no se usa base de datos).
    • Notas sobre pruebas unitarias: Se implementa TestDescuentoFunction en paquete giis.demo.descuento.ut con JUnit 4 para cubrir todas las situaciones correspondientes al diseño de las pruebas del modelo. Se implementan las mismas pruebas (1) distribuyendo los casos de prueba en diferentes métodos de prueba y(2) como pruebas parametrizadas..
      Las mismas pruebas se implementan en estilo BDD utilizando Cucumber (unitarias y de interfaz de usuario) en descuento.ut.cucumber junto con la el mapeo de los pasos y el runner. Tambien incluye pruebas sin parametrizar y parametrizadas (con ejemplos).
    • Notas sobre pruebas del interfaz de usuario: No aplicable.
  • Como empleado del banco quiero visualizar un informe con los descuentos aplicables a los clientes (Problema 3b).
    • Criterios de aceptación: El cálculo del descuento es como el anterior, pero se presentará un informe con el id de cliente y descuento aplicable a todos los clientes en la base de datos (el descuento es calculado al ejecutar el informe).
    • Notas sobre la implementación: En el modelo se añade el método getListaDescuentos utilizando los métodos executeQuery* en la clase DbUtil y un DTO con los datos de la lista de descuentos. La lógica de negocio para el cálculo del descuento se implementa en SQL.
    • Notas sobre pruebas unitarias: Se implementa TestDescuentoDatabase.testConsultaSinParametro en giis.demo.descuento.ut con JUnit 4 para cubrir todas las situaciones correspondientes al diseño de las pruebas del modelo (en este caso solo hay un caso de prueba sin clases inválidad).
      Como en el anterior, las mismas pruebas se implementan en estilo BDD utilizando cucumber en descuento.ut.cucumber.
    • Notas sobre pruebas del interfaz de usuario: No aplicable.
  • Como empleado del banco quiero filtrar la informacion del informe de descuentos por la edad del cliente (Problema 3c).
    • Criterios de aceptación: El cálculo del descuento es como el anterior, pero con un parámetro opcional (edad) que si está presente, oculta los resultados de aquellos con edad menor que la especificada.
    • Notas sobre la implementación: En el modelo se sobrecarga el método getListaDescuentos para admitir el parametro edad. Se crea el atributo edad en la base de datos y se adapta la SQL para usar este parámetro.
    • Notas sobre pruebas unitarias: Se añade TestDescuentoDatabase.testConsultaConParametro en giis.demo.descuento.ut con JUnit 4 para añadir la situación en la que se especifica la edad.
      Como en el anterior, las mismas pruebas se implementan en estilo BDD utilizando cucumber en descuento.ut.cucumber añadiendo al escenario anterior un paso que repersenta la consulta con un valor en la edad.
    • Notas sobre pruebas del interfaz de usuario: No aplicable.
  • Como empleado del banco quiero añadir un interfaz de usuari al informe de descuentos (Problema 3d).
    • Criterios de aceptación: el informe es visualizado y el parámetro de edad indicado desde la pantalla del usuario (se supone que ya está validado el formulario). Al abrir la pantalla se mostrará el informe sin aplicar ningún filtro
    • Notas sobre la implementación: Se añade una vista (DescuentoView.java) y controlador (DescuentoController.java) utilizando el modelo ya implementado.
    • Notas sobre pruebas unitarias: No aplicable.
    • Notas sobre pruebas del interfaz de usuario: Se implementa una prueba simple en giis.demo.descuento.it automatizada con AssertJ Swing que ejecuta los cuatro pasos del caso de prueba.
      Como en los anteriores se implementa el mismo caso de prueba con estilo BDD utilizando cucumber en giis.demo.descuento.it.cucumber junto con el mapeo de los pasos y la configuración.
  • Classes
    Class
    Description
    Controlador para la funcionalidad de visualizacion descuentos de clientes.
    Cada una de las filas que muestran al usuario la lista de clientes y descuentos IMPORTANTE: Cuando se usan los componentes de Apache Commons DbUtils debe mantenerse de forma estricta el convenio de capitalización de Java: - Capitalizar todas las palabras que forman un identificador excepto la primera letra de nombres de métodos y variables
    Acceso a los datos de descuentos, utilizado como modelo para el ejemplo de swing y para las pruebas unitarias y de interfaz de usuario.
    Vista de la pantalla que muestra la lista de descuentos de los usuarios y permite aplicar un filtro por edad
    Se ha generado con WindowBulder y modificado para ser conforme a MVC teniendo en cuenta: - Se elimina main (es invocada desde CarrerasMain) y se incluye Title en el frame - No se incluye ningun handler de eventos pues estos van en el controlador - Las tablas se encierran en JOptionPane para que se puedan visualizar las cabeceras - Se asinga nombre a las tablas si se van a automatizar la ejecucion de pruebas - Incluye al final los metodos adicionales necesarios para acceder al UI desde el controlador