Skip to content

Commit c24a73c

Browse files
committed
Splitted s3 tests
1 parent 8cc0e51 commit c24a73c

File tree

7 files changed

+57
-22
lines changed

7 files changed

+57
-22
lines changed

ydb/tests/fq/s3/conftest.py

+35-12
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,19 @@
2727
S3_PID_FILE = "s3.pid"
2828

2929

30+
class TestCounter:
31+
def __init__(self, tests_count_limit, error_string):
32+
self.tests_count_limit = tests_count_limit
33+
self.error_string = error_string
34+
self.number_tests = 0
35+
36+
def on_test_start(self):
37+
self.number_tests += 1
38+
assert self.number_tests <= self.tests_count_limit, \
39+
f"{self.error_string} exceeded limit {self.number_tests} vs {self.tests_count_limit}, " \
40+
"this may lead timeouts on CI, please split this class"
41+
42+
3043
@pytest.fixture(scope="module")
3144
def mvp_external_ydb_endpoint(request) -> str:
3245
return request.param["endpoint"] if request is not None and hasattr(request, 'param') else None
@@ -61,12 +74,12 @@ def is_s3_ready():
6174
recipes_common.stop_daemon(pid)
6275

6376

64-
@pytest.fixture(scope="module")
77+
@pytest.fixture(scope="class")
6578
def kikimr_settings(request: pytest.FixtureRequest):
6679
return getattr(request, "param", dict())
6780

6881

69-
@pytest.fixture(scope="module")
82+
@pytest.fixture(scope="class")
7083
def kikimr_params(request: pytest.FixtureRequest):
7184
return request
7285

@@ -85,15 +98,22 @@ def get_kikimr_extensions(s3: S3, yq_version: str, kikimr_settings, mvp_external
8598
]
8699

87100

88-
@pytest.fixture(scope="module")
89-
def kikimr_yqv1(kikimr_params: pytest.FixtureRequest, s3: S3, kikimr_settings, mvp_external_ydb_endpoint):
101+
@pytest.fixture(scope="class")
102+
def kikimr_starts_counter():
103+
return TestCounter(10, "Number kikimr restarts in one class")
104+
105+
106+
@pytest.fixture(scope="class")
107+
def kikimr_yqv1(kikimr_params: pytest.FixtureRequest, s3: S3, kikimr_settings, mvp_external_ydb_endpoint, kikimr_starts_counter):
108+
kikimr_starts_counter.on_test_start()
90109
kikimr_extensions = get_kikimr_extensions(s3, YQV1_VERSION_NAME, kikimr_settings, mvp_external_ydb_endpoint)
91110
with start_kikimr(kikimr_params, kikimr_extensions) as kikimr:
92111
yield kikimr
93112

94113

95-
@pytest.fixture(scope="module")
96-
def kikimr_yqv2(kikimr_params: pytest.FixtureRequest, s3: S3, kikimr_settings, mvp_external_ydb_endpoint):
114+
@pytest.fixture(scope="class")
115+
def kikimr_yqv2(kikimr_params: pytest.FixtureRequest, s3: S3, kikimr_settings, mvp_external_ydb_endpoint, kikimr_starts_counter):
116+
kikimr_starts_counter.on_test_start()
97117
kikimr_extensions = get_kikimr_extensions(s3, YQV2_VERSION_NAME, kikimr_settings, mvp_external_ydb_endpoint)
98118
with start_kikimr(kikimr_params, kikimr_extensions) as kikimr:
99119
yield kikimr
@@ -115,8 +135,14 @@ def kikimr(yq_version: str, kikimr_yqv1, kikimr_yqv2):
115135
return kikimr
116136

117137

138+
@pytest.fixture(scope="class")
139+
def tests_counter():
140+
return TestCounter(200, "Number tests in one class")
141+
142+
118143
@pytest.fixture
119-
def client(kikimr, request=None):
144+
def client(kikimr, tests_counter, request=None):
145+
tests_counter.on_test_start()
120146
client = FederatedQueryClient(
121147
request.param["folder_id"] if request is not None else "my_folder", streaming_over_kikimr=kikimr
122148
)
@@ -128,8 +154,5 @@ def client(kikimr, request=None):
128154

129155
@pytest.fixture
130156
def unique_prefix(request: pytest.FixtureRequest):
131-
name_hash = hash(request.node.name)
132-
if name_hash >= 0:
133-
return f"p{name_hash}_"
134-
else:
135-
return f"n{-name_hash}_"
157+
name_hash = abs(hash(request.node.name))
158+
return f"h{name_hash}_{request.function.__name__}"

ydb/tests/fq/s3/test_bindings.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#!/usr/bin/env python
22
# -*- coding: utf-8 -*-
33

4+
import time
45
import boto3
56
import logging
67
import pytest
@@ -17,7 +18,7 @@
1718
}
1819

1920

