Дразнить запросы на тестирование в Scrapy Spider
Моя цель - протестировать паука, написанного с использованием scrapy
(Python
). Я пытался с помощью contracts
но это действительно ограничено в том смысле, что я не могу проверить такие вещи, как нумерация страниц или правильно ли извлечены некоторые атрибуты.
def parse(self, response):
""" This function parses a sample response. Some contracts are mingled
with this docstring.
@url http://someurl.com
@returns items 1 16
@returns requests 0 0
@scrapes Title Author Year Price
"""
Итак, вторая идея состоит в том, чтобы mock
все запросы, которые паук делает за один прогон, и использовать его в testing
фаза для проверки на ожидаемые результаты. Тем не менее, я не уверен, и как я могу издеваться над каждым запросом, который сделан через паука. Я просмотрел различные библиотеки, и одна из них - betamax. Тем не менее, он поддерживает только HTTP-запросы, сделанные requests
клиент Python. (Как уже упоминалось здесь). Существует другая библиотека vcrpy, но она также поддерживает только ограниченных клиентов.
Вы используете запросы? Если вы не используете запросы, Betamax не для вас. Вы должны проверить VCRpy. Используете ли вы сеансы или функциональный API (например,quests.get)?
Последний вариант - вручную записать все запросы и как-то их сохранить, но на самом деле это неосуществимо в том масштабе, в котором паук делает запросы.
Есть ли scrapy.Requests
использовать какой-нибудь подчеркнутый Python-клиент, который можно использовать для проверки этих запросов? Или есть какой-то другой способ, которым я могу высмеять все http
запросы, сделанные пауком за один прогон, и использовать это для тестирования паука на ожидаемое поведение?
1 ответ
Так, scrapy
имеет встроенную поддержку кэширования, которая может быть использована для cache
все ответы, и это действительно устраняет mock
ответы.
Существуют различные настройки, найденные в HttpCacheMiddleware
, Некоторые из них следующие. (подлежит включению в settings.py
для scrapy
проект)
# Cache settings
HTTPCACHE_POLICY = 'scrapy.extensions.httpcache.DummyPolicy'
HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 0 # Never Expire
HTTPCACHE_DIR = 'httpcache'
HTTPCACHE_IGNORE_HTTP_CODES = [301, 302, 404]
HTTPCACHE_IGNORE_MISSING = False
HTTPCACHE_IGNORE_RESPONSE_CACHE_CONTROLS = ["no-cache", "no-store"]
Это также хранит cache
в указанном каталоге. Вот весь список опций.