Tests¶
Frontera 测试使用 pytest 工具实现。
您可以使用pip安装 pytest 和测试中使用的附加必需库:
pip install -r requirements/tests.txt
写 tests¶
所有功能(包括新功能和错误修复)都必须包含一个测试用例,以检查它是否按预期工作,所以如果你希望他们能够早点上线,请尽快写好相关的测试。
后端 testing¶
有一个继承 pytest 的类用来测试 Backend
:
BackendTest
比方说,你想测试你的后端 MyBackend
并为每个测试方法调用创建一个新的 frontier 实例,你可以定义一个这样的测试类:
class TestMyBackend(backends.BackendTest):
backend_class = 'frontera.contrib.backend.abackend.MyBackend'
def test_one(self):
frontier = self.get_frontier()
...
def test_two(self):
frontier = self.get_frontier()
...
...
如果它使用一个数据库文件,你需要在每次测试之前和之后进行清理:
class TestMyBackend(backends.BackendTest):
backend_class = 'frontera.contrib.backend.abackend.MyBackend'
def setup_backend(self, method):
self._delete_test_db()
def teardown_backend(self, method):
self._delete_test_db()
def _delete_test_db(self):
try:
os.remove('mytestdb.db')
except OSError:
pass
def test_one(self):
frontier = self.get_frontier()
...
def test_two(self):
frontier = self.get_frontier()
...
...
测试后端执行顺序¶
为了测试 Backend
抓取顺序你可以使用 BackendSequenceTest
类。
BackendSequenceTest
将依据传过来的网站图进行一遍完整的抓取,并返回后端访问网页的顺序。
比如你想测试一个按照字母顺序抓取网页的后端。你可以这样写测试:
class TestAlphabeticSortBackend(backends.BackendSequenceTest):
backend_class = 'frontera.contrib.backend.abackend.AlphabeticSortBackend'
SITE_LIST = [
[
('C', []),
('B', []),
('A', []),
],
]
def test_one(self):
# Check sequence is the expected one
self.assert_sequence(site_list=self.SITE_LIST,
expected_sequence=['A', 'B', 'C'],
max_next_requests=0)
def test_two(self):
# Get sequence and work with it
sequence = self.get_sequence(site_list=SITE_LIST,
max_next_requests=0)
assert len(sequence) > 2
...
测试基本算法¶
如果你的后端使用 基本算法逻辑 中的一个,你可以继承对应的测试类,之后顺序会被自动测试:
from tests import backends
class TestMyBackendFIFO(backends.FIFOBackendTest):
backend_class = 'frontera.contrib.backends.abackend.MyBackendFIFO'
class TestMyBackendLIFO(backends.LIFOBackendTest):
backend_class = 'frontera.contrib.backends.abackend.MyBackendLIFO'
class TestMyBackendDFS(backends.DFSBackendTest):
backend_class = 'frontera.contrib.backends.abackend.MyBackendDFS'
class TestMyBackendBFS(backends.BFSBackendTest):
backend_class = 'frontera.contrib.backends.abackend.MyBackendBFS'
class TestMyBackendRANDOM(backends.RANDOMBackendTest):
backend_class = 'frontera.contrib.backends.abackend.MyBackendRANDOM'