Me gustaría asegurarme de que una vista dada en mi prueba está obteniendo una URL externa correctamente. Utiliza urllib2 (pero esto no debería importar, ya que es una prueba de blackbox). ¿Quizás un servidor local temporal de algún tipo? ¿Hay una aplicación que ya hace esto? (Mi Google me ha fallado).

0
Oliver Zheng 2 sep. 2009 a las 04:12

3 respuestas

La mejor respuesta

Puede usar SimpleHTTPServer para armar un servidor web falso para las pruebas.

Utilizamos la implementación de referencia WSGI, wsgiref, para armar un servidor web falso para la prueba , además. Nos gusta wsgiref porque es una forma muy limpia de crear un servidor web simulado extensible. Además, tenemos aplicaciones WSGI de estado y apagado que utilizamos para asegurarnos de que todo sucedió correctamente desde el punto de vista del sitio web.

2
S.Lott 2 sep. 2009 a las 01:12

Soy un gran admirador de vcrpy (PyPI) al probar URL externas. Puede grabar interacciones HTTP en un archivo y reproducirlas cuando la prueba se ejecuta más tarde. La forma más fácil de usarlo es un decorador en la función de prueba, y los casetes (solicitud / respuestas grabadas) están en YAML por defecto y son fáciles de editar. De su LÉAME:

VCR.py simplifica y acelera las pruebas que realizan solicitudes HTTP. La primera vez que ejecuta código que está dentro de un administrador de contexto VCR.py o una función decorada, VCR.py registra todas las interacciones HTTP que tienen lugar a través de las bibliotecas que admite y las serializa y las escribe en un archivo plano (en formato yaml por defecto) . Este archivo plano se llama cassette. Cuando se ejecuta nuevamente el fragmento de código relevante, VCR.py leerá las solicitudes y respuestas serializadas del archivo de cassette mencionado anteriormente, e interceptará cualquier solicitud HTTP que reconozca de la ejecución de prueba original y devolverá las respuestas que corresponden a esas solicitudes.

Ejemplo (también de los documentos):

@vcr.use_cassette('fixtures/vcr_cassettes/synopsis.yaml')
def test_iana():
    response = urllib2.urlopen('http://www.iana.org/domains/reserved').read()
    assert 'Example domains' in response
0
Holly 30 mar. 2016 a las 18:12

Su módulo bajo prueba presumiblemente importa urllib2. Puede parchear el módulo en su arnés de prueba para señalar su propia urllib2 falsa; por ejemplo, esto no necesita ser un módulo, podría ser una instancia de clase que tenga un método urlopen que verifique que se llame a la url correcta y devuelve una respuesta adecuada

Actualización: Aquí hay un esqueleto del enfoque. Supongamos que su módulo bajo prueba se llama mymodule. En su módulo de prueba (o un módulo de utilidad separado), podría tener:

import urllib2 # the real urllib2

class Urllib2Simulator: # This is a sort of Mock
    #In practice, you could supply additional parameters to this to tell it
    #how to behave when e.g. urlopen is classed
    def __init__(self):
        self.urls_opened = []

    def urlopen(self, url, data=None): # this method simulates urlopen
        self.urls_opened.append((url, data)) # remember what was opened
        #Now, you can either delegate to the real urllib2 (simplest)
        #Or completely simulate what it does (that's more work)
        #Let's keep it simple for this answer.
        #Our class instance will be acting a bit like a proxy.
        return urllib2.urlopen(url, data)

    #similarly define any other urllib2 functions that mymodule calls

Y luego, en su código de prueba:

class MyModuleTest(unittest.TestCase):

    def test_url_retrieval(self): # use whatever name is best
        real_urllib2 = mymodule.urllib2 #remember it so we can restore it
        simulator = Urllib2Simulator()
        mymodule.urllib2 = simulator # the monkey-patch is here
        # here, invoke your mymodule functionality which is supposed to
        # retrieve URLs using urllib2.urlopen
        mymodule.do_something_which_fetches_urls()
        #restore the previous binding to urllib2
        mymodule.urllib2 = real_urllib2 # restored - back to normal
        #Now, check that simulator.urls_opened contains the correct values

He usado esta técnica con cierto éxito. (Es particularmente útil cuando desea simular el paso del tiempo). En un escenario de prueba unitaria, es menos trabajo que configurar un servidor real. Para las pruebas de integración, probablemente usaría un servidor real, como sugiere la respuesta de S. Lott. Pero este enfoque le permite simular fácilmente diferentes condiciones, sin tener un marco de prueba completo basado en el servidor (por ejemplo, puede configurar las cosas para que el servidor parezca devolver errores particulares, para probar cómo su código los manejaría o configurable retrasos en la respuesta, por lo que puede probar los tiempos de espera o las respuestas mal formadas, etc.)

3
Vinay Sajip 2 sep. 2009 a las 06:46