Как я могу проводить параллельные тесты в Django с помощью Elasticsearch-dsl? - PullRequest
0 голосов
/ 04 августа 2020

Есть ли у кого-нибудь параллельные тесты для работы в Django с Elasticsearch? Если да, то не могли бы вы рассказать, какие изменения конфигурации потребовались, чтобы это произошло?

Я перепробовал практически все, что мог придумать, чтобы заставить его работать, включая решение , описанное здесь . Вдохновленный тем, как Django сам выполняет параллельную базу данных, я в настоящее время создал новый пользовательский ParallelTestSuite, который переопределяет 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 при попытке создать индекс в приведенной выше функции (я подтвердил, что это 404 возвращается из запроса PUT, однако в журналах сервера Elasticsearch говорится, что он создал индекс без проблем)
  • 500 при попытке создать индекс, хотя этого не произошло через некоторое время, поэтому я думаю, что это было исправлено чем-то другим.
  • ответы на запросы иногда не имеют значения словаря items внутри функции _process_bulk_chunk из библиотеки elasticsearch

I Я думаю, что на уровне соединения происходит что-то странное (например, каким-то образом соединения между процессами Django test runner смешивают ответы?), но я не понимаю, как это вообще возможно, поскольку Django использует многопроцессорность для распараллеливания тестов, поэтому каждый из них выполняется в своем собственном процессе. Возможно ли, что выделенные процессы все еще пытаются использовать пул соединений исходного процесса или что-то в этом роде? У меня нет других вещей, которые можно попробовать отсюда, и я был бы очень признателен за некоторые подсказки или даже просто подтверждение того, что это действительно возможно.

...