Skip to content

Commit 8cef3a5

Browse files
authored
Merge pull request #831 from Labelbox/imuhammad/AL-3976-parallelizable-dataset-tests
[AL-4418] [AL-3976] Make dataset tests parallelizable
2 parents cda1ad9 + 6177b59 commit 8cef3a5

File tree

12 files changed

+59
-64
lines changed

12 files changed

+59
-64
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ test-staging: build
2121
-e LABELBOX_TEST_ENVIRON="staging" \
2222
-e DA_GCP_LABELBOX_API_KEY=${DA_GCP_LABELBOX_API_KEY} \
2323
-e LABELBOX_TEST_API_KEY_STAGING=${LABELBOX_TEST_API_KEY_STAGING} \
24-
local/labelbox-python:test pytest $(PATH_TO_TEST)
24+
local/labelbox-python:test pytest -n 10 $(PATH_TO_TEST)
2525

2626
test-prod: build
2727
docker run -it -v ${PWD}:/usr/src -w /usr/src \

pytest.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
[pytest]
2-
addopts = -s -vv -x --reruns 5 --reruns-delay 10 --durations=20
2+
addopts = -s -vv --reruns 5 --reruns-delay 10 --durations=20
33
markers =
44
slow: marks tests as slow (deselect with '-m "not slow"')

requirements.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ typeguard
1313
imagesize
1414
pyproj
1515
pygeotile
16-
typing-extensions
16+
typing-extensions
17+
pytest-xdist
Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,26 @@
1+
import pytest
2+
13
from labelbox import Model
4+
from labelbox.exceptions import ResourceNotFoundError
25

36

47
def test_model(client, configured_project, rand_gen):
5-
before = list(client.get_models())
6-
for m in before:
8+
# Get all
9+
models = list(client.get_models())
10+
for m in models:
711
assert isinstance(m, Model)
812

13+
# Create
914
ontology = configured_project.ontology()
10-
1115
data = {"name": rand_gen(str), "ontology_id": ontology.uid}
1216
model = client.create_model(data["name"], data["ontology_id"])
1317
assert model.name == data["name"]
1418

15-
after = list(client.get_models())
16-
assert len(after) == len(before) + 1
17-
assert model in after
18-
19+
# Get one
1920
model = client.get_model(model.uid)
2021
assert model.name == data["name"]
2122

22-
23-
def test_model_delete(client, model):
24-
before = list(client.get_models())
25-
26-
model = before[0]
23+
# Delete
2724
model.delete()
28-
29-
after = list(client.get_models())
30-
31-
assert len(before) == len(after) + 1
25+
with pytest.raises(ResourceNotFoundError):
26+
client.get_model(model.uid)

tests/integration/annotation_import/test_model_run.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,9 @@ def test_model_run_delete(client, model_run):
5252
models_after = list(client.get_models())
5353
model_after = models_after[0]
5454
after = list(model_after.model_runs())
55+
after_uids = {mr.uid for mr in after}
5556

56-
assert len(before) == len(after) + 1
57+
assert model_run.uid not in after_uids
5758

5859

5960
def test_model_run_update_config(model_run_with_training_metadata):
@@ -74,11 +75,8 @@ def test_model_run_get_config(model_run_with_training_metadata):
7475
assert res["batch_size"] == new_config["batch_size"]
7576

7677

77-
def test_model_run_data_rows_delete(client, model_run_with_model_run_data_rows):
78-
models = list(client.get_models())
79-
model = models[0]
80-
model_runs = list(model.model_runs())
81-
model_run = model_runs[0]
78+
def test_model_run_data_rows_delete(model_run_with_model_run_data_rows):
79+
model_run = model_run_with_model_run_data_rows
8280

8381
before = list(model_run.model_run_data_rows())
8482
annotation_data_row = before[0]

