Cách tôi đã thực hiện nó là tạo phản hồi giả, theo cách này bạn có thể kiểm tra hàm phân tích ngoại tuyến. Nhưng bạn nhận được tình hình thực tế bằng cách sử dụng HTML thực.
Sự cố với phương pháp này là tệp HTML cục bộ của bạn có thể không phản ánh trạng thái trực tuyến mới nhất. Vì vậy, nếu HTML thay đổi trực tuyến, bạn có thể có một lỗi lớn, nhưng các trường hợp kiểm tra của bạn vẫn sẽ vượt qua. Vì vậy, nó có thể không phải là cách tốt nhất để thử nghiệm theo cách này.
Luồng công việc hiện tại của tôi là, bất cứ khi nào có lỗi, tôi sẽ gửi email tới quản trị viên, với url. Sau đó, với lỗi cụ thể đó, tôi tạo một tệp html với nội dung gây ra lỗi. Sau đó, tôi tạo ra một unittest cho nó.
Đây là mã tôi sử dụng để tạo ra phản ứng mẫu Scrapy http để thử nghiệm từ một file html địa phương:
# 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
Các tập tin html mẫu nằm ở scrapyproject/kiểm tra/phản ứng/osdir/sample.html
sau đó testcase có thể nhìn như sau: vị trí trường hợp thử nghiệm là scrapyproject/kiểm tra/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)
Đó là basica lly cách tôi thử nghiệm các phương pháp phân tích cú pháp của mình, nhưng nó không chỉ cho các phương pháp phân tích cú pháp. Nếu nó phức tạp hơn, tôi khuyên bạn nên xem Mox
đẹp cách tiếp cận để thử nghiệm ngoại tuyến. Điều gì về chạy thử nghiệm ngoại tuyến để đảm bảo bạn không có lỗi mã và sau đó chạy thử nghiệm trực tuyến để đảm bảo rằng các thay đổi của trang web không làm hỏng chương trình của bạn? – Medeiros
@Medeiros thats cách tôi đang làm điều đó trong một dự án khác ngay bây giờ. Tôi gắn thẻ các bài kiểm tra với @ integration = 1 để tôi không phải luôn chạy tất cả các bài kiểm tra. Tôi đang làm điều này với plugin gắn thẻ nosetests. –
@SamStoelinga Tôi cũng có thể kiểm tra dữ liệu thực tế không? Nếu vậy làm thế nào tôi có thể "lấy" phản ứng bằng cách sử dụng mẩu tin lưu niệm bên trong bài kiểm tra đơn vị? Tôi rất muốn kiểm tra xem con nhện của tôi có tập hợp tất cả thông tin từ một mặt đã thay đổi hay không. – lony