CI3715 Abril. – Julio. 2014
Taller 2
Profesores:
• Alejandro Teruel [email protected]
• Ascander Suarez [email protected]
• Alfonso Reinoza: [email protected]
• Jean Carlos Guzmán [email protected]
• Armando Ruperez [email protected]
• Verificación:
- PyUnit
• Gestión de Configuraciones y Versiones de software:
- Introducción a Git básico
• Equipo:
- Ejercicio sobre CVs y entrevistas
• Tarea 2
3
+ Sistema
Incremento
Dar prioridad a funcionalidades Escriba pruebas de aceptación Ejecute pruebas de aceptación Escriba y Ejecute pruebas Unitarias
Web UI
HttpUnit/Canoo/Selenium
PyUnit /JUnit (Bajo Nivel) FIT/Fitnesse (Alto Nivel)
Lógica del Negocio Cactus Pruebas de Rendimiento y carga JMeter/JUnitPerf GUI Jemmy/Abbot/JFCUnit/…
5 5
PyUnit es un ambiente de pruebas unitarias para
programas en Python creado por Steve Purcell, basándose en el JUnit desarrollado por Erich Gamma y Kent Beck.
Escribir casos de prueba
Ejecución de casos de prueba
Pasa/ Falla? (Resultado esperado = resultado obtenido?)
Consiste en un marco que proporciona todas las
herramientas para el análisis.
marco: conjunto de clases y convenciones para usarlas.
Está integrado en Eclipse a través de un plug-in
gráfico.
Production code
def doubleOf2()
#…
Test code
def
testDouble2F(
):
Casos de prueba en código Python
Marco de pruebas
Caso de prueba = “
secuencia de operaciones +entradas + valores esperados "
"Sustituye el programa en ejecución para comprobar el
comportamiento del programa"
Todo lo que tenemos que hacer es:
Importar unittest
escribir una subclase de unittest.TestCase
añadir a la misma uno o más métodos de prueba if __ name__ == "__main__":
unittest.main ()
TestCase
Clase base para las clases que contienen pruebas
assert * ()
Familia Método para comprobar condiciones
TestSuite
Permite agrupar varios casos de prueba
Testsuite Caso 2 Caso 1
9
import unittest
from stack import *
class StackTester(unittest.TestCase):
def testStack(self): aStack = Stack()
if not aStack.isEmpty():
print(“Stack should be empty!”)
def testStackPush(self): aStackPush(10) (-4)
print(“First element: “ +aStack.pop())
Debe comenzar con “test” class Stack def isEmpty() // ... //
def push(int i) def pop() … class Stack def isEmpty() // ... //
def push(int i) def pop()
…
Son métodos públicos definidos en la clase base
TestCase
Sus nombres comienzan con “assert" y se utilizan en los
métodos de prueba
es. assertTrue (aStack.empty (), “stack should be empty”);
Si la condición es falsa:
La prueba falla
La ejecución salta el resto del método de prueba
El mensaje (si lo hay) se imprime como explicación de por qué
falla
Si la condición es verdadera:
11
Para una condicion booleana
assertTrue(condition, “message for fail”); assertFalse(condition, “message for fail”);
Para objeto, int, long, and valores byte
assertEquals(expected_value, expression);
Para flotante y valores dobles
assertEquals(expected, expression, error);
Para referencias a objetos
assertNull(reference)
assertNotNull(reference)
…
obtenido
def testStack(self): aStack = Stack()
assertTrue(aStack.isEmpty(), “Stack should be empty!”)
13
class StackTester(unittest.TestCase): def testStackEmpty(self):
aStack = Stack()
assertTrue(aStack.isEmpty(), “Stack should be empty!”)
def testStackNotEmpty(self): aStack = Stack()
aStack.push(10)
assertTrue(not aStack.isEmpty(), “Stack should not be empty!”)
def testStackOperations(self): aStack = Stack()
aStack.push(-4)
assertEquals(-4, aStack.pop())
Code Modularization …
Para cada clase de caso de prueba, PyUnit
ejecuta la totalidad de sus métodos de prueba públicos
es decir, aquellos cuyo nombre comienza con "test"
hace caso omiso de todo lo demás ...
Las clases de prueba pueden contener "métodos de
ayuda" a condición de que sean:
no públicas, o
cuyo nombre no comienza con "test"
15
Hay dos casos:
1. Esperamos un comportamiento normal y no hay
excepciones.
2. Esperamos un comportamiento anómalo y luego
una excepción.
try
# Llamamos al método con los parámetros correctos
object.method("Parameter") assertTrue(true) // OK
catch(PossibleException e)
fail(“method should not fail !!!“)
class TheClass
def method(String p)
class TheClass
def method(String p)
17 try:
# llamamos al método con parámetros erróneos
object.method(None)
fail(“method should fail!!”)
catch(PossibleException as e): assertTrue(true) # OK
class TheClass: def method(p):
#can raise PossibleException
class TheClass: def method(p):
ShoppingCart cart; Book book;
def setUp():
self.cart = ShoppingCart()
self.book = Book(“PyUnit", 29.95)
ShoppingCart cart; Book book;
def setUp():
self.cart = ShoppingCart()
self.book = Book(“PyUnit", 29.95) setUp() el método inicializa objeto(s) bajo prueba.
se llama antes de cada método de prueba
tearDown() el método libera objeto(s) bajo prueba
Se llama después de cada método de casos de prueba.
En Eclipse
Crear un nuevo proyecto Bowling
Configurar
19
PyUnit en eclipse
En Bowling
Crear classGame
En Eclipse
Crea un nuevo proyecto
Bowling
Configurar
21
PyUnit en eclipse
En Eclipse
Crea un nuevo proyecto Bowling
Configurar
PyUnit en eclipse
Programar Bowling
Crear testBowling
En Eclipse
Crea un nuevo proyecto Bowling
Configurar
23
PyUnit en eclipse
Programar Bowling
Crear testBowling
Programar casos de prueba
En Eclipse
Crea un nuevo proyecto Bowling
Configurar
PyUnit en eclipse
Programar Bowling
Crear testBowling
Programar casos de prueba
Crear testBowling
Ejecutar como Python unit-test
25
Análisis de dominio de datos
Basado en el clásico juego de la vieja…
Requerimos crear una función que dado un juego de la
vieja, determine quién es el ganador.
Adicionalmente debemos realizar una Suite de Prueba
para certificar nuestro algoritmo.
¿Cuál es el dominio de la función?
Análisis de dominio de datos
Si numeramos las casillas del tablero (0 al 8)
0 12 3 45 6 78
Podemos definir un juego como un arreglo de 9
posiciones donde la posición representa el turno y el valor representa la casilla seleccionada por el jugador { 0, 8 , 2, 1, 6, … }
27
Análisis de dominio de datos
¿Cuántos valores contiene este conjunto?
9! = 362.880 Valores
¿Son todos ellos juegos válidos?
Partamos del ejemplo anterior…
{ 0, 8 , 2, 1, 6, … }
{ 0, 8 , 2, 1, 6, 4, 3, … } En este juego ya el primer jugador ha
ganado…
Después que el ganador logró la línea, es irrelevante
Hagamos el ejercio con PyUnit...
Tenemos la clase tictactoe
Definamos una suite de prueba con:
Casos No Frontera
Casos Frontera
29
Hagamos el ejercio con PyUnit...
Variables que tenemos
Rango de la función? (0,1,2,-1)
Turno de Victoria (Ganador?)
Tipo de Victoria (Fila, Columna, Diagonal)
Número de Fila, Columna o Diagonal
• Verificación:
- PyUnit
• Gestión de Configuraciones y Versiones de software:
- Introducción a Git básico
• Equipo:
- Ejercicio sobre CVs y entrevistas
• Tarea 2
¿ Qué es?
¿ Qué hace?
¿Cómo funciona?
¿ Cómo usarlo?
Git Directory (Repository)
commit (en nomenclatura de la Teoría: remite y registra en repositorio local
Número de versión por hash (SHA-1) del commit:
d921970aadf03b3cf0e71becdaab3147ba71cdef
EI hash corto: d92197
File New Project PyDev Project
37
Crea una carpeta: miRepositorioGit
Botón derecho sobre el proyecto BowlingGame : Team → Share Project → Git Next
43
Botón derecho en Bowling Team Show in History
45
47
49
51
53
55
57
59
Ejecutamos el merge
61
63
Merge tool
65
67
69
71
81
• Verificación:
- PyUnit
• Gestión de Configuraciones y Versiones de software:
- Introducción a Git básico
• Equipo:
- Ejercicio sobre CVs y entrevistas
• Tarea 2
Introducción a los CVs y
entrevistas
Reunir los estudiantes en grupos de 2-3.
Cada grupo representa a una empresa desarrolladora de software.
Darle a cada grupos 3 CVs de gente fuera del grupo para que seleccionen UN
candidato a entrevistar para un empleo en la empresa desarrolladora de software que con base en el CV.
Una vez que decidan la selección, conducir una discusión en grupo centrado en:
¿Qué elementos formales del CV les llamó la atención positiva o negativamente? (alguno se destacó en presentación o claridad?).
¿En base a qué criterios seleccionaron un candidato sobre los demás? [Que digan sus criterios de selección, sin nombrar nombres).
En forma anónima cada equipo le colocará una "nota" que representa su interés en los CVs que estudió (desde 1, que representa cero interés en entrevistar a 5 que representa muchísimo interés por entrevistar).
87
Introducción a los CVs y
entrevistas
Buscar una forma en que cada estudiante escoja un currículo de alguien que desconoce en el salón
-o al men-os que n-o c-on-oce much-o.
Darle cinco minutos a que revise el currículo.
Darle 5 minutos a la mitad del salón para que "entreviste" la persona cuyo CV tiene.
Luego, otros 5 minutos para que los entrevistados pasen a ser entrevistadores.
En forma anónima cada estudiante marca un papelito como Sí/no emplearía a quien entrevistó. Se recogen los papelitos y se anotan los resultados en pizarra.
Llevar una discusión:
¿qué razones piensan ellos que pesaron para otorgar los sí? [Mientras entrevistan estar pendiente de lenguaje corporal para
comentarlos.
¿Se vieron nervios? (gente sentada en el borde de su asiento, brazos cruzados, recogidos/retraídos). ¿Se vieron "sobrados? (desparramados en asientos)?
¿Había quienes evitaban contacto visual? (estar pendiente del CV en vez del entrevistado, entre los entrevistadores...). Seleccionen un par de elementos con que ustedes se sientan cómodos y menciónenlos.
La idea es ver si pueden empezar a sensibilizar a los estudiantes que la comunicación se hace por varios canales con
características distintas:
escrita no es lo mismo que cara-a-cara.
Lo que hace el cuerpo puede enviar una señal contradictoria a lo que se dice y esta señal puede calificar
• Verificación:
- PyUnit
• Gestión de Configuraciones y Versiones de software:
- Introducción a Git básico
• Equipo:
- Ejercicio sobre CVs y entrevistas • Tarea 2
89