run - ¿Cómo puedo acceder a las variables configuradas en la función de configuración de las pruebas en la red de python?
run nosetests (2)
Como ya se sugirieron los comentarios a su pregunta, simplemente cambie a clases y use variables de instancia como self.foo
. Así se debe hacer.
Si insistes en no usar clases, prueba variables global
. Aunque no escuchaste esto de mí.
from nose.tools import *
foo = None
def setup():
global foo # Ugly.
foo = 10
def teardown():
global foo # Ugly.
foo = None
@with_setup(setup, teardown)
def test_foo_value():
assert_equal(foo, 10)
Una tercera variante podría ser usar un diccionario para sus valores. Esto es un poco menos feo pero horriblemente torpe:
from nose.tools import *
_globals = {''foo'': None}
def setup():
_globals[''foo''] = 10
def teardown():
_globals[''foo''] = None
@with_setup(setup, teardown)
def test_foo_value():
foo = _globals[''foo'']
assert_equal(foo, 10)
Creo que lo que estoy tratando de hacer es bastante simple. Quiero inicializar un par de variables en una función de configuración de prueba, y luego usarlas en las funciones de prueba que están decoradas con esa configuración. El siguiente ejemplo trivial ilustra lo que quiero decir:
from nose.tools import *
def setup():
foo = 10
def teardown():
foo = None
@with_setup(setup, teardown)
def test_foo_value():
assert_equal(foo, 10)
Esto resulta en:
$ nosetests tests/test_foo.py
E
======================================================================
ERROR: test_foo.test_foo_value
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/mtozzi/.virtualenvs/foo/local/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
self.test(*self.arg)
File "/home/mtozzi/code/foo/tests/test_foo.py", line 12, in test_foo_value
assert_equal(foo, 10)
NameError: global name ''foo'' is not defined
----------------------------------------------------------------------
Ran 1 test in 0.006s
FAILED (errors=1)
Con el antiguo estilo de prueba de unidad, podría establecerlas como variables de instancia en la clase de prueba, pero pensé que las pruebas no requieren que uses clases. También he considerado establecerlos como variables globales del paquete, pero eso no parece ser una buena práctica. Espero que haya algo obvio que me falta por hacer esto.
Gracias de antemano por tu ayuda.
Yo uso un decorador personalizado with_setup que usa un pobre mans no local: https://gist.github.com/garyvdm/392ae20c673c7ee58d76
def setup():
foo = 10
return [foo], {}
def teardown(foo):
pass
@with_setup_args(setup, teardown)
def test_foo_value(foo):
nose.tools.assert_equal(foo, 10)
Para proyectos que son solo python3, uso no local en lugar de .extend / .update para args, kwargs.