Browse Source

README-es.md edited on August 1, 2016 - 2:10pm

Jose R Ortiz Ubarri 8 years ago
parent
commit
6980e21d2f
1 changed files with 37 additions and 34 deletions
  1. 37
    34
      README-es.md

+ 37
- 34
README-es.md View File

1
-#Pruebas y pruebas unitarias
1
+# Pruebas y pruebas unitarias
2
 
2
 
3
 ![main1.png](images/main1.png)
3
 ![main1.png](images/main1.png)
4
 ![main2.png](images/main2.png)
4
 ![main2.png](images/main2.png)
5
 ![main3.png](images/main3.png)
5
 ![main3.png](images/main3.png)
6
 
6
 
7
-[Verano 2016 - Ive]
7
+[Verano 2016 - Ive - Coralys]
8
 
8
 
9
 Como habrás aprendido en experiencias de laboratorio anteriores, lograr que un programa compile es solo una pequeña parte de programar. El compilador se encargará de decirte si hubo errores de sintaxis, pero no podrá detectar errores en la lógica del programa. Es muy importante probar las funciones del programa para validar que producen los resultados correctos y esperados.
9
 Como habrás aprendido en experiencias de laboratorio anteriores, lograr que un programa compile es solo una pequeña parte de programar. El compilador se encargará de decirte si hubo errores de sintaxis, pero no podrá detectar errores en la lógica del programa. Es muy importante probar las funciones del programa para validar que producen los resultados correctos y esperados.
10
 
10
 
11
-Una manera de hacer estas pruebas es “a mano”, esto es, corriendo el programa múltiples veces, ingresando valores representativos (por medio del teclado) y visualmente verificando que el programa devuelve los valores esperados. Otra forma más conveniente es implementar funciones dentro del programa cuyo propósito es verificar que otras funciones produzcan resultados correctos. En esta experiencia de laboratorio practicarás ambos métodos de verificación.
11
+Una manera de hacer estas pruebas es “a mano”, esto es, corriendo el programa múltiples veces, ingresando valores representativos (por medio del teclado) y visualmente verificando que el programa devuelve los valores esperados. Otra forma más conveniente es implementar funciones dentro del programa cuyo propósito es verificar que otras funciones produzcan resultados correctos. En esta experiencia de laboratorio, practicarás ambos métodos de verificación.
12
 
12
 
13
-##Objetivos:
13
+
14
+## Objetivos:
14
 
15
 
15
 1. Validar el funcionamiento de varias funciones haciendo pruebas "a mano".
16
 1. Validar el funcionamiento de varias funciones haciendo pruebas "a mano".
16
 2. Crear pruebas unitarias para validar funciones, utilizando la función `assert` 
17
 2. Crear pruebas unitarias para validar funciones, utilizando la función `assert` 
17
 
18
 
18
 
19
 
19
 
20
 
20
-##Pre-Lab:
21
+## Pre-Lab:
21
 
22
 
22
 Antes de llegar al laboratorio debes:
23
 Antes de llegar al laboratorio debes:
23
 
24
 
27
 
28
 
28
 3. Haber estudiado los conceptos e instrucciones para la sesión de laboratorio.
29
 3. Haber estudiado los conceptos e instrucciones para la sesión de laboratorio.
29
 
30
 
30
-4. Haber tomado el quiz Pre-Lab que se encuentra en Moodle.
31
+4. Haber tomado el quiz Pre-Lab disponible en Moodle.
31
 
32
 
32
 ---
33
 ---
33
 
34
 
34
 ---
35
 ---
35
 
36
 
36
-##Haciendo pruebas a una función. 
37
+## Haciendo pruebas a una función. 
37
 
38
 
38
 Cuando probamos la validez de una función debemos probar casos que activen los diversos resultados de la función. 
39
 Cuando probamos la validez de una función debemos probar casos que activen los diversos resultados de la función. 
39
 
40
 
40
 ---
