阅读 djapian 的测试用例后,我发现了一些非常有趣的东西:这些人所做的是使用 TestCase 类的 setUp 方法:他们创建一个对象,然后使用索引器的 update 方法,因此他们有效地有一个文档可以搜索和一种编写受控查询测试的方法!对于好奇的人,该方法看起来像这样:
def setUp(self):
p = Person.objects.create(name="Alex")
for i in range(self.num_entries):
Entry.objects.create(author=p, title="Entry with number %s" % i, text="foobar " * i)
Entry.indexer.update()
我认为这样做可以,但我们必须记住我正在测试一个小搜索引擎,所以这个解决方案可能是简单的出路;不过,我无法提出反对意见,所以如果你们有一个答案,这将有助于定义一种在 python 中测试这种 webApps 的策略,那就非常受欢迎了!
-我想我现在会满足于这样的事情(我也想用一个完全填充的数据库来测试查询的延迟,但我想我以后可以通过Funkload中的基准测试来做到这一点)
编辑:好的,为了忠实于任何有兴趣的人的解决方案,我遇到了另一个问题:xapian 索引(如评论中所述)。为了解决这个问题,我创建了一个默认测试运行程序,将生产 xapian 索引更改为测试索引(一个较小的,使用管理脚本创建的)。这个跑步者相当简单:
def custom_run_tests(test_labels, verbosity=1, interactive=True, extra_tests=[]):
"""Set the test indices"""
settings.CATEGORY_CLASSIFIER_DATA = settings.TEST_CLASSIFIER_DATA
return run_tests(test_labels, verbosity, interactive, extra_tests)
而且,要使用它,我只是添加了一个设置:
TEST_RUNNER = 'search.tests.custom_run_tests'
出于性能和可读性的原因,我放弃了上述方法(在 setUp 中创建文档):为了测试数据库,我需要大量带有一些文本(一两段)的文档,所以我最终为此创建了一个夹具(我使用了一个管理命令,在真实数据库中创建了文档,将它们序列化 - 将它们写入文件 - 然后删除它们)。所以,最后,我根本没有从 live db 中读取数据,而是使用了用有点 hacky 的脚本和自定义运行器创建的测试装置,这并不难 :)