Skip to content

Commit 41580d9

Browse files
committed
update: integration tests
1 parent 81fbc4e commit 41580d9

File tree

2 files changed

+106
-56
lines changed

2 files changed

+106
-56
lines changed

tests/system/aiplatform/e2e_base.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,12 @@ def setup_method(self):
5858
importlib.reload(initializer)
5959
importlib.reload(aiplatform)
6060

61-
@pytest.fixture()
61+
@pytest.fixture(scope="class")
6262
def shared_state(self) -> Generator[Dict[str, Any], None, None]:
6363
shared_state = {}
6464
yield shared_state
6565

66-
@pytest.fixture()
66+
@pytest.fixture(scope="class")
6767
def prepare_staging_bucket(
6868
self, shared_state: Dict[str, Any]
6969
) -> Generator[storage.bucket.Bucket, None, None]:
@@ -80,7 +80,7 @@ def prepare_staging_bucket(
8080
)
8181
yield
8282

83-
@pytest.fixture()
83+
@pytest.fixture(scope="class")
8484
def delete_staging_bucket(self, shared_state: Dict[str, Any]):
8585
"""Delete the staging bucket and all it's contents"""
8686

@@ -90,7 +90,7 @@ def delete_staging_bucket(self, shared_state: Dict[str, Any]):
9090
bucket = shared_state["bucket"]
9191
bucket.delete(force=True)
9292

93-
@pytest.fixture(autouse=True)
93+
@pytest.fixture(scope="class", autouse=True)
9494
def teardown(self, shared_state: Dict[str, Any]):
9595
"""Delete every Vertex AI resource created during test"""
9696

@@ -104,9 +104,7 @@ def teardown(self, shared_state: Dict[str, Any]):
104104

105105
for resource in shared_state["resources"]:
106106
try:
107-
if isinstance(
108-
resource, (aiplatform.Endpoint or aiplatform.Featurestore)
109-
):
107+
if isinstance(resource, (aiplatform.Endpoint, aiplatform.Featurestore)):
110108
# For endpoint, undeploy model then delete endpoint
111109
# For featurestore, force delete its entity_types and features with the featurestore
112110
resource.delete(force=True)

tests/system/aiplatform/test_featurestore.py

Lines changed: 101 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -44,80 +44,101 @@ class TestFeaturestore(e2e_base.TestEndToEnd):
4444

4545
_temp_prefix = "temp_vertex_sdk_e2e_featurestore_test"
4646

47-
def test_end_to_end(self, shared_state, caplog):
48-
49-
caplog.set_level(logging.INFO)
50-
47+
def test_create_get_list_featurestore(self, shared_state):
5148
aiplatform.init(
5249
project=e2e_base._PROJECT, location=e2e_base._LOCATION,
5350
)
5451

5552
base_list_featurestores = len(aiplatform.Featurestore.list())
56-
base_list_searched_features = len(aiplatform.Feature.search())
53+
shared_state["base_list_searched_features"] = len(aiplatform.Feature.search())
5754

58-
# Featurestore
5955
featurestore_id = self._make_display_name(key=_TEST_FEATURESTORE_ID).replace(
6056
"-", "_"
6157
)[:60]
6258
featurestore = aiplatform.Featurestore.create(featurestore_id=featurestore_id)
59+
6360
shared_state["resources"] = [featurestore]
61+
shared_state["featurestore"] = featurestore
62+
shared_state["featurestore_name"] = featurestore.resource_name
6463

6564
get_featurestore = aiplatform.Featurestore(
6665
featurestore_name=featurestore.resource_name
6766
)
6867
assert featurestore.resource_name == get_featurestore.resource_name
6968

7069
list_featurestores = aiplatform.Featurestore.list()
71-
assert len(list_featurestores) - base_list_featurestores == 1
70+
assert (len(list_featurestores) - base_list_featurestores) == 1
71+
72+
def test_create_get_list_entity_types(self, shared_state):
73+
74+
assert shared_state["featurestore"]
75+
assert shared_state["featurestore_name"]
76+
77+
featurestore = shared_state["featurestore"]
78+
featurestore_name = shared_state["featurestore_name"]
7279

73-
# EntityType
80+
aiplatform.init(
81+
project=e2e_base._PROJECT, location=e2e_base._LOCATION,
82+
)
7483