41
 ---
41
 
42
 
42
-**Ejemplo 1:** si fueras a validar una función `esPar(unsigned int n)` que determina si un entero positivo *n* es par, deberías hacer pruebas a la función tanto con números pares como números impares. Un conjunto adecuado de pruebas para dicha función podría ser:
43
+**Ejemplo 1:** Si fueras a validar una función `esPar(unsigned int n)` que determina si un entero positivo *n* es par, deberías hacer pruebas a la función tanto con números pares como números impares. Un conjunto adecuado de pruebas para dicha función podría ser:
43
 
44
 
44
 
45
 
45
 |   Prueba   | Resultado esperado |
46
 |   Prueba   | Resultado esperado |
49
 
50
 
50
 ---
51
 ---
51
 
52
 
52
-**Ejemplo 2:** Digamos que un amigo ha creado una función `unsigned int rangoEdad(unsigned int edad)` que se supone que devuelva 0 si la edad está entre 0 y 5 (inclusive), 1 si la edad está entre 6 y 18 inclusive, y 2 si la edad es mayor de 18. Una fuente común de errores en funciones como esta son los valores próximos a los límites de cada rango, por ejemplo, el número 5 se presta para error si el programador  no usó una comparación correcta. Un conjunto adecuado  de pruebas para la función `rangoEdad` sería:
53
+**Ejemplo 2:** Digamos que un amigo ha creado una función `unsigned int rangoEdad(unsigned int edad)` que se supone que devuelva 0 si la edad está entre 0 y 5 (inclusivo), 1 si la edad está entre 6 y 18 (inclusivo), y 2 si la edad es mayor de 18. Una fuente común de errores en funciones como esta son los valores próximos a los límites de cada rango. Por ejemplo, el número 5 se presta para error si el programador no usó una comparación correcta. Un conjunto adecuado de pruebas para la función `rangoEdad` sería:
53
 
54
 
54
 |      Prueba     | Resultado esperado |
55
 |      Prueba     | Resultado esperado |
55
 |-----------------|--------------------|
56
 |-----------------|--------------------|
63
 
64
 
64
 ---
65
 ---
65
 
66
 
66
-###La función `assert`
67
+### La función `assert`
67
 
68
 
68
 
69
 
69
-La función `assert(bool expression)` se puede utilizar como herramienta rudimentaria para validar de funciones. `assert` tiene un funcionamiento muy sencillo y poderoso.  Si la expresión que colocamos entre los paréntesis de `assert` es *cierta* la función permite que el programa continúe con la próxima instrucción. De lo contrario, si la expresión que colocamos entre los paréntesis es *falsa*, la función `assert` hace que el programa termine e imprime un mensaje al terminal que informa al usuario sobre la instrucción de `assert` que falló. 
70
+La función `assert(bool expression)` se puede utilizar como herramienta rudimentaria para validar funciones. `assert` tiene un funcionamiento muy sencillo y poderoso. Si la expresión que colocamos entre los paréntesis de `assert` es *cierta* la función permite que el programa continúe con la próxima instrucción. De lo contrario, si la expresión que colocamos entre los paréntesis es *falsa*, la función `assert` hace que el programa termine e imprime un mensaje al terminal que informa al usuario sobre la instrucción de `assert` que falló. 
70
 
71
 
71
 Por ejemplo, el siguiente programa correrá de principio a fin sin problemas pues todos las expresiones incluidas en los paréntesis de los asserts evalúan a *true*.
72
 Por ejemplo, el siguiente programa correrá de principio a fin sin problemas pues todos las expresiones incluidas en los paréntesis de los asserts evalúan a *true*.
72
 
73
 
93
 
94
 
94
 ---
95
 ---
95
 
96
 
96
-El siguiente programa no correrá hasta el final pues el segundo `assert` (`assert(j == i);`)  contiene una expresión  (`j==i`) que evalúa a *false*.
97
+El siguiente programa no correrá hasta el final pues el segundo `assert` (`assert(j == i);`)  contiene una expresión  (`j == i`) que evalúa a *false*.
97
 