tests/integration/test_client_errors.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def test_semantic_error(client):
4545
def test_timeout_error(client, project):
4646
with pytest.raises(labelbox.exceptions.TimeoutError) as excinfo:
4747
query_str = """query getOntology {
48-
project (where: {id: $%s}) {
48+
project (where: {id: %s}) {
4949
ontology {
5050
normalized
5151
}

tests/integration/test_data_row_metadata.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import uuid
55

66
from labelbox import DataRow, Dataset
7+
from labelbox.exceptions import MalformedQueryException
78
from labelbox.schema.data_row_metadata import DataRowMetadataField, DataRowMetadata, DataRowMetadataKind, DeleteDataRowMetadata, \
89
DataRowMetadataOntology, _parse_metadata_schema
910

@@ -30,9 +31,11 @@
3031
@pytest.fixture
3132
def mdo(client):
3233
mdo = client.get_data_row_metadata_ontology()
33-
for schema in mdo.custom_fields:
34-
mdo.delete_schema(schema.name)
35-
mdo.create_schema(CUSTOM_TEXT_SCHEMA_NAME, DataRowMetadataKind.string)
34+
try:
35+
mdo.create_schema(CUSTOM_TEXT_SCHEMA_NAME, DataRowMetadataKind.string)
36+
except MalformedQueryException:
37+
# Do nothing if already exists
38+
pass
3639
mdo._raw_ontology = mdo._get_ontology()
3740
mdo._raw_ontology.append(FAKE_NUMBER_FIELD)
3841
mdo._build_ontology()
@@ -101,7 +104,8 @@ def test_export_empty_metadata(client, configured_project_with_label,
101104
def test_get_datarow_metadata_ontology(mdo):
102105
assert len(mdo.fields)
103106
assert len(mdo.reserved_fields)
104-
assert len(mdo.custom_fields) == 2
107+
# two are created by mdo fixture but there may be more
108+
assert len(mdo.custom_fields) >= 2
105109

106110
split = mdo.reserved_by_name["split"]["train"]
107111

tests/integration/test_data_rows.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import requests
88

99
from labelbox import DataRow
10+
from labelbox.exceptions import MalformedQueryException
1011
from labelbox.schema.task import Task
1112
from labelbox.schema.data_row_metadata import DataRowMetadataField, DataRowMetadataKind
1213
import labelbox.exceptions
@@ -26,9 +27,11 @@
2627
@pytest.fixture
2728
def mdo(client):
2829
mdo = client.get_data_row_metadata_ontology()
29-
for schema in mdo.custom_fields:
30-
mdo.delete_schema(schema.name)
31-
mdo.create_schema(CUSTOM_TEXT_SCHEMA_NAME, DataRowMetadataKind.string)
30+
try:
31+
mdo.create_schema(CUSTOM_TEXT_SCHEMA_NAME, DataRowMetadataKind.string)
32+
except MalformedQueryException:
33+
# Do nothing if already exists
34+
pass
3235
mdo._raw_ontology = mdo._get_ontology()
3336
mdo._build_ontology()
3437
yield mdo
@@ -415,7 +418,7 @@ def test_create_data_rows_with_named_metadata_field_class(
415418
"row1",
416419
DataRow.metadata_fields: [
417420
DataRowMetadataField(name='split', value='test'),
418-
DataRowMetadataField(name='custom_text', value='hello')
421+
DataRowMetadataField(name=CUSTOM_TEXT_SCHEMA_NAME, value='hello')
419422
]
420423
}
421424

@@ -430,7 +433,7 @@ def test_create_data_rows_with_named_metadata_field_class(
430433
'value': 'test'
431434
},
432435
{
433-
'name': 'custom_text',
436+
'name': CUSTOM_TEXT_SCHEMA_NAME,
434437
'value': 'hello'
435438
},
436439
]

tests/integration/test_dataset.py

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,19 @@
77

88

99
def test_dataset(client, rand_gen):
10-
before = list(client.get_datasets())
11-
for o in before:
12-
assert isinstance(o, Dataset)
1310

11+
# confirm dataset can be created
1412
name = rand_gen(str)
1513
dataset = client.create_dataset(name=name)
1614
assert dataset.name == name
1715
assert dataset.created_by() == client.get_user()
1816
assert dataset.organization() == client.get_organization()
1917

20-
after = list(client.get_datasets())
21-
assert len(after) == len(before) + 1
22-
assert dataset in after
23-
24-
# confirm get_one returns first dataset
25-
get_one_dataset = client.get_datasets().get_one()
26-
assert get_one_dataset.uid == after[0].uid
27-
28-
# confirm get_many(1) returns first dataset
29-
get_many_datasets = client.get_datasets().get_many(1)
30-
assert get_many_datasets[0].uid == after[0].uid
18+
retrieved_dataset = client.get_dataset(dataset.uid)
19+
assert retrieved_dataset.name == dataset.name
20+
assert retrieved_dataset.uid == dataset.uid
21+
assert retrieved_dataset.created_by() == dataset.created_by()
22+
assert retrieved_dataset.organization() == dataset.organization()
3123

3224
dataset = client.get_dataset(dataset.uid)
3325
assert dataset.name == name
@@ -48,9 +40,6 @@ def test_dataset(client, rand_gen):
4840
assert dataset.description == description
4941

5042
dataset.delete()
51-
final = list(client.get_datasets())
52-
assert dataset not in final
53-
assert set(final) == set(before)
5443

5544
with pytest.raises(ResourceNotFoundError):
5645
dataset = client.get_dataset(dataset.uid)
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
from copy import copy
2+
3+
4+
def test_get_one_and_many_dataset_order(client):
5+
paginator = client.get_datasets()
6+
# confirm get_one returns first dataset
7+
all_datasets = list(paginator)
8+
get_one_dataset = copy(paginator).get_one()
9+
assert get_one_dataset.uid == all_datasets[0].uid
10+
11+
# confirm get_many(1) returns first dataset
12+
get_many_datasets = copy(paginator).get_many(1)
13+
assert get_many_datasets[0].uid == all_datasets[0].uid

0 commit comments

Comments
 (0)