La forma en que lo he hecho es crear respuestas falsas, de esta manera puede probar la función de análisis sin conexión. Pero obtienes la situación real usando HTML real.
Un problema con este enfoque es que su archivo HTML local puede no reflejar el último estado en línea. Entonces, si el HTML cambia en línea, es posible que tengas un gran error, pero tus casos de prueba aún pasarán. Entonces, puede que no sea la mejor manera de probarlo de esta manera.
Mi flujo de trabajo actual es que, siempre que haya un error, enviaré un correo electrónico a admin, con la url. Luego, para ese error específico, creo un archivo html con el contenido que está causando el error. Luego creo una prueba unitaria para ello.
Este es el código que utilizo para crear respuestas de la muestra Scrapy http para la prueba de un archivo HTML local:
# scrapyproject/tests/responses/__init__.py
import os
from scrapy.http import Response, Request
def fake_response_from_file(file_name, url=None):
"""
Create a Scrapy fake HTTP response from a HTML file
@param file_name: The relative filename from the responses directory,
but absolute paths are also accepted.
@param url: The URL of the response.
returns: A scrapy HTTP response which can be used for unittesting.
"""
if not url:
url = 'http://www.example.com'
request = Request(url=url)
if not file_name[0] == '/':
responses_dir = os.path.dirname(os.path.realpath(__file__))
file_path = os.path.join(responses_dir, file_name)
else:
file_path = file_name
file_content = open(file_path, 'r').read()
response = Response(url=url,
request=request,
body=file_content)
response.encoding = 'utf-8'
return response
El archivo HTML de ejemplo se encuentra en scrapyproject/pruebas/respuestas/OSDir/sample.html
A continuación, el caso de prueba podría ser como sigue: la ubicación caso de prueba es scrapyproject/pruebas/test_osdir.py
import unittest
from scrapyproject.spiders import osdir_spider
from responses import fake_response_from_file
class OsdirSpiderTest(unittest.TestCase):
def setUp(self):
self.spider = osdir_spider.DirectorySpider()
def _test_item_results(self, results, expected_length):
count = 0
permalinks = set()
for item in results:
self.assertIsNotNone(item['content'])
self.assertIsNotNone(item['title'])
self.assertEqual(count, expected_length)
def test_parse(self):
results = self.spider.parse(fake_response_from_file('osdir/sample.html'))
self._test_item_results(results, 10)
Eso es basica lly cómo pruebo mis métodos de análisis, pero no es solo para los métodos de análisis. Si se vuelve más complejo sugiero mirar Mox
acercamiento agradable para las pruebas fuera de línea. ¿Qué sucede si ejecuta pruebas fuera de línea para asegurarse de que no tiene fallas en el código y luego ejecuta pruebas en línea para asegurarse de que los cambios en el sitio no interrumpan su programa? – Medeiros
@Medeiros, esa es la forma en que lo estoy haciendo en otro proyecto en este momento. Etiqueto las pruebas con @ integration = 1 para no tener que ejecutar siempre todas las pruebas. Estoy haciendo esto con el plugin de etiquetado nosetests. –
@SamStoelinga ¿Puedo también probar contra datos reales? Si es así, ¿cómo puedo "buscar" la respuesta usando scrapy dentro de la unidad de prueba? Me encantaría comprobar si mi araña aún reúne toda la información de un lado cambiado. – lony