98
 
98
 ---
99
 ---
99
 
100
 
125
 
126
 
126
 El programa no ejecuta más instrucciones después de la línea 8.
127
 El programa no ejecuta más instrucciones después de la línea 8.
127
 
128
 
128
-####¿Cómo usar assert para validar funciones?
129
 
129
 
130
-Digamos que deseas automatizar la validación de la función `rangoEdad`. Un forma de hacerlo es crear una función que llame a la función `rangoEdad` con diversos argumentos y verifique que lo devuelto concuerde con el resultado esperado. Si incluimos cada comparación entre lo devuelto por `rangoEdad` y el resultado esperado dentro de un `assert`, obtenemos una función que se ejecuta de principio a fin solo si todas las invocaciones devolvieron el resultado esperado.
130
+#### ¿Cómo usar assert para validar funciones?
131
+
132
+Digamos que deseas automatizar la validación de la función `rangoEdad`. Un forma de hacerlo es crear una función que llame a la función `rangoEdad` con diversos argumentos y verifique que lo devuelto concuerde con el resultado esperado. Si incluimos cada comparación entre lo devuelto por `rangoEdad`, y el resultado esperado dentro de un `assert`, obtenemos una función que se ejecuta de principio a fin solo si todas las invocaciones devolvieron el resultado esperado.
131
 
133
 
132
 ---
134
 ---
133
 
135
 
162
 ---
164
 ---
163
 
165
 
164
 
166
 
165
-##Sesión de laboratorio:
167
+## Sesión de laboratorio:
166
 
168
 
167
-###Ejercicio 1: Diseñar pruebas "a mano"
169
+### Ejercicio 1: Diseñar pruebas "a mano"
168
 
170
 
169
-En este ejercicio practicarás cómo diseñar pruebas para validar funciones, utilizando solamente la descripción de la función y la interfaz gráfico que se usa para interactuar con la función. 
171
+En este ejercicio practicarás cómo diseñar pruebas para validar funciones, utilizando solamente la descripción de la función y el interfaz gráfico que se usa para interactuar con la función. 
170
 
172
 
171
 El ejercicio **NO requiere programación**, solo requiere que entiendas la descripción de la función, y tu habilidad para diseñar pruebas. Este ejercicio y el Ejercicio 2 son una adaptación de la actividad descrita en [1].
173
 El ejercicio **NO requiere programación**, solo requiere que entiendas la descripción de la función, y tu habilidad para diseñar pruebas. Este ejercicio y el Ejercicio 2 son una adaptación de la actividad descrita en [1].
172
 
174
 
175
+
173
 **Ejemplo 3.** Supón que una amiga te provee un programa. Ella asegura que el programa resuelve el siguiente problema: 
176
 **Ejemplo 3.** Supón que una amiga te provee un programa. Ella asegura que el programa resuelve el siguiente problema: 
174
 
177
 
175
 `"dados tres enteros, despliega el valor máximo".` 
178
 `"dados tres enteros, despliega el valor máximo".` 
176
 
179
 
177
-Supón que el programa tienen una interfaz como la siguiente:
180
+Supón que el programa tiene una interfaz como la siguiente:
178
 
181
 
179
 ---
182
 ---
180
 
183
 
192
 
195
 
193
 Si alguno de estos tres casos no da el resultado esperado, el programa de tu amiga no funciona. Por otro lado, si los tres casos funcionan, entonces el programa tiene una probabilidad alta de estar correcto.
196
 Si alguno de estos tres casos no da el resultado esperado, el programa de tu amiga no funciona. Por otro lado, si los tres casos funcionan, entonces el programa tiene una probabilidad alta de estar correcto.
194
 
197
 
195
-####Funciones para validar
198
+#### Funciones para validar
196
 
199
 
