То, как я это сделал, это создание фальшивых ответов, таким образом вы можете проверить функцию разбора в автономном режиме.Но вы получаете реальную ситуацию, используя настоящий HTML.
Проблема с этим подходом заключается в том, что ваш локальный файл HTML может не отражать последнее состояние в сети.Так что, если HTML-код меняется онлайн, у вас может быть большая ошибка, но ваши тестовые примеры все равно пройдут.Так что, возможно, это не лучший способ проверить этот способ.
Мой текущий рабочий процесс заключается в том, что при возникновении ошибки я отправляю электронное письмо администратору с URL-адресом.Затем для этой конкретной ошибки я создаю HTML-файл с содержанием, которое вызывает ошибку.Затем я создаю для него unittest.
Это код, который я использую для создания образцов ответов Scrapy http для тестирования из локального HTML-файла:
# 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
Образец HTML-файла находится вscrapyproject / tests / response / osdir / sample.html
Тогда тестовый сценарий может выглядеть следующим образом: Расположение тестового примера - scrapyproject / tests / 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)
Вот как япроверить мои методы синтаксического анализа, но это не только для методов синтаксического анализа.Если это станет более сложным, я предлагаю взглянуть на Мокс