lunes, 13 de septiembre de 2010

MODULO POO 1 (07/09/10 - 10/09/10)

Los objetos combinan estado (atributos), comportamiento (métodos) e identidad.
El comportamiento a veces cambia el estado del objeto. La identidad es lo que diferencia a un objeto específico del resto.

A partir de una clase generamos instancias u objetos de la misma. Son esos objetos los que recibne invocaciones, tienes un estado y una identidad.

Existe un caso especial, se trata de las clases estáticas que suelen contener métodos estáticos. En este caso los métodos pueden invocarse directamente sobre la clase, no necesitamos crear objetos de la clase para acceder a sus métodos. El estado de un atributo estático afecta a todos los objetos de la clase.

En POO todos los elementos heredan de la clase Object. Al hacerlo todos los métodos de Object también se heredan con la clase.

Ojo: Los tipos primitivos (boolean, float, long, short, int) no son objetos. Los tipos primitivos no heredan de Object, lo que implican que no tiene los métodos "equals", "toString", "hascode", ...
Es mejor usar objetos (la clase envolvente del tipo primitivo) en programación que emplear tipos primitivos. Una de las razones es que siempre podemos usar "equals" para comparar dos objetos entre si. Hay que tener cuidado con distinguir las comparaciones por referencia y por valor.

Colecciones (java.util.Collection)

Hay 3 tipos básicos de colecciones en Java:

- List (lista): Colecciones indexadas donde cada elemento de la lista tiene un índice. Se admiten duplicados.

- Set (conjunto): No se admiten duplicados en un conjunto. Tampoco existe la función "get(objeto)" como en las listas, hay que recorrer el conjunto para obtener el objeto buscado.

-Map (mapa): Está compuesto por un grupo de (claves, valores). Las claves son un set -> no admiten duplicados. Tanto claves como valores pueden ser objetos de cualquier tipo.

Para buscar un objeto en una colección empleamos el método "contains" que se sustenta en el "equals" definidos para el objeto buscado. Relacionadas con las búsquedas están las interfaces "Comparable" y "Comparator".

martes, 7 de septiembre de 2010

MODULO TDD (01/09/10 - 07/09/10)

MODULO TDD (Test Driven Development)

Frameworks a utilizar: TestNG, Mockito, Selenium, Cactus

Objetivo:

Utilizar la metodología TDD para desarrollar una aplicación Java.

Tipos de pruebas:

- Pruebas unitarias
- Pruebas de caja negra/blanca
- Pruebas de integración

Ciclo de TDD:

1.- Elegir un requerimiento que queramos probar
2.- Escribir la prueba correspondiente
3.- Verificar que la prueba falle
4.- Escribir la implementación (código donde está la funcionalidad probada)
5.- Ejecutar las pruebas automatizadas
6.- Eliminación de la duplicación (refactorización)
7.- Actualizar la lista de requerimientos

Características de las pruebas:

- Variables y métodos deben nombrarse de forma inteligible. Además los métodos deben ser breves y concisos por necesidad.

- Cada prueba debe ser reducida de forma que lo que se pruebe sea un único requerimiento concreto del programa. Para facilitar esta tarea hay que procurar que la responsabilidad del programa se reparta en el código entre los distintos métodos y clases.

- Las pruebas deben lanzarse de manera automática siempre. Para que esto sea posible a veces necesitamos crear una interfaz gráfica de usuario (GUI's -> Selenium).

- Las pruebas son reutilizables e independientes, una prueba no debe verse repercutida por la "memoria" de una prueba anterior.

- Cada prueba incluye distintos "escenarios".

TestNG:

Creamos dos carpetas en cada proyecto:

- src -> contiene el código del programa
- Test -> contiene las pruebas asociadas al código

Los directorios que contienen el fichero de código y la prueba deben ser simétricos por lo que ambos archivos no podrán llamarse igual.

Un clase de prueba está relacionada con una implementación y suele contener muchos métodos de prueba.

Ejemplo 1:

@Test

public void pruebaVentaBilletesTerminal{

//Objeto a probar
TerminalAeropuerto ta = new TerminalAeropuerto();

//Escenario de prueba
String destino = "Cádiz";
int nBilletes= 3;

//Invocación
Resultado r= ta.vendeBillete(destino, nBilletes);

//Comprobación mensaje
assert (r==x): "esto no funciona";

}

Ejemplo 2:

@Test

public void ______________(Object o1, Object o2, ..., Object resultadoEsperado){

Object resultadoReal = ta._________();

assert(resultadoReal == resultadoEsperado): "_____________";

}