197
 En este ejercicio estarás diseñando pruebas que validen varias versiones de las funciones que se describen abajo. Cada una de las funciones tiene cuatro versiones, "Alpha", "Beta", "Gamma" y "Delta".
200
 En este ejercicio estarás diseñando pruebas que validen varias versiones de las funciones que se describen abajo. Cada una de las funciones tiene cuatro versiones, "Alpha", "Beta", "Gamma" y "Delta".
198
 
201
 
199
 
202
 
200
-* **3 Sorts:** una función que recibe tres "strings" y los ordena en orden lexicográfico (alfabético). Por ejemplo, dados `jirafa`, `zorra`, y `coqui`, los ordena como: `coqui`, `jirafa`, y `zorra`.  Para simplificar el ejercicio, solo usaremos "strings" con letras minúsculas. La Figura 5 muestra la interfaz de esta función. Nota que hay un menú para seleccionar la versión implementada.
203
+* **3 Sorts:** Una función que recibe tres "strings" y los ordena en orden lexicográfico (alfabético). Por ejemplo, dados `jirafa`, `zorra`, y `coqui`, los ordena como: `coqui`, `jirafa`, y `zorra`.  Para simplificar el ejercicio, solo usaremos "strings" con letras minúsculas. La Figura 5 muestra la interfaz de esta función. Nota que hay un menú para seleccionar la versión implementada.
201
 
204
 
202
     ---
205
     ---
203
 
206
 
209
 
212
 
210
 
213
 
211
 
214
 
212
-* **Dice:** cuando el usuario marca el botón `Roll them!`, el programa genera dos enteros aleatorios entre 1 y 6. El programa informa la suma de los enteros aleatorios. 
215
+* **Dice:** Cuando el usuario marca el botón `Roll them!`, el programa genera dos enteros aleatorios entre 1 y 6. El programa informa la suma de los enteros aleatorios. 
213
 
216
 
214
     ---
217
     ---
215
 
218
 
219
 
222
 
220
     ---
223
     ---
221
 
224
 
222
-* **Rock, Paper, Scissors:** cada uno de los jugadores entra su jugada y el programa informa quién ganó. La Figura 7 muestra las opciones en las que un objeto le gana a otro. La interfaz del juego se muestra en la  Figura 8.
225
+* **Rock, Paper, Scissors:** Cada uno de los jugadores entra su jugada y el programa informa quién ganó. La Figura 7 muestra las opciones en las que un objeto le gana a otro. La interfaz del juego se muestra en la Figura 8.
223
 
226
 
224
     ---
227
     ---
225
 
228
 
250
 
253
 
251
     ---
254
     ---
252
 
255
 
253
-####Instrucciones
256
+#### Instrucciones
254
 
257
 
255
 1. Para cada una de las funciones descritas arriba, escribe en tu libreta las pruebas que harás para determinar la validez de cada implementación (Alpha, Beta, Gamma y Delta). Para cada función, piensa en los errores lógicos que el programador pudo haber cometido y escribe pruebas que determinen si se cometió ese error. Para cada prueba, escribe los valores que utilizarás y el resultado que esperas obtener.
258
 1. Para cada una de las funciones descritas arriba, escribe en tu libreta las pruebas que harás para determinar la validez de cada implementación (Alpha, Beta, Gamma y Delta). Para cada función, piensa en los errores lógicos que el programador pudo haber cometido y escribe pruebas que determinen si se cometió ese error. Para cada prueba, escribe los valores que utilizarás y el resultado que esperas obtener.
256
 
259
 
274
 
277
 
275
 
278
 
276
 
279
 
277
-###Ejercicio 2: Hacer pruebas "a mano"
280
+### Ejercicio 2: Hacer pruebas "a mano"
278
 
281
 
