Skip to content

Commit a1b8641

Browse files
committed
1.3.5 testing // atualiz article by joaquienlio
1 parent 603aefe commit a1b8641

File tree

1 file changed

+33
-36
lines changed

1 file changed

+33
-36
lines changed

1-js/03-code-quality/05-testing-mocha/article.md

Lines changed: 33 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,43 @@
1-
21
# Test automatizados con mocha
32

4-
Los tests automáticos deben ser considerados como una tarea más.
5-
6-
Debe ser parte del "conocimiento mínimo" de un/a desarrollador/a.
3+
Los tests automáticos deben ser considerados como una tarea más, y son ampliamente usasdos en proyectos reales.
74

85
## ¿Por qué necesitamos tests?
96

10-
Cuando escribimos una función, normalmente imaginamos qué debe hacer: Para ciertos parámetros, que resultado.
7+
Cuando escribimos una función, normalmente imaginamos qué debe hacer: Para ciertos parámetros, qué resultado.
118

129
Durante el desarrollo, podemos comprobar la función ejecutándola y comparando el resultado con la salida esperada. Por ejemplo, podemos hacer eso en la consola.
1310

14-
Si algo esta incorrecto -- entonces corregimos el código, ejecutamos de nuevo, comprobamos resultado -- y así sucesivamente hasta que funcione.
11+
Si algo está incorrecto -- entonces corregimos el código, ejecutamos de nuevo, comprobamos resultado -- y así sucesivamente hasta que funcione.
1512

16-
Pero esa "re-ejecuciones" manuales son imperfectas.
13+
Pero esas "re-ejecuciones" manuales son imperfectas.
1714

1815
**Cuando testeamos un código re-ejecutándolo manualmente es fácil obviar algo.**
1916

20-
Por ejemplo, si estamos creando una función `f`. Escribimos algo de código, testeamos: `f(1)` funciona, pero `f(2)` no funciona. Corregimos el código y ahora funciona `f(2)`. ¿Está completo? Hemos olvidado re-testear `f(1)`. Esto puede resultar error.
17+
Por ejemplo, estamos creando una función `f`. Escribimos algo de código, testeamos: `f(1)` funciona, pero `f(2)` no funciona. Corregimos el código y ahora funciona `f(2)`. ¿Está completo? Hemos olvidado re-testear `f(1)`. Esto puede resultar error.
2118

2219
Todo esto es muy típico. Cuando desarrollamos algo, mantenemos muchos casos de uso posibles en la cabeza. Pero es complicado esperar que un/a programador/a compruebe todos después de cada cambio. Por lo que deviene fácil arreglar una cosa y romper otra.
2320

24-
**Los tests automatizados implican escribir los tests por separado, además del código. Pueden ser ejecutados fácilmente y comprueban todos los casos de uso principales.**
21+
**Los tests automatizados implican escribir los tests por separado, además del código. Ellos ejecutan nuestras funciones de varias formas y comparan los resultados con los esperados.**
2522

26-
## Behavior Driven Development (BDD)
23+
## Desarrollo guiado por comportamiento (Behavior Driven Development, BDD)
2724

