1

我意识到这里有一个类似的问题,但是这个问题有不同的方法:我有一个 django 应用程序,它对使用djapian索引的数据进行查询;我想为这个应用程序的搜索组件编写单元测试,显然,我需要 django 设置模块和所有与数据库的连接都处于活动状态,因此 django 提供的测试运行器似乎很理想。但是,django 测试框架创建了一个虚拟数据库,我不想将我的所有数据转储到一个夹具然后索引它(测试将永远花费!);

我的数据没有风险,因为测试只会从数据库中读取,那么,如何实现呢?-我是整个单元测试的新手,所以我在类似问题中读到的编写新测试运行器的解决方案并没有给我一点启发,至少在没有一些细节的情况下不会

4

1 回答 1

2

阅读 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 的脚本和自定义运行器创建的测试装置,这并不难 :)

于 2010-06-14T05:51:14.927 回答