279
-El proyecto `testing` implementa varias versiones de cada una de las cuatro funciones simples que se decribieron en el Ejercicio 1. Algunas o todas las implementaciones pueden estar incorrectas. Tu tarea es, usando las pruebas que diseñaste en el Ejercicio 1, probar las versiones de cada función para  determinar cuáles de ellas, si alguna, están  implementadas correctamente.
282
+El proyecto `testing` implementa varias versiones de cada una de las cuatro funciones simples que se decribieron en el Ejercicio 1. Algunas o todas las implementaciones pueden estar incorrectas. Tu tarea es, usando las pruebas que diseñaste en el Ejercicio 1, probar las versiones de cada función para determinar cuáles de ellas, si alguna, están implementadas correctamente.
280
 
283
 
281
 Este ejercicio **NO requiere programación**, debes hacer las pruebas **sin mirar el código.**
284
 Este ejercicio **NO requiere programación**, debes hacer las pruebas **sin mirar el código.**
282
 
285
 
283
-####Instrucciones
286
+#### Instrucciones:
284
 
287
 
285
 1. Carga a `QtCreator` el proyecto `Testing`. Hay dos maneras de hacer esto:
288
 1. Carga a `QtCreator` el proyecto `Testing`. Hay dos maneras de hacer esto:
286
 
289
 
287
-    * Utilizando la máquina virtual: Haz doble “click” en el archivo `Testing.pro` que se encuentra  en el directorio `/home/eip/labs/testing-testing` de la máquina virtual.
290
+    * Utilizando la máquina virtual: Haz doble “click” en el archivo `Testing.pro` que se encuentra en el directorio `/home/eip/labs/testing-testing` de la máquina virtual.
288
     * Descargando la carpeta del proyecto de `Bitbucket`: Utiliza un terminal y escribe el commando `git clone http:/bitbucket.org/eip-uprrp/testing-testing` para descargar la carpeta `tema-nombre` de `Bitbucket`. En esa carpeta, haz doble “click” en el archivo `Testing.pro`.
291
     * Descargando la carpeta del proyecto de `Bitbucket`: Utiliza un terminal y escribe el commando `git clone http:/bitbucket.org/eip-uprrp/testing-testing` para descargar la carpeta `tema-nombre` de `Bitbucket`. En esa carpeta, haz doble “click” en el archivo `Testing.pro`.
289
 
292
 
290
 2. Configura el proyecto y corre el programa. Verás una pantalla similar a la siguiente:
293
 2. Configura el proyecto y corre el programa. Verás una pantalla similar a la siguiente:
299
 
302
 
300
 3. Selecciona el botón de `3 Sorts` y obtendrás la interfaz de la Figura 5.
303
 3. Selecciona el botón de `3 Sorts` y obtendrás la interfaz de la Figura 5.
301
 
304
 
302
-4. La "Version Alpha" en la caja indica que estás corriendo la primera versión del algoritmo `3 Sorts`. Usa las pruebas que escribiste en el Ejercicio 1 para validar la "Version Alpha". Luego, haz lo mismo para las versiones Beta, Gamma y Delta. Escribe cuáles son las versiones correctas (si alguna) de la función y porqué. Recuerda que, para cada función, algunas o todas las implementaciones pueden estar incorrectas. Además, especifica cuáles pruebas te permitieron determinar  las  versiones que son incorrectas.
305
+4. La "Version Alpha" en la caja indica que estás corriendo la primera versión del algoritmo `3 Sorts`. Usa las pruebas que escribiste en el Ejercicio 1 para validar la "Version Alpha". Luego, haz lo mismo para las versiones Beta, Gamma y Delta. Escribe cuáles son las versiones correctas (si alguna) de la función y porqué. Recuerda que, para cada función, algunas o todas las implementaciones pueden estar incorrectas. Además, especifica cuáles pruebas te permitieron determinar las versiones que son incorrectas.
303
 
306
 
304
 
307
 
305
 
308
 
306
-###Ejercicio 3: Usar `assert` para realizar pruebas unitarias
309
+### Ejercicio 3: Usar `assert` para realizar pruebas unitarias
307
 
