有没有人通过 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 使用多处理以并行化测试,因此它们每个都在自己的进程中运行。分拆的进程是否有可能仍在尝试使用原始进程的连接池或其他什么?我真的不知道从这里尝试其他事情,并且非常感谢一些提示,甚至只是确认这实际上是可能的。