Skip to content

Commit 65e7e72

Browse files
Merge pull request #819 from Labelbox/kkim/fix-flaky-label-creation-in-test
[AL-0] Fix tests that were flaky due to label creation
2 parents 0ea6ef9 + 1ac0730 commit 65e7e72

File tree

5 files changed

+70
-22
lines changed

5 files changed

+70
-22
lines changed

tests/integration/conftest.py

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ def datarow(dataset, image_url):
207207
},
208208
])
209209
task.wait_till_done()
210-
dr = next(dataset.data_rows())
210+
dr = dataset.data_rows().get_one()
211211
yield dr
212212
dr.delete()
213213

@@ -304,7 +304,7 @@ def configured_project(project, client, rand_gen, image_url):
304304

305305
@pytest.fixture
306306
def configured_project_with_label(client, rand_gen, image_url, project, dataset,
307-
datarow):
307+
datarow, wait_for_label_processing):
308308
"""Project with a connected dataset, having one datarow
309309
Project contains an ontology with 1 bbox tool
310310
Additionally includes a create_label method for any needed extra labels
@@ -348,8 +348,8 @@ def create_label():
348348

349349
project.create_label = create_label
350350
project.create_label()
351-
label = project.labels().get_one()
352-
assert label is not None, "Cannot fetch created label"
351+
label = wait_for_label_processing(project)[0]
352+
353353
yield [project, dataset, datarow, label]
354354

355355
for label in project.labels():
@@ -407,3 +407,56 @@ def configured_project_with_complex_ontology(client, rand_gen, image_url):
407407
yield [project, data_row]
408408
dataset.delete()
409409
project.delete()
410+
411+
412+
@pytest.fixture
413+
def wait_for_data_row_processing():
414+
"""
415+
Do not use. Only for testing.
416+
417+
Returns DataRow after waiting for it to finish processing media_attributes.
418+
Some tests, specifically ones that rely on label export, rely on
419+
DataRow be fully processed with media_attributes
420+
"""
421+
422+
def func(client, data_row):
423+
data_row_id = data_row.uid
424+
timeout_seconds = 60
425+
while True:
426+
data_row = client.get_data_row(data_row_id)
427+
if data_row.media_attributes:
428+
return data_row
429+
timeout_seconds -= 2
430+
if timeout_seconds <= 0:
431+
raise TimeoutError(
432+
f"Timed out waiting for DataRow '{data_row_id}' to finish processing media_attributes"
433+
)
434+
time.sleep(2)
435+
436+
return func
437+
438+
439+
@pytest.fixture
440+
def wait_for_label_processing():
441+
"""
442+
Do not use. Only for testing.
443+
444+
Returns project's labels as a list after waiting for them to finish processing.
445+
If `project.labels()` is called before label is fully processed,
446+
it may return an empty set
447+
"""
448+
449+
def func(project):
450+
timeout_seconds = 10
451+
while True:
452+
labels = list(project.labels())
453+
if len(labels) > 0:
454+
return labels
455+
timeout_seconds -= 2
456+
if timeout_seconds <= 0:
457+
raise TimeoutError(
458+
f"Timed out waiting for label for project '{project.uid}' to finish processing"
459+
)
460+
time.sleep(2)
461+
462+
return func

tests/integration/test_data_row_media_attributes.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
1-
from time import sleep
2-
3-
4-
def test_export_empty_media_attributes(configured_project_with_label):
5-
project, _, _, _ = configured_project_with_label
6-
# Wait for exporter to retrieve latest labels
7-
sleep(10)
1+
def test_export_empty_media_attributes(client, configured_project_with_label,
2+
wait_for_data_row_processing):
3+
project, _, data_row, _ = configured_project_with_label
4+
data_row = wait_for_data_row_processing(client, data_row)
85
labels = list(project.label_generator())
96
assert len(
107
labels

tests/integration/test_data_row_metadata.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
from datetime import datetime
2-
from time import sleep
32

43
import pytest
54
import uuid
@@ -90,10 +89,10 @@ def make_named_metadata(dr_id) -> DataRowMetadata:
9089
return metadata
9190

9291

93-
def test_export_empty_metadata(configured_project_with_label):
94-
project, _, _, _ = configured_project_with_label
95-
# Wait for exporter to retrieve latest labels
96-
sleep(10)
92+
def test_export_empty_metadata(client, configured_project_with_label,
93+
wait_for_data_row_processing):
94+
project, _, data_row, _ = configured_project_with_label
95+
data_row = wait_for_data_row_processing(client, data_row)
9796
labels = project.label_generator()
9897
label = next(labels)
9998
assert label.data.metadata == []

tests/integration/test_export.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1-
from time import sleep
21
import uuid
32

43
from labelbox.data.annotation_types.annotation import ObjectAnnotation
54
from labelbox.schema.annotation_import import LabelImport
65

76

87
def test_export_annotations_nested_checklist(
9-
client, configured_project_with_complex_ontology):
8+
client, configured_project_with_complex_ontology,
9+
wait_for_data_row_processing):
1010
project, data_row = configured_project_with_complex_ontology
11+
data_row = wait_for_data_row_processing(client, data_row)
12+
1113
ontology = project.ontology().normalized
1214

1315
tool = ontology["tools"][0]
@@ -47,9 +49,7 @@ def test_export_annotations_nested_checklist(
4749
task = LabelImport.create_from_objects(client, project.uid,
4850
f'label-import-{uuid.uuid4()}', data)
4951
task.wait_until_done()
50-
# Wait for exporter to retrieve latest labels
51-
sleep(10)
52-
labels = project.label_generator().as_list()
52+
labels = project.label_generator()
5353
object_annotation = [
5454
annot for annot in next(labels).annotations
5555
if isinstance(annot, ObjectAnnotation)

tests/integration/test_project_setup.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from datetime import datetime, timedelta, timezone
22
import json
33
import time
4-
import time
54

65
import pytest
76

0 commit comments

Comments
 (0)