310
 
308
 Hacer pruebas "a mano" cada vez que corres un programa es una tarea que resulta "cansona" bien rápido. En los ejercicios anteriores lo hiciste para unas pocas funciones simples. ¡Imagínate hacer lo mismo para un programa complejo completo como un navegador o un procesador de palabras!
311
 Hacer pruebas "a mano" cada vez que corres un programa es una tarea que resulta "cansona" bien rápido. En los ejercicios anteriores lo hiciste para unas pocas funciones simples. ¡Imagínate hacer lo mismo para un programa complejo completo como un navegador o un procesador de palabras!
309
 
312
 
310
-Las *pruebas unitarias* ayudan a los programadores a validar códigos y simplificar el proceso de depuración ("debugging") a la vez que evitan la tarea tediosa de hacer pruebas a mano en cada ejecución.
313
+Las *pruebas unitarias* ayudan a los programadores a validar códigos y simplificar el proceso de depuración ("debugging"), a la vez que evitan la tediosa tarea de hacer pruebas a mano en cada ejecución.
311
 
314
 
312
-####Instrucciones:
315
+#### Instrucciones:
313
 
316
 
314
 1. En el menú de `QtCreator`, ve a `Build` y selecciona `Clean Project "Testing"`. Luego ve a `File` y selecciona `Close Project "Testing"`.
317
 1. En el menú de `QtCreator`, ve a `Build` y selecciona `Clean Project "Testing"`. Luego ve a `File` y selecciona `Close Project "Testing"`.
315
 
318
 
321
 
324
 
322
     Tu tarea es escribir pruebas unitarias para cada una de las funciones para identificar los resultados erróneos. ** No necesitas reescribir las funciones para corregirlas. **
325
     Tu tarea es escribir pruebas unitarias para cada una de las funciones para identificar los resultados erróneos. ** No necesitas reescribir las funciones para corregirlas. **
323
 
326
 
324
-    Para la función `fact` se provee la función  `test_fact()`  como función de prueba unitaria. Si invocas esta función desde `main`, compilas y corres el programa debes obtener un mensaje como el siguiente:
327
+    Para la función `fact` se provee la función  `test_fact()` como función de prueba unitaria. Si invocas esta función desde `main`, compilas y corres el programa debes obtener un mensaje como el siguiente:
325
 
328
 
326
      `Assertion failed: (fact(2) == 2), function test_fact, file ../UnitTests/ main.cpp, line 69.`
329
      `Assertion failed: (fact(2) == 2), function test_fact, file ../UnitTests/ main.cpp, line 69.`
327
 
330
 
339
 
342
 
340
 ---
343
 ---
341
 
344
 
342
-##Entregas
345
+## Entregas
343
 
346
 
344
 1. Utiliza "Entrega 1" en Moodle para entregar la tabla con las pruebas que diseñaste en el Ejercicio 1 y que completaste en el Ejercicio 2 con los resultados de las pruebas de las funciones.
347
 1. Utiliza "Entrega 1" en Moodle para entregar la tabla con las pruebas que diseñaste en el Ejercicio 1 y que completaste en el Ejercicio 2 con los resultados de las pruebas de las funciones.
345
 
348
 
346
-2. Utiliza "Entrega 2" en Moodle para entregar el archivo `main.cpp` que contiene las funciones `test_isALetter`, `test_isValidTime`, `test_gcd` y sus invocaciones. Recuerda utilizar buenas prácticas de programación, incluir el nombre de los programadores y documentar tu programa.
349
+2. Utiliza "Entrega 2" en Moodle para entregar el archivo `main.cpp` que contiene las funciones `test_isALetter`, `test_isValidTime`, `test_gcd` y sus invocaciones. Recuerda utilizar buenas prácticas de programación, al incluir el nombre de los programadores y documentar tu programa.
347
 
350
 
348
 ---
351
 ---
349
 
352