2

有没有人通过 Elasticsearch 在 Django 中进行并行测试?如果是这样,您能否分享实现它所需的配置更改?

我已经尝试了几乎所有我能想到的让它工作的方法,包括这里列出的解决方案。从 Django 本身如何处理并行数据库中获得灵感,我目前创建了一个自定义 newParallelTestSuite来覆盖 init_worker 以迭代每个索引/文档类型并大致如下更改索引名称:

_worker_id = 0
def _elastic_search_init_worker(counter):
    global _worker_id

    with counter.get_lock():
        counter.value += 1
        _worker_id = counter.value

    for alias in connections:
        connection = connections[alias]
        settings_dict = connection.creation.get_test_db_clone_settings(_worker_id)
        # connection.settings_dict must be updated in place for changes to be
        # reflected in django.db.connections. If the following line assigned
        # connection.settings_dict = settings_dict, new threads would connect
        # to the default database instead of the appropriate clone.
        connection.settings_dict.update(settings_dict)
        connection.close()

    ### Everything above this is from the Django version of this function ###

    # Update index names in doctypes
    for doc in registry.get_documents():
        doc._doc_type.index += f"_{_worker_id}"

    # Update index names for indexes and create new indexes
    for index in registry.get_indices():
        index._name += f"_{_worker_id}"
        index.delete(ignore=[404])
        index.create()

    print(f"Started thread # {_worker_id}")

这似乎通常有效,但是,似乎随机发生了一些奇怪的事情(即再次运行测试套件并不能可靠地重现问题和/或错误消息发生变化)。以下是我遇到的各种错误,每次测试运行似乎都会随机失败其中一个错误:

  • 尝试在上面的函数中创建索引时引发 404(我已经确认它是从 PUT 请求返回的 404,但是在 Elasticsearch 服务器日志中它说它创建的索引没有问题)
  • 尝试创建索引时为 500,虽然这已经有一段时间没有发生了,所以我认为这是由其他东西修复的
  • 查询响应有时在 elasticsearch 库中的函数内没有items字典值_process_bulk_chunk

我认为连接层发生了一些奇怪的事情(比如 Django 测试运行程序进程之间的连接以某种方式混淆了响应?)但我不知道这怎么可能,因为 Django 使用多处理以并行化测试,因此它们每个都在自己的进程中运行。分拆的进程是否有可能仍在尝试使用原始进程的连接池或其他什么?我真的不知道从这里尝试其他事情,并且非常感谢一些提示,甚至只是确认这实际上是可能的。

4

0 回答 0