[pyar] problema con unittest + nose

Daniel Moisset dmoisset en machinalis.com
Mie Mayo 21 10:08:02 ART 2014


El problema que tenés acá es un combinación de 2 cosas:
 * al hacer reload, el modulo se ejecuta nuevamente, y se define una nueva
clase de exceepcion, si bien el nombre y la definicion de la clase son
iguales, no es la misma identidad (son gemelas en vez de ser la misma).
 * La definición de CommonTests se evalúa una sola vez. En particular, el
argumento del decorador @raises se evalua solo en el momento en que se
carga tu modulo tests.py por primera vez

Por lo tanto, pasan las cosas en el siguiente orden

1) Nose importa tu tests.py
2) tests.py importa common.py, lo que hace que se ejecute el cuerpo de
common.py
3) common.py define una clase "Problemita", que para distinguirlas de otras
clases con el mismo nombre le vamos a llamar "[1]"
4) tests.py termina de importar common.py, sigue corriendo las definiciones
5) se define test_f con @raises, que recibe como argumento a [1]
6) nose empieza a buscar tests, eventualmente encuentra test_f
7) Como hace siempre antes de cada test, llama a setUp
8) setUp hace un reload de common, lo que fuerza la ejecucion del cuerpo de
common.py
9) common.py define una clase "Problemita", que para distinguirlas de otras
clases con el mismo nombre le vamos a llamar "[2]"
10) nose ahora corre test_f
11) test_f llama a common.f . Fijate que esto se evalua recien ahora, asi
que estamos hablando del segundo common, no el primero
12) f hace raise Problemita, lo que busca "Prblemita" en los globales de su
modulo, que es el segundo common. O sea, hace un raise e una excepcion del
tipo [2]
13) @raises encuentra la excepcion, pero estaba esperando para agarrar
excepciones del tipo [1]. Entonces la deja pasar

Espero que se haya entendido.

Fijate que esto se soluciona en el assertraises, porque al usar eso la
busqueda de "Problemita" dentro de "common" se hace el momento de *correr*
el test, en vez del momento de *definirlo*, con lo cual siempre encontras
la version mas actualizada

Saludos,
   D.




2014-05-20 14:47 GMT-03:00 Matias Graña <matias.alejo en gmail.com>:

> Hola;
> tengo un problema corriendo tests que no logro entender. Paso el código,
> creo que es lo más sencillo. Son dos archivos: common.py y tests.py
>
> ----------- common.py -----------
> class Problemita(Exception):
>     def __init__(self):
>         super(Problemita, self).__init__()
>
>     def __str__(self):
>         return 'esto es un problemita'
>
>
> def f():
>     raise Problemita()
>
> ----------- tets.py -----------
> from nose.tools import raises
> import unittest
>
> import common
>
> class CommonTests(unittest.TestCase):
>     def setUp(self):
>         reload(common)
>
>     @raises(common.Problemita)
>     def test_f(self):
>         common.f()
>
>
> Cuando corro los tests yo espero que test_f no falle porque salta una
> excepción. Sin embargo:
>
> $
> nosetests
> E
> ======================================================================
> ERROR: test_f (tests.CommonTests)
> ----------------------------------------------------------------------
> Traceback (most recent call last):
>   File "/usr/local/lib/python2.7/dist-packages/nose/tools/nontrivial.py",
> line 60, in newfunc
>     func(*arg, **kw)
>   File "...../tests.py", line 13, in test_f
>     common.f()
>   File "...../common.py", line 12, in f
>     raise Problemita()
> Problemita: esto es un problemita
>
> ----------------------------------------------------------------------
> Ran 1 test in 0.003s
>
> FAILED (errors=1)
>
> El test deja de fallar si en lugar de @raises(common.Problemita) pongo
> @raises(Exception). También deja de fallar si no pongo el método setUp() de
> CommonTests.
> No termino de entender por qué ese reload puede estar embromando (y lo
> necesito porque tengo otros tests, que acá no pongo, que hacen mocks
> varios).
>
>
> Cualquier ayuda es bienvenida. Gracias!
> -- Matías Graña
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20140521/457448cd/attachment.html>


More information about the pyar mailing list