28-
Vamos a usar una técnica llamada [Desarrollo guiado por comportamiento](http://en.wikipedia.org/wiki/Behavior-driven_development) o por sus siglas en inglés, BDD. Es una aproximación utilizada en muchos proyectos. BDD no es solo hacer test. Es más.
25+
Vamos a usar una técnica llamada [Desarrollo guiado por comportamiento](https://es.wikipedia.org/wiki/Desarrollo_guiado_por_comportamiento) o por sus siglas en inglés, BDD.
2926

3027
**BDD son tres cosas en uno: tests, documentación y ejemplos.**
3128

32-
Basta de palabras, veamos un ejemplo:
29+
PAra entender BDD, examinaremos un caso de desarrollo práctico:
3330

34-
## Desarrollo de "potencia de un número (pow)": la especificación
31+
## Desarrollo de potencia de un número "pow": la especificación
3532

3633
Digamos que queremos hacer una función `pow(x, n)` que eleve `x` a la potencia de un entero `n`. Asumimos que `n≥0`.
3734

3835
Esta tarea es sólo un ejemplo: Hay un operador `**` en JavaScript que hace eso, pero queremos concentrarnos en el flujo de desarrollo que puede ser aplicado a tareas más complejas.
3936

4037
Antes de crear el código de `pow`, podemos imaginar lo que hace la función y describirlo.
4138

42-
Esa descripción es llamada *especificación* o una spec y se asemeja a:
39+
Esa descripción es llamada *especificación* o "spec" y contiene las descripciones de uso junto con los test para probarlas, como:
40+
4341
```js
4442
describe("pow", function() {
4543

@@ -53,33 +51,35 @@ describe("pow", function() {
5351
Una spec tiene los tres bloques principales mostrados abajo:
5452

5553
`describe("titulo", function() { ... })`
56-
: Qué funcionalidad estamos describiendo. Utilizado para agrupar los "trabajadores" -- los bloques `it`. En nuestro caso estamos describiendo la función `pow`.
54+
: Qué funcionalidad estamos describiendo. En nuestro caso estamos describiendo la función `pow`. Utilizado para agrupar los "workers" (trabajadores) -- los bloques `it`.
5755

5856
`it("titulo", function() { ... })`
5957
: En el título de `it` introducimos una descripción entendible en forma humana del caso de uso. El segundo argumento es la función que testea eso.
6058

6159
`assert.equal(value1, value2)`
6260
: El código dentro del bloque `it`, si la implementación es correcta, debe ejecutar sin errores.
6361

64-
Las funciones `assert.*` son usadas para comprobar cuando `pow` funciona como esperamos. Justo aquí utilizamos una de ellas -- `assert.equal`, que compara argumentos y produce un error si los mismos no son iguales. Arriba se está comprobando que el resultado de `pow(2, 3)` es igual a `8`.
62+
Las funciones `assert.*` son usadas para comprobar cuando `pow` funciona como esperamos. Justo aquí utilizamos una de ellas -- `assert.equal`, que compara argumentos y produce un error si los mismos no son iguales. Arriba se está comprobando que el resultado de `pow(2, 3)` sea igual a `8`. Hay otros tipos de comparaciones y comprobaciones que veremos más adelante.
6563

66-
Hay otros tipos de comparaciones y comprobaciones que veremos más adelante.
64+
La especificación puede ser ejecutada, y hará los los test dictados en el bloque `it`. Lo veremos luego.
6765

6866
## El flujo de desarrollo
6967

7068
El flujo de desarrollo podría asemejarse a:
7169

7270
1. Un spec inicial es escrito, con tests para la funcionalidad más básica.
7371
2. Una implementación inicial es creada.
74-
3. Para comprobar que funciona, ejecutamos el framework de test [Mocha](http://mochajs.org/) (detallado más adelante) que ejecuta el spec. Los errores son mostrados. Hacemos correcciones hasta que todo funciona.
72+
3. Para comprobar que funciona, ejecutamos el framework de test [Mocha](http://mochajs.org/) (detallado más adelante) que ejecuta el spec. Mostrará los errores mientras la funcionalidad no esté completa. Hacemos correcciones hasta que todo funciona.
7573
4. Ahora tenemos una implementación inicial con tests.
7674
5. Añadimos más casos de uso al spec, seguramente no soportados aún por la implementación. Los tests empiezan a fallar.
7775
6. Ir a 3, actualizar la implementación hasta que los tests no den errores.
7876
7. Repetir pasos 3-6 hasta que la funcionalidad este lista.
7977

8078
De tal forma que el desarrollo es iterativo. Escribimos la especificación, la implementamos, aseguramos que los tests pasen y entonces escribimos más tests y volvemos a asegurar que pasen, etc. Al final tenemos una implementación funcionando con tests para ella.
8179

82-
En nuestro caso, el primer paso esta completo: tenemos una spec inicial para `pow`. Vamos a realizar la implementación. Pero antes de comenzar hemos de asegurarnos que los test se ejecutan (no hay errores de sintáxis ni de compilación pero van a fallar todos).
80+
Veamos el flujo de desarrollo en nuestro caso práctico.
81+
82+
El primer paso esta completo: tenemos una spec inicial para `pow`. Ahora, antes de realizar la implementación, usamos algunas librería JavaScript para ejecutar los tests, solo para asegurarnos que funcionen (van a fallar todos).
8383

8484
## La spec en acción
8585

@@ -99,7 +99,7 @@ La página HTML con estos frameworks y la spec de `pow`:
9999
La página puede ser dividida en cinco partes:
100100

101101
1. El `<head>` -- importa librerías de terceros y estilos para los tests.
102-
2. El `<script>` con la función a comprobar, en nuesro caso -- cont el código de `pow`.
102+
2. El `<script>` con la función a comprobar, en nuesro caso -- con el código de `pow`.
103103
3. Los tests -- en nuestro caso un fichero externo `test.js` que contiene un sentencia `describe("pow", ...)`al inicio.
104104
4. El elemento HTML `<div id="mocha">` utilizado para la salida de los resultados.
105105
5. Los test se inician con el comando `mocha.run()`.
@@ -200,7 +200,7 @@ function pow(x, n) {
200200
}
201201
```
202202

203-
Para estar seguros que la función trabaja bien, vamos a hacer comprobaciones para más valores. En lugar de escribir bloques `it`s manualmente, vamos a generarlos con un `for`:
203+
Para estar seguros de que la función trabaja bien, vamos a hacer comprobaciones para más valores. En lugar de escribir bloques `it`s manualmente, vamos a generarlos con un `for`:
204204

205205
```js
206206
describe("pow", function() {
@@ -225,7 +225,7 @@ El resultado:
225225

226226
## `Describe` anidados
227227

228-
Vamos a añadir más tests. Pero antes, hay que apuntar que la función `makeTest` y la instrución `for` deben ser agrupados juntos. No queremos `makeTest` en otros tests, solo se necesita en el `for`: su tarea común es comprobar cómo `pow` eleva dad una potencia concreta.
228+
Vamos a añadir más tests. Pero antes, hay que apuntar que la función `makeTest` y la instrución `for` deben ser agrupados juntos. No queremos `makeTest` en otros tests, solo se necesita en el `for`: su tarea común es comprobar cómo `pow` eleva a una potencia concreta.
229229

230230
Agrupar tests se realiza con `describe`:
231231

@@ -301,7 +301,7 @@ Normalmente, `beforeEach/afterEach` (`before/after`) son usados para realizar la
301301
302302
## Extender los spec
303303
304-
La funcionalidad básica de `pow` está completa. La primera iteracción del desarrollo está hecha. Cuando acabemos de celebrar y beber champán -- sigamos adelante y mejorémosla.
304+
La funcionalidad básica de `pow` está completa. La primera iteración del desarrollo está hecha. Cuando acabemos de celebrar y beber champán -- sigamos adelante y mejorémosla.
305305
306306
Como se dijo, la función `pow(x, n)` está dedicada a trabajar con valores enteros positivos `n`.
307307
@@ -336,10 +336,9 @@ El resultado con los nuevos tests:
336336
El test recién creado falla, porque nuestra implementación no lo soporta. Así es como funciona la metodología BDD: primero escribimos un test que falle y luego realizamos la implementación para que pase.
337337

338338
```smart header="Otras comprobaciones"
339-
340339
Por favor, ten en cuenta la comprobación `assert.isNaN`: ella comprueba que el valor es `NaN`.
341340
342-
Hay otras comprobaciones en Chai también, por ejemplo:
341+
Hay otras comprobaciones en Chai también [Chai](http://chaijs.com), por ejemplo:
343342
344343
- `assert.equal(value1, value2)` -- prueba la igualdad `value1 == value2`.
345344
- `assert.strictEqual(value1, value2)` -- prueba la igualdad estricta `value1 === value2`.
@@ -386,27 +385,25 @@ El spec puede ser usado de tres formas:
386385

387386
Con la especificación, podemos mejorar de forma segura, cambiar, incluso reescribir la función desde cero y estar seguros que seguirá funcionando.
388387

389-
Esto es especialmente importante en proyectos largos cuando una función es usada en muchos sitios. Cuando cambiamos una función, no hay forma manual de comprobar si cada sitio dónde se usaba sigue funcionando correctamente.
388+
Esto es especialmente importante en proyectos largos cuando una función es usada en muchos sitios. Cuando cambiamos una función, no hay forma manual de comprobar si cada sitio donde se usaba sigue funcionando correctamente.
390389

391-
Sin tests, la gente tiene dos maneras:
390+
Sin tests, la gente tiene dos opciones:
392391

393-
1. Realizar el cambio, no importa nada más. Luegos los usuarios encontrán errores y deberán notificarlos. Si podemos abordarlo.
394-
2. La gente tiene miedo de cambiar funciones si el castigo por error es duro. Entonces el código envejecerá de forma descuidada con telarañas, nadie querrá meterse en él y eso no es bueno.
392+
1. Realizar el cambio, no importa nada más. Luego nuestros usuarios encontrán errores porque probablemente fallemos en encontrarlos.
393+
2. Si el castigo por errores es duro, la gente tendrá miedo de hacer cambios en las funciones. Entonces el código envejecerá, nadie querrá meterse en él y eso no es bueno para el desarrollo.
395394

396-
**¡Las pruebas automáticas son lo contrario a eso!**
395+
**¡El test automatizado ayuda a evitar estos problemas!**
397396

398-
Si el proyecto esta cubierto de pruebas, no tendremos ese problema. Podemos correr los tests y hacer multitud de comprabaciones en cuestión de segundos.
397+
Si el proyecto esta cubierto de pruebas, no tendremos ese problema. Podemos correr los tests y hacer multitud de comprobaciones en cuestión de segundos.
399398

400399
**Además, un código bien probado tendrá una mejor arquitectura.**
401400

402401
Naturalmente, porque el código será más fácil de cambiar y mejorar. Pero no sólo eso.
403402

404403
Al escribir tests, el código debe estar organizado de tal manera que cada función tenga un propósito claro y explícito, una entrada y una salida bien definida. Eso implica una buena arquitectura desde el principio.
405404

406-
En la vida real a veces las cosas no son tan fáciles. A veces, es difícil escribir una especificación antes que el código, porque no esta claro aún cómo dee comportarse dicho código. Pero en general, escribir los tests hace el desarrollo más rápido y más estable.
407-
408-
## ¿Qué viene ahora?
405+
En la vida real a veces no es tan fácil. A veces es difícil escribir una especificación antes que el código, porque no está claro aún cómo debe comportarse dicho código. Pero en general, escribir los tests hace el desarrollo más rápido y más estable.
409406

410-
Al final en el tutorial encontrarás muchas tareas respaldadas con pruebas. Ahí tenemos más ejemplos prácticos de tests.
407+
En el tutorial encontrarás más adelante muchas tareas respaldadas con pruebas. Veremos más ejemplos prácticos de tests.
411408

412-
Escribir tests requiere un buen conocimiento de JavaScript. Pero nosotros justo acabamos de empezar a aprenderlo. Así que para comenzar no es necesario que escribas tests, pero sí que seas capaz de leerlos y entenderlos, incluso ejemplos más complejos que aparecerán más adelante en este capítulo.
409+
Escribir tests requiere un buen conocimiento de JavaScript. Pero nosotros justo acabamos de empezar a aprenderlo. Así que para comenzar no es necesario que escribas tests, pero deberías ser capaz de leerlos incluso si son más compleos que en este capítulo.

0 commit comments

Comments
 (0)