Elasticsearch для python - вызовы не блокируются правильно

Я пытаюсь написать модульные тесты для своего собственного клиента Elasticsearch. Он использует клиент от elasticsearch-py.

Большинство моих тестов работают нормально, но при запуске теста на моей собственной функции search() (которая использует функцию search() из клиента Elasticsearch) я получаю очень случайное поведение. Вот как реализован мой тест:


    def setUp(self) -> None:
        self.es = ESClient(host = "localhost")
        self.es_acc = ESClient()
        self.connection_res = (False, {})

        self.t = self.es_acc.get_connection_status(self._callback)
        self.t.join()

        # Create test index and index some documents
        self.es.create_index(self.TEST_INDEX)
        names = ["Gregor", "Alice", "Per Svensson", "Mats Hermelin", "Mamma Mia"
            , "Eva Dahlgren", "Per Morberg", "Maja Larsson", "Ola Salo", "Magrecievic Holagrostokovic"]
        self.num_docs = len(names)
        self.payload = []
        random.seed(123)

        for i, name in enumerate(names):
            n = name.split(" ")
            fname = n[0]
            lname = n[1] if len(n) > 1 else n[0]

            self.payload.append({"name": {"first": fname, "last": lname}, "age": random.randint(-100, 100),
                                 "timestamp": datetime.utcnow() - timedelta(days=1 * i)})

        self.es.upload(self.TEST_INDEX, self.payload, ids=list(range(len(names))))

    def test_search(self):
        # Test getting docs based on ids
        ids = ["1", "4", "9"]
        status, hits = self.es.search(self.TEST_INDEX, ids=ids) # Breakpoint
        docs = hits["hits"]["hits"]
        self.assertTrue(status, "Status not correct for search!")
        returned_ids = [d["_id"] for d in docs]
        names = [d["_source"]["name"] for d in docs]
        self.assertListEqual(sorted(returned_ids), ids, "Returned ids from search not correct!")
        self.assertListEqual(names, [self.payload[i]["name"] for i in [1, 4, 9]], "Returned source from search not correct!")

В setUp() я просто загружаю несколько документов для тестирования, поэтому всегда должно быть 10 документов для тестирования. Ниже приведен отрывок из моей функции search().

        if ids:
            try:
                q = Query().ids(ids).compile_and_get()
                res = self.es.search(index=index, body=q)
                print(res)
                return True, res
            except exceptions.ElasticsearchException as e:
                self._handle_elastic_exceptions("search", e, index=index)
                return False, {}

Я реализовал Query. В любом случае, когда я просто запускаю тест, я ПОЧТИ всегда получаю 0 попаданий. Но если я отлаживаю приложение с точкой останова в test_search() в строке, где я делаю вызов search() и шаг, все работает нормально. Если я поставлю это всего на одну строку ниже, я снова получу 0 просмотров. Что здесь происходит? Почему блокируется некорректно?

Кажется, я нашел свое решение! 1. Я не понял, что setUp вызывается для каждого тестового метода. Однако на самом деле проблема была не в этом. 2. Проблема в том, что для некоторых тестов загрузка документов просто занимала много времени (что и было сделано в setUp), и поэтому, когда тест начинался, документов еще не было! Решение: добавьте sleep(1) в конец setUp.

Zorobay 26.06.2019 15:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кажется, я нашел свое решение!

  1. Я не понял, что setUp вызывается для каждого метода тестирования. Однако на самом деле проблема была не в этом.
  2. Проблема в том, что для некоторых тестов загрузка документов просто занимала много времени (что и было сделано в setUp), и поэтому, когда тест начинался, документов еще не было! Решение: добавьте sleep(1) в конец setUp.

Другие вопросы по теме