miércoles, 15 de diciembre de 2010

Semana 11 - Pruebas unitarias

 
Una prueba unitaria es probar una procion de codigo en sus diferentes esenarios para saber si funciona o no, detectar las fallas de esa porcion de codigo, una prueba unitaria no implica que se ejecute simplemente dentro de una clase, assembly o con acceso a datos o sin ellos.

Para implementar las clases utilice Python y para las pruebas unitarias PyUnit.

Clases:

- Clase clsPoliza.py
import sys
import MySQLdb

#Clase Poliza (Los datos generales)
class Poliza(object):
def __init__(self,IdPoliza,
Numero,AgenteId,ClienteId,CompaniaId,TipoPolizaId,FechaInicio,FechaFin,Precio,FormaPagoId,CoberturaId,PolizaAnterior,self.IdPoliza = IdPoliza
self.Numero = Numero
self.AgenteId = AgenteId
self.ClienteId = ClienteId
self.CompaniaId = CompaniaId
self.TipoPolizaId = TipoPolizaId
self.FechaInicio = FechaInicio
self.FechaFin = FechaFin
self.Precio = Precio
self.FormaPagoId = FormaPagoId
self.CoberturaId = CoberturaId
self.PolizaAnterior = PolizaAnterior
self.BeneficiarioId = BeneficiarioId

#Creacion de Poliza
def AltaPoliza(self) :
try:
#Conectar a base de datos
mysql = MySQLdb.connect(user="root", passwd="ofe2011", db="SEGUROS")
mysql_cursor = mysql.cursor()

#Parametros
parametros =(self.Numero,self.AgenteId,self.ClienteId,self.CompaniaId,self.TipoPolizaId,self.FechaInicio,self.FechaFin,self.Precio,

#Ejecutar el store para crear la poliza
results = mysql_cursor.callproc( "SPC_Poliza",parametros)
#Leer el id de la Poliza recien creada(identity)
rows = mysql_cursor.fetchall()

for row in rows:
#Imprimimos el Id de la Poliza recien creada
print row[0]

#Cerramos conexiones
mysql_cursor.close()
mysql.close()

#Excepcion
except MySQLdb.Error, e:
print "MySQL Error %d: %s" % ( e.args[0], e.args[1] )
sys.exit(1)

#Modificar Poliza
def ModificarPoliza(self) :
try:
#Conectar a base de datos
mysql = MySQLdb.connect(user="root", passwd="ofe2011", db="SEGUROS")
mysql_cursor = mysql.cursor()
#Parametros
parametros = (self.IdPoliza,
self.Numero,self.AgenteId,self.ClienteId,self.CompaniaId,self.TipoPolizaId,self.FechaInicio,self.FechaFin,self.Precio,

#Ejecutar el store para crear la poliza
results = mysql_cursor.callproc( "SPM_Poliza",parametros)

#Cerramos conexiones
mysql_cursor.close()
mysql.close()

#Regresa verdadero cuando la poliza se modifico correctamente
return True

#Excepcion
except MySQLdb.Error, e:
print "MySQL Error %d: %s" % ( e.args[0], e.args[1] )
sys.exit(1)


#Eliminar Poliza
def EliminarPoliza(self) :

try:
#Conectar a base de datos
mysql = MySQLdb.connect(user="root", passwd="ofe2011", db="SEGUROS")
mysql_cursor = mysql.cursor()

#Ejecultar store para eliminar la poliza
results = mysql_cursor.callproc( "SPE_Poliza",self.IdPoliza)

#Cerramos conexiones
mysql_cursor.close()
mysql.close()

#Regresa verdadero cuando la poliza se elimino correctamente
return True

#Excepcion
except MySQLdb.Error, e:
print "MySQL Error %d: %s" % ( e.args[0], e.args[1] )
sys.exit(1)

#Leer Poliza
def LeerPoliza(self) :
try:
#Conectar a base de datos
mysql = MySQLdb.connect(user="root", passwd="ofe2011", db="SEGUROS")
mysql_cursor = mysql.cursor()

#Parametros
parametros = self.IdPoliza
#Ejecutar el store para leer la poliza
mysql_cursor.callproc( "SPL_Poliza", parametros)
rows = mysql_cursor.fetchall()

#Imprimir resultados
for row in rows:
print row[0]
print row[1]
print row[2]
print row[3]
print row[4]
print row[5]
print row[6]
print row[7]
print row[8]
print row[9]
print row[10]
print row[11]
print row[12]

#cerrar conexiones
mysql_cursor.close()
mysql.close()
#Excepcion
except MySQLdb.Error, e:
print "MySQL Error %d: %s" % ( e.args[0], e.args[1] )
sys.exit(1)

- clsAgente.py

import sys
import MySQLdb

#Clase Agente
class Agente(object):
def __init__(self,IdAgente, Clave, Nombres, ApPaterno, ApMaterno) :

self.IdAgente = IdAgente
self.Clave = Clave
self.Nombres = Nombres
self.ApPaterno = ApPaterno
self.ApMaterno = ApMaterno

#Creacion de Agente
def AltaAgente(self) :
try:
#Conectar a base de datos
mysql = MySQLdb.connect(user="root", passwd="ofe2011", db="SEGUROS")
mysql_cursor = mysql.cursor()

#Parametros
parametros = (self.Clave,self.Nombres,self.ApPaterno,self.ApMaterno)
#Ejecutar el store para crear el agente
results = mysql_cursor.callproc( "SPC_Agente",parametros)

#Leer el id del Agente recien creada(identity)
rows = mysql_cursor.fetchall()
for row in rows:
#Imprimimos el Id del Agente recien creado
print row[0]

#Cerramos conexiones
mysql_cursor.close()
mysql.close()

#Excepcion
except MySQLdb.Error, e:
print "MySQL Error %d: %s" % ( e.args[0], e.args[1] )
sys.exit(1)

#Modificar Agente
def ModificarAgente(self) :
try:
#Conectar a base de datos
mysql = MySQLdb.connect(user="root", passwd="ofe2011", db="SEGUROS")
mysql_cursor = mysql.cursor()

#Parametros
parametros = (self.IdAgente, self.Clave,self.Nombres,self.ApPaterno,self.ApMaterno)
#Ejecutar el store para modificar el agente
results = mysql_cursor.callproc( "SPM_Agente",parametros)

#Cerrar conexiones
mysql_cursor.close()
mysql.close()

#Regresa verdadero cuando el agente se modifico correctamente
return True

except MySQLdb.Error, e:
print "MySQL Error %d: %s" % ( e.args[0], e.args[1] )
sys.exit(1)

#Eliminar Agente
def EliminarAgente(self) :
try:
#Conectar a base de datos
mysql = MySQLdb.connect(user="root", passwd="ofe2011", db="SEGUROS")
mysql_cursor = mysql.cursor()

#Ejecutar el store para eliminar el agente
results = mysql_cursor.callproc( "SPE_Agente",self.IdAgente)

#Cerramos conexiones
mysql_cursor.close()
mysql.close()
#Regresa verdadero cuando el agente se elimino correctamente
return True
#Excepcion
except MySQLdb.Error, e:
print "MySQL Error %d: %s" % ( e.args[0], e.args[1] )
sys.exit(1)

#Leer Agente
def LeerAgente(self) :
try:
#Conectar a base de datos
mysql = MySQLdb.connect(user="root", passwd="ofe2011", db="SEGUROS")
mysql_cursor = mysql.cursor()

#Parametros
parametros = self.IdAgente
#Ejecutar el store para leer al agente
mysql_cursor.callproc( "SPL_Agente", parametros)
rows = mysql_cursor.fetchall()

#Imprimir resultados
for row in rows:
print row[0]
print row[1]
print row[2]
print row[3]
print row[4]

#Cerrar conexiones
mysql_cursor.close()
mysql.close()

#Excepcion
except MySQLdb.Error, e:
print "MySQL Error %d: %s" % ( e.args[0], e.args[1] )
sys.exit(1)
Pruebas unitarias:
- TestPoliza.py

import unittest
import clsPoliza

#Pruebas unitarias Clase Poliza
class TestPoliza(unittest.TestCase):
#Verifica si el metodo inserto la poliza; validando si el id que regresa (identity) es mayor que cero
def testAlta(self):
r = [clsPoliza.Poliza("11","8201652",
1,3,4,2,"2010/12/14","2010/12/15","15689",1,3,0,1).AltaPoliza()]

self.assertTrue(r>0)

#Verifica si se modifico la poliza; ya que si se modifico la poliza regresa True
def testModificar(self):
r = [clsPoliza.Poliza("11","8201652",
1,3,4,2,"2010/12/14","2010/12/15","15689",1,3,0,1).ModificarPoliza()]

self.assertTrue(r)

#Verifica si se elimino la poliza; ya que si se elimino la poliza regresa True
def testEliminar(self):
r = [clsPoliza.Poliza("13","8201652",
1,3,4,2,"2010/12/14","2010/12/15","15689",1,3,0,1).ModificarPoliza()]

self.assertTrue(r)

if __name__ == "__main__":
unittest.main()
- TestAgente.py
import unittest
import clsAgente

class TestAgente(unittest.TestCase):
#Verifica si el metodo inserto el agente; validando si el id que regresa (identity) es mayor que cero
def testAlta(self):
r = [clsAgente.Agente("3","9856", "Karina","Montemayor","Garza").AltaAgente()]
self.assertTrue(r>0)

#Verifica si se modifico el agente; ya que si se modifico el agente regresa True
def testModificar(self):
r = [clsAgente.Agente("3","9856", "Karina","Montemayor","Garza").ModificarAgente()]
self.assertTrue(r)

#Verifica si se elimino el agente; ya que si se elimino el agente regresa True
def testEliminar(self):
r = [clsAgente.Agente("3","9856", "Karina","Montemayor","Garza").EliminarAgente()]
self.assertTrue(r)

if __name__ == "__main__":
unittest.main()
Ejecutar pruebas en Terminal:

Archivo con codigo y archivo README:
 

viernes, 10 de diciembre de 2010

miércoles, 8 de diciembre de 2010

Semana 9 - Design Patterns

Patrones de creación

Los patrones de creación proporcionan ayuda a la hora de crear objetos. Ayudan a estructurar y encapsular las decisiones. Un patrón de creación asociado a objetos delegará la instanciación a otro objeto.

Para este tipo de patron nos basaremos en el Patron Factory.

Consiste en utilizar una clase constructora abstracta con unos cuantos métodos definidos y otros abstractos: el dedicado a la construcción de objetos de  un subtipo de un tipo determinado.

Las ventajas de este patrón son:

- Separa la responsabilidad de la creación complja en objetos de apoyo cohesivos.
- Ocultan la logica de creacion potencialmente compleja.
- Permiten introducir estrategias para mejorar el rendimiento de la destión de la memoria, como objetos caché o de reciclaje.

Para este tipo de patrón encontre un video que al menos a mi me dejo muy claro el concepto:http://geeks.ms/blogs/gperez/archive/2009/08/24/patrones-de-dise-241-o-screencast-capitulo-2-patr-243-n-factory.aspx

Para aterrizar este concepto me basare en mi proyecto individual y usare la Poliza.

Actualmente se manejan 4 tipos de poliza; pero como cualquier negocio siempre esta queriendo crecer; en un futuro se quedran agregar nuevos tipos de poliza;  para no rehacer nuestra clase poliza; utilizaremos la clase Poliza abstracta.

Aqui el ejemplo:


Patrones Estructurales

Los patrones estructurales están relacionados con cómo las clases y los objetos se combinan para dar lugar a estructuras más complejas.

Para este tipo de patron nos basaremos en el Patron Composite.

El patrón Composite sirve para construir objetos complejos a partir de otros más simples y similares entre sí, gracias a la composición recursiva y a una estructura en forma de árbol..

Ventajas:

- Permite tratamiento uniforme de objetos simples y complejos así como composiciones recursivas
- Facilita añadir nuevos componentes

Para este patron me apoye en el libro:
UML y Patrones
Una Introducción al anáalisis y diseño orientado a objetos y al proceso unificado
2da Edición
Craig Larman
Pretince Hall

Para aterrizar el patrón me volvere a apoyar en la clase Poliza; pero esta vez en el precio.

Para obtener el precio de una poliza; existen muchas variantes:
- La compañia (cada compañía maneja distintos precios).
- Tipo de Poliza.
- Forma de Pago (en caso de ser a credito aumenta el precion=.
- Cobertura (amplia, terceros, etc.)


Patrones de Comportamiento

Estos patrones de diseño están relacionados con algoritmos y asignación de responsabilidades a los objetos. Los patrones de comportamiento describen no sólamente patrones de objetos o clases sino también patrones de comunicación entre ellos.

Para este tipo de patron nos basaremos en el Patron Strategy.

Define una familia de algoritmos, encapsula uno de ellos y los hace intercambiables. Permite que un algoritmo varie independientemente de los clientes que lo usan. Define un grupo de clases que representan un conjunto de posibles comportamientos. Estos comportamientos pueden ser facilmente intercambiados en una aplicacion, modificando la funcionalidad en cualquier instante.

Ventajas:

- Proporciona una alternativa a la creación de subclases de la clase Context para obtener una variedad de algoritmos o comportamientos
- Proporciona una variedad de implementaciones para el mismo comportamiento

Para este patrón me base en:
http://userpages.umbc.edu/~tarr/dp/lectures/StateStrategy.pdf
http://patronesdediseno.blogspot.com/2009/05/patron-strategy.html
http://www.dofactory.com/Patterns/PatternStrategy.aspx

Para aterrizar este patrón me base en la clase de usuarios y en el metódo para Ingresar al Sistema.

Dependiendo del Rol que tiene cada usuario es a la sección que accesa.
- Si es administrador General accesa a la sección de Administración de Usuarios.
- Si es administrador accesa a la sección de Administraciún de catálogos.
- Si es usuario normal; accesa a la sección de Polizas.

lunes, 6 de diciembre de 2010

Semana 8 - Presentaciones de diagramas de proyectos

Nota: La entrada pasada fue editada; se modificaron los diagramas de caso de uso por diagramas de actividad.

Presentacion de diagramas de Proyecto:

Anexo Diagramas de Caso de Uso:

lunes, 29 de noviembre de 2010

Actividad Septima Semana- Diagramas de Actividad

Modificación de Entrada: De Diagramas de Caso de Uso a Diagramas de Actividad

Diagramas de Actividad:

1- Ingresar al Sistema


2- Administración Usuarios

- Usuarios



- Alta Usuario



- Modificar Usuario


2- Administración catálogos

- Agente



- Alta de Agente



- Modificar Agente



* Nota: Los diagramas de actividad de Administracion de catalogos aplican para todos los catalogos; solo modificando Agente por el tipo de catalogo correspondiente.

3- Póliza



- Alta Poliza

- Modificar Poliza

martes, 16 de noviembre de 2010

Actividad sexta semana - Diagrama de clases

Los Tutoriales de UML en los que me apoye:

http://www.objectmentor.com/resources/articles/umlClassDiagrams.pdf
http://atlas.kennesaw.edu/~dbraun/csis4650/A&D/UML_tutorial/use_case.htm
http://www.dcc.uchile.cl/~psalinas/uml/modelo.html

Utilice la herramienta Umbrello.

Diagrama de Clase: Administración de Usuarios



Diagrama de Clase: Poliza

Poliza
View more documents from OfeCarrera.