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






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