20-
class TestBindings:
21+
class TestBindingsChunk1:
2122
@staticmethod
2223
def _preprocess_query(sql: str, yq_version: str) -> str:
2324
if yq_version == 'v1':
@@ -40,7 +41,7 @@ def _assert_bindings(client: FederatedQueryClient, expected_binding_names: list[
4041
@staticmethod
4142
def _assert_query_results(client: FederatedQueryClient, sql: str, yq_version: str, expected_result_set):
4243
query_id = client.create_query(
43-
"simple", TestBindings._preprocess_query(sql, yq_version), type=fq.QueryContent.QueryType.ANALYTICS
44+
"simple", TestBindingsChunk1._preprocess_query(sql, yq_version), type=fq.QueryContent.QueryType.ANALYTICS
4445
).result.query_id
4546
client.wait_query_status(query_id, fq.QueryMeta.COMPLETED)
4647

@@ -248,6 +249,7 @@ def test_modify_connection_with_a_lot_of_bindings(
248249
@yq_all
249250
@pytest.mark.parametrize("client", [{"folder_id": "my_folder"}], indirect=True)
250251
def test_name_uniqueness_constraint(self, kikimr, client: FederatedQueryClient, unique_prefix):
252+
time.sleep(1000)
251253
# Test connection & binding creation
252254
kikimr.control_plane.wait_bootstrap(1)
253255
storage_connection_name = unique_prefix + "connection_name"
@@ -347,6 +349,8 @@ def test_name_uniqueness_constraint(self, kikimr, client: FederatedQueryClient,
347349
)
348350
assert modify_binding_result.issues[0].severity == 1
349351

352+
353+
class TestBindingsChunk2:
350354
@yq_all
351355
@pytest.mark.parametrize("client", [{"folder_id": "my_folder"}], indirect=True)
352356
@pytest.mark.parametrize("kikimr_settings", [{"bindings_mode": "BM_DROP_WITH_WARNING"}], indirect=True)

ydb/tests/fq/s3/test_explicit_partitioning.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from ydb.tests.tools.fq_runner.kikimr_utils import yq_all
1414

1515

16-
class TestS3(TestYdsBase):
16+
class TestS3Chunk1(TestYdsBase):
1717
@yq_all
1818
@pytest.mark.parametrize("client", [{"folder_id": "my_folder"}], indirect=True)
1919
@pytest.mark.parametrize("runtime_listing", ["false", "true"])
@@ -866,6 +866,8 @@ def test_projection_enum_type_invalid_validation(
866866
describe_result.query.issue
867867
)
868868

869+
870+
class TestS3Chunk2(TestYdsBase):
869871
@yq_all
870872
@pytest.mark.parametrize(
871873
"client, column_type, is_correct",

ydb/tests/fq/s3/test_s3.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from ydb.tests.tools.fq_runner.kikimr_utils import yq_v1, yq_v2, yq_all
1414

1515

16-
class TestS3(TestYdsBase):
16+
class TestS3Chunk1(TestYdsBase):
1717
@yq_all
1818
@pytest.mark.parametrize("client", [{"folder_id": "my_folder"}], indirect=True)
1919
@pytest.mark.parametrize("runtime_listing", ["false", "true"])
@@ -455,6 +455,8 @@ def wait_checkpoints(require_query_is_on=False):
455455
client.abort_query(query_id)
456456
client.wait_query(query_id)
457457

458+
459+
class TestS3Chunk2(TestYdsBase):
458460
@yq_v1 # v2 compute with multiple nodes is not supported yet
459461
@pytest.mark.parametrize("client", [{"folder_id": "my_folder"}], indirect=True)
460462
@pytest.mark.parametrize("kikimr_params", [{"compute": 3}], indirect=True)

ydb/tests/fq/s3/ya.make

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
PY3TEST()
22

33
FORK_TEST_FILES()
4+
FORK_TESTS()
45

56
INCLUDE(${ARCADIA_ROOT}/ydb/tests/tools/fq_runner/ydb_runner_with_datastreams.inc)
67

ydb/tests/library/harness/kikimr_runner.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -421,10 +421,13 @@ def unregister_and_stop_slots(self, slots):
421421
for i in slots:
422422
i.stop()
423423

424-
def __stop_node(self, node):
424+
def __stop_node(self, node, kill=False):
425425
ret = None
426426
try:
427-
node.stop()
427+
if kill:
428+
node.kill()
429+
else:
430+
node.stop()
428431
except daemon.DaemonError as exceptions:
429432
ret = exceptions
430433
else:
@@ -434,16 +437,16 @@ def __stop_node(self, node):
434437
shutil.rmtree(self.__common_udfs_dir, ignore_errors=True)
435438
return ret
436439

437-
def stop(self):
440+
def stop(self, kill=False):
438441
saved_exceptions = []
439442

440443
for slot in self.slots.values():
441-
exception = self.__stop_node(slot)
444+
exception = self.__stop_node(slot, kill)
442445
if exception is not None:
443446
saved_exceptions.append(exception)
444447

445448
for node in self.nodes.values():
446-
exception = self.__stop_node(node)
449+
exception = self.__stop_node(node, kill)
447450
if exception is not None:
448451
saved_exceptions.append(exception)
449452

ydb/tests/tools/fq_runner/kikimr_runner.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ def start(self):
5252

5353
def stop(self):
5454
if self.kikimr_cluster:
55-
self.kikimr_cluster.stop()
55+
self.kikimr_cluster.stop(kill=True)
5656

5757
def endpoint(self, node_index=None):
5858
return "localhost:{}".format(

0 commit comments

Comments
 (0)