Skip to content
This repository was archived by the owner on Oct 5, 2025. It is now read-only.

Commit 639072d

Browse files
author
MuriloBSD
committed
new post
1 parent aacfde9 commit 639072d

1 file changed

Lines changed: 285 additions & 0 deletions

File tree

Lines changed: 285 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,285 @@
1+
---
2+
layout: post
3+
title: Pruebas unitarias en el Python
4+
author: murilobsd
5+
github: murilobsd
6+
tags: pruebas python2 python3
7+
subtitle: pruebas unitarias en el python en la práctica
8+
category:
9+
---
10+
<!-- Start Writing Below in Markdown -->
11+
12+
```
13+
Write Test --> Test Fails --> Write Code --> Test Passes --> Refactor <--> Write Teste ....
14+
```
15+
16+
El python tiene una biblioteca incorporada para pruebas unitarias
17+
[unittest](https://docs.python.org/3/library/unittest.html). El objetivo de
18+
este post será crear una función para comprobar si hay dígito **0,1,2,3,4,5,6,7,9**
19+
en una determinada frase, en caso afirmativo retorna verdadero si no falso.
20+
21+
Iniciaremos la creación de un archivo con el prefijo de **test**
22+
23+
{% highlight bash %}
24+
$touch test_comprobar_digito.py
25+
{% endhighlight %}
26+
27+
28+
En el archivo vamos a crear una clase que hereda de
29+
[TestCase](https://docs.python.org/3/library/unittest.html#unittest.TestCase),
30+
en la que tendremos varios métodos listos para facilitar en los casos, vea que
31+
los métodos necesitan tener el prefijo de **test**.
32+
33+
{% highlight python %}
34+
# coding:utf-8
35+
36+
import unittest
37+
38+
class TestCheckDigit(unittest.TestCase):
39+
40+
def test_comprobar_digito_ok(self):
41+
pass
42+
{% endhighlight %}
43+
44+
En el método anterior utilizamos el estándar
45+
[Arrange-Act-Assert](http://c2.com/cgi/wiki?ArrangeActAssert), en el cual
46+
primero definimos los **inputs** después **actuamos** en el método y por fin hacemos la
47+
**aserción**.
48+
49+
{% highlight python %}
50+
# coding:utf-8
51+
52+
import unittest
53+
54+
class TestCheckDigit(unittest.TestCase):
55+
56+
def test_comprobar_digito_ok(self):
57+
# input
58+
sentencia = "hoy es el 2 de julio de 2018, Brasil ganó 2x0 de México en la copa del mundo."
59+
60+
# act
61+
hay_digito = comprobar_digito(sentencia)
62+
63+
# assert
64+
self.assertTrue(existe_digito)
65+
{% endhighlight %}
66+
67+
La clase [TestCase](https://docs.python.org/3/library/unittest.html#unittest.TestCase) proporciona [varios métodos para aserciones](https://docs.python.org/3/library/unittest.html#unittest.TestCase.debug)
68+
69+
70+
Para ejecutar la prueba anterior, basta con escribir el comando abajo:
71+
72+
{% highlight bash %}
73+
$python -m unittest test_comprobar_digito
74+
{% endhighlight %}
75+
76+
Tendremos una salida parecida a la siguiente:
77+
78+
```
79+
E
80+
======================================================================
81+
ERROR: test_comprobar_digito_ok (test_comprobar_digito.TestCheckDigit)
82+
----------------------------------------------------------------------
83+
Traceback (most recent call last):
84+
File "test_comprobar_digito.py", line 12, in test_comprobar_digito_ok
85+
hay_digito = comprobar_digito(sentencia)
86+
NameError: global name 'comprobar_digito' is not defined
87+
88+
----------------------------------------------------------------------
89+
Ran 1 test in 0.000s
90+
91+
FAILED (errors=1)
92+
```
93+
94+
Op's pero no importamos ni creamos la función de **buscar_digito**, por eso
95+
que ha devuelto un error. Vamos a arreglar el error.
96+
97+
Crear un archivo:
98+
99+
{% highlight bash %}
100+
$touch comprobar.py
101+
{% endhighlight %}
102+
103+
Dentro de ese archivo creamos la función:
104+
105+
{% highlight python %}
106+
# coding:utf-8
107+
108+
def comprobar_digito():
109+
pass
110+
111+
{% endhighlight %}
112+
113+
Ahora importaremos la función dentro de nuestra prueba.
114+
115+
{% highlight python %}
116+
# coding:utf-8
117+
118+
import unittest
119+
120+
from comprobar import comprobar_digito
121+
122+
class TestCheckDigit(unittest.TestCase):
123+
124+
def test_comprobar_digito_ok(self):
125+
# input
126+
sentencia = "hoy es el 2 de julio de 2018, Brasil ganó 2x0 de México en la copa del mundo."
127+
128+
# act
129+
hay_digito = comprobar_digito(sentencia)
130+
131+
# assert
132+
self.assertTrue(existe_digito)
133+
{% endhighlight %}
134+
135+
De nuevo, ejecute el comando para ejecutar las pruebas:
136+
137+
{% highlight bash %}
138+
$python -m unittest test_comprobar_digito
139+
{% endhighlight %}
140+
141+
Op's más un error, deje que la prueba nos guíe !!!
142+
143+
```
144+
E
145+
======================================================================
146+
ERROR: test_comprobar_digito_ok (test_comprobar_digito.TestCheckDigit)
147+
----------------------------------------------------------------------
148+
Traceback (most recent call last):
149+
File "test_comprobar_digito.py", line 14, in test_comprobar_digito_ok
150+
hay_digito = comprobar_digito(sentencia)
151+
TypeError: comprobar_digito() takes no arguments (1 given)
152+
153+
----------------------------------------------------------------------
154+
Ran 1 test in 0.000s
155+
156+
FAILED (errors=1)
157+
158+
```
159+
160+
Necesitamos recibir un argumento en nuestra función:
161+
162+
{% highlight python %}
163+
# coding:utf-8
164+
165+
def comprobar_digito(sentencia):
166+
pass
167+
168+
{% endhighlight %}
169+
170+
```
171+
F
172+
======================================================================
173+
FAIL: test_comprobar_digito_ok (test_comprobar_digito.TestCheckDigit)
174+
----------------------------------------------------------------------
175+
Traceback (most recent call last):
176+
File "test_comprobar_digito.py", line 17, in test_comprobar_digito_ok
177+
self.assertTrue(hay_digito)
178+
AssertionError: None is not true
179+
180+
----------------------------------------------------------------------
181+
Ran 1 test in 0.000s
182+
183+
FAILED (failures=1)
184+
185+
```
186+
187+
Y la salida mejoró, ahora está volviendo una falta, entonces concertamos
188+
todos los errores de semántica del código ahora realment la aserción
189+
está fallando.
190+
191+
{% highlight python %}
192+
# coding:utf-8
193+
194+
def comprobar_digito(sentencia):
195+
return True
196+
197+
{% endhighlight %}
198+
199+
```
200+
.
201+
----------------------------------------------------------------------
202+
Ran 1 test in 0.000s
203+
204+
OK
205+
```
206+
207+
Perfecto ahora la prueba ha pasado ;)
208+
209+
¡Incluso la prueba pasando quedó aquella duda! Pero es que mi función
210+
está teniendo el comportamiento correcto !? Bueno para eso haremos un nuevo.
211+
prueba.
212+
213+
{% highlight python %}
214+
# coding:utf-8
215+
216+
import unittest
217+
218+
from comprobar import comprobar_digito
219+
220+
class TestCheckDigit(unittest.TestCase):
221+
222+
def test_comprobar_digito_ok(self):
223+
# input
224+
sentencia = "hoy es el 2 de julio de 2018, Brasil ganó 2x0 de México en la copa del mundo."
225+
226+
# act
227+
hay_digito = comprobar_digito(sentencia)
228+
229+
# assert
230+
self.assertTrue(hay_digito)
231+
232+
def test_comprobar_digito_error(self):
233+
# input
234+
sentencia = "Chi chi chi le le le."
235+
236+
# act
237+
hay_digito = comprobar_digito(sentencia)
238+
239+
# assert
240+
self.assertFalse(hay_digito)
241+
{% endhighlight %}
242+
243+
De nuevo ejecutamos las pruebas para ver si todo está bien.
244+
245+
```
246+
F.
247+
======================================================================
248+
FAIL: test_comprobar_digito_error (test_comprobar_digito.TestCheckDigit)
249+
----------------------------------------------------------------------
250+
Traceback (most recent call last):
251+
File "test_comprobar_digito.py", line 27, in test_comprobar_digito_error
252+
self.assertFalse(hay_digito)
253+
AssertionError: True is not false
254+
255+
----------------------------------------------------------------------
256+
Ran 2 tests in 0.000s
257+
258+
FAILED (failures=1)
259+
```
260+
261+
¡Que bueno! Nuestra función realmente no está teniendo el comportamiento previsto,
262+
vamos a refactorizarla.
263+
264+
{% highlight python %}
265+
# coding:utf-8
266+
267+
def comprobar_digito(sentencia):
268+
for carta in sentencia:
269+
if carta.isdigit():
270+
return True
271+
return False
272+
{% endhighlight %}
273+
274+
Realizamos nuevamente las pruebas:
275+
276+
```
277+
..
278+
----------------------------------------------------------------------
279+
Ran 2 tests in 0.000s
280+
281+
OK
282+
```
283+
284+
Perfecto, tenemos una función que cheque si hay dígito o no en una determinada.
285+
y en el caso de que se produzca un error.

0 commit comments

Comments
 (0)