75-
# User EntityType
76-
user_entity_type_id = _TEST_USER_ENTITY_TYPE_ID
84+
# Users
7785
user_entity_type = featurestore.create_entity_type(
78-
entity_type_id=user_entity_type_id
86+
entity_type_id=_TEST_USER_ENTITY_TYPE_ID
7987
)
88+
shared_state["user_entity_type"] = user_entity_type
89+
shared_state["user_entity_type_name"] = user_entity_type.resource_name
8090

8191
get_user_entity_type = featurestore.get_entity_type(
82-
entity_type_id=user_entity_type_id
92+
entity_type_id=_TEST_USER_ENTITY_TYPE_ID
8393
)
8494
assert user_entity_type.resource_name == get_user_entity_type.resource_name
8595

86-
# Movie EntityType
87-
movie_entity_type_id = _TEST_MOVIE_ENTITY_TYPE_ID
96+
# Movies
8897
movie_entity_type = aiplatform.EntityType.create(
89-
entity_type_id=movie_entity_type_id,
90-
featurestore_name=featurestore.resource_name,
98+
entity_type_id=_TEST_MOVIE_ENTITY_TYPE_ID,
99+
featurestore_name=featurestore_name,
91100
)
101+
shared_state["movie_entity_type"] = movie_entity_type
102+
shared_state["movie_entity_type_name"] = movie_entity_type.resource_name
92103

93104
get_movie_entity_type = aiplatform.EntityType(
94105
entity_type_name=movie_entity_type.resource_name
95106
)
96107
assert movie_entity_type.resource_name == get_movie_entity_type.resource_name
97108

98109
list_entity_types = aiplatform.EntityType.list(
99-
featurestore_name=featurestore.resource_name
110+
featurestore_name=featurestore_name
100111
)
101112
assert len(list_entity_types) == 2
102113

103-
# Feature
114+
def test_create_batch_create_get_list_features(self, shared_state):
115+
116+
assert shared_state["user_entity_type"]
117+
assert shared_state["user_entity_type_name"]
118+
user_entity_type = shared_state["user_entity_type"]
119+
user_entity_type_name = shared_state["user_entity_type_name"]
120+
121+
aiplatform.init(
122+
project=e2e_base._PROJECT, location=e2e_base._LOCATION,
123+
)
124+
125+
list_user_features = user_entity_type.list_features()
126+
assert len(list_user_features) == 0
104127

105128
# User Features
106-
user_age_feature_id = _TEST_USER_AGE_FEATURE_ID
107129
user_age_feature = user_entity_type.create_feature(
108-
feature_id=user_age_feature_id, value_type="INT64"
130+
feature_id=_TEST_USER_AGE_FEATURE_ID, value_type="INT64"
109131
)
110132

111133
get_user_age_feature = user_entity_type.get_feature(
112-
feature_id=user_age_feature_id
134+
feature_id=_TEST_USER_AGE_FEATURE_ID
113135
)
114136
assert user_age_feature.resource_name == get_user_age_feature.resource_name
115137

116-
user_gender_feature_id = _TEST_USER_GENDER_FEATURE_ID
117138
user_gender_feature = aiplatform.Feature.create(
118-
feature_id=user_gender_feature_id,
139+
feature_id=_TEST_USER_GENDER_FEATURE_ID,
119140
value_type="STRING",
120-
entity_type_name=user_entity_type.resource_name,
141+
entity_type_name=user_entity_type_name,
121142
)
122143

123144
get_user_gender_feature = aiplatform.Feature(
@@ -127,66 +148,97 @@ def test_end_to_end(self, shared_state, caplog):
127148
user_gender_feature.resource_name == get_user_gender_feature.resource_name
128149
)
129150

130-
user_liked_genres_feature_id = _TEST_USER_LIKED_GENRES_FEATURE_ID
151+
list_user_features = aiplatform.Feature.list(
152+
entity_type_name=user_entity_type_name
153+
)
154+
assert len(list_user_features) == 2
155+
131156
user_feature_configs = {
132-
user_liked_genres_feature_id: {"value_type": "STRING_ARRAY"},
157+
_TEST_USER_LIKED_GENRES_FEATURE_ID: {"value_type": "STRING_ARRAY"},
133158
}
134159
user_entity_type.batch_create_features(feature_configs=user_feature_configs)
135160

136161
list_user_features = user_entity_type.list_features()
137162
assert len(list_user_features) == 3
138163

