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