Elasticsearch для python - вызовы не блокируются правильно - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь написать юнит-тесты для моего собственного клиента 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() и step, все работает нормально. Если я поставлю это на одну строку ниже, я снова получу 0 хитов. Что здесь происходит? Почему он не блокируется правильно?

1 Ответ

0 голосов
/ 26 июня 2019

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

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