139-
user_entity_type = user_entity_type.ingest_from_gcs(
164+
def test_ingest_feature_values(self, shared_state, caplog):
165+
166+
assert shared_state["user_entity_type"]
167+
user_entity_type = shared_state["user_entity_type"]
168+
169+
caplog.set_level(logging.INFO)
170+
171+
aiplatform.init(
172+
project=e2e_base._PROJECT, location=e2e_base._LOCATION,
173+
)
174+
175+
user_entity_type.ingest_from_gcs(
140176
feature_ids=[
141-
user_age_feature_id,
142-
user_gender_feature_id,
143-
user_liked_genres_feature_id,
177+
_TEST_USER_AGE_FEATURE_ID,
178+
_TEST_USER_GENDER_FEATURE_ID,
179+
_TEST_USER_LIKED_GENRES_FEATURE_ID,
144180
],
145181
feature_time="update_time",
146182
gcs_source_uris=_TEST_USERS_ENTITY_TYPE_GCS_SRC,
147183
gcs_source_type="avro",
148184
entity_id_field="user_id",
149185
worker_count=2,
150-
sync=False,
151186
)
152187

153-
movie_title_feature_id = _TEST_MOVIE_TITLE_FEATURE_ID
154-
movie_genres_feature_id = _TEST_MOVIE_GENRES_FEATURE_ID
155-
movie_average_rating_id = _TEST_MOVIE_AVERAGE_RATING_FEATURE_ID
188+
assert "EntityType feature values imported." in caplog.text
189+
190+
caplog.clear()
191+
192+
def test_ingest_feature_values_with_config(self, shared_state, caplog):
193+
194+
assert shared_state["movie_entity_type"]
195+
movie_entity_type = shared_state["movie_entity_type"]
196+
197+
caplog.set_level(logging.INFO)
198+
199+
aiplatform.init(
200+
project=e2e_base._PROJECT, location=e2e_base._LOCATION,
201+
)
156202

157203
movie_feature_configs = {
158-
movie_title_feature_id: {"value_type": "STRING"},
159-
movie_genres_feature_id: {"value_type": "STRING"},
160-
movie_average_rating_id: {"value_type": "DOUBLE"},
204+
_TEST_MOVIE_TITLE_FEATURE_ID: {"value_type": "STRING"},
205+
_TEST_MOVIE_GENRES_FEATURE_ID: {"value_type": "STRING"},
206+
_TEST_MOVIE_AVERAGE_RATING_FEATURE_ID: {"value_type": "DOUBLE"},
161207
}
162208

163209
list_movie_features = movie_entity_type.list_features()
164210
assert len(list_movie_features) == 0
165211

166-
movie_entity_type = movie_entity_type.ingest_from_gcs(
212+
movie_entity_type.ingest_from_gcs(
167213
feature_ids=[
168-
movie_title_feature_id,
169-
movie_genres_feature_id,
170-
movie_average_rating_id,
214+
_TEST_MOVIE_TITLE_FEATURE_ID,
215+
_TEST_MOVIE_GENRES_FEATURE_ID,
216+
_TEST_MOVIE_AVERAGE_RATING_FEATURE_ID,
171217
],
172218
feature_time="update_time",
173219
gcs_source_uris=_TEST_MOVIES_ENTITY_TYPE_GCS_SRC,
174220
gcs_source_type="avro",
175221
entity_id_field="movie_id",
176222
worker_count=2,
177223
batch_create_feature_configs=movie_feature_configs,
178-
sync=False,
179224
)
180225

181-
user_entity_type.wait()
182-
movie_entity_type.wait()
183-
184-
assert "EntityType feature values imported." in caplog.text
185-
186226
list_movie_features = movie_entity_type.list_features()
187227
assert len(list_movie_features) == 3
188228

189-
list_searched_features = aiplatform.Feature.search()
190-
assert len(list_searched_features) - base_list_searched_features == 6
229+
assert "EntityType feature values imported." in caplog.text
191230

192231
caplog.clear()
232+
233+
def test_search_features(self, shared_state):
234+
235+
assert shared_state["base_list_searched_features"] is not None
236+
237+
aiplatform.init(
238+
project=e2e_base._PROJECT, location=e2e_base._LOCATION,
239+
)
240+
241+
list_searched_features = aiplatform.Feature.search()
242+
assert (
243+
len(list_searched_features) - shared_state["base_list_searched_features"]
244+
) == 3

0 commit comments

Comments
 (0)