From 48f2d2e5344f97ea2736749feddd03263f4ffe5d Mon Sep 17 00:00:00 2001 From: nico <109071306+NicoYuan1986@users.noreply.github.com> Date: Tue, 6 Jun 2023 12:06:41 +0800 Subject: [PATCH] Add test cases of default value (#24636) Signed-off-by: nico --- tests/python_client/common/common_func.py | 10 +-- tests/python_client/requirements.txt | 2 +- .../testcases/test_collection.py | 84 +++++++++++++++++++ tests/python_client/testcases/test_insert.py | 65 ++++++++++++++ 4 files changed, 155 insertions(+), 6 deletions(-) diff --git a/tests/python_client/common/common_func.py b/tests/python_client/common/common_func.py index 285c175263..be948ab8d9 100644 --- a/tests/python_client/common/common_func.py +++ b/tests/python_client/common/common_func.py @@ -111,15 +111,15 @@ def gen_int64_field(name=ct.default_int64_field_name, description=ct.default_des return int64_field -def gen_float_field(name=ct.default_float_field_name, is_primary=False, description=ct.default_desc): +def gen_float_field(name=ct.default_float_field_name, is_primary=False, description=ct.default_desc, **kwargs): float_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=DataType.FLOAT, description=description, - is_primary=is_primary) + is_primary=is_primary, **kwargs) return float_field -def gen_double_field(name=ct.default_double_field_name, is_primary=False, description=ct.default_desc): - double_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=DataType.DOUBLE, - description=description, is_primary=is_primary) +def gen_double_field(name=ct.default_double_field_name, is_primary=False, description=ct.default_desc, **kwargs): + double_field, _ = ApiFieldSchemaWrapper().init_field_schema(name=name, dtype=DataType.DOUBLE, description=description, + is_primary=is_primary, **kwargs) return double_field diff --git a/tests/python_client/requirements.txt b/tests/python_client/requirements.txt index 8339cae113..f0ed7bc9bc 100644 --- a/tests/python_client/requirements.txt +++ b/tests/python_client/requirements.txt @@ -12,7 +12,7 @@ allure-pytest==2.7.0 pytest-print==0.2.1 pytest-level==0.1.1 pytest-xdist==2.5.0 -pymilvus==2.4.0.dev63 +pymilvus==2.4.0.dev67 pytest-rerunfailures==9.1.1 git+https://github.com/Projectplace/pytest-tags ndg-httpsclient diff --git a/tests/python_client/testcases/test_collection.py b/tests/python_client/testcases/test_collection.py index 0147642353..99fc6d16b7 100644 --- a/tests/python_client/testcases/test_collection.py +++ b/tests/python_client/testcases/test_collection.py @@ -1657,6 +1657,11 @@ class TestCollectionMultiCollections(TestcaseBase): class TestCreateCollection(TestcaseBase): + + @pytest.fixture(scope="function", params=[False, True]) + def auto_id(self, request): + yield request.param + @pytest.mark.tags(CaseLabel.L1) def test_create_collection_multithread(self): """ @@ -1685,6 +1690,30 @@ class TestCreateCollection(TestcaseBase): for item in collection_names: assert item in self.utility_wrap.list_collections()[0] + @pytest.mark.tags(CaseLabel.L1) + def test_create_collection_using_default_value(self, auto_id): + """ + target: test create collection with default_value + method: create a schema with all fields using default value + expected: collections are created + """ + fields = [ + cf.gen_int64_field(name='pk', is_primary=True), + cf.gen_float_vec_field(), + cf.gen_int8_field(default_value=numpy.int8(8)), + cf.gen_int16_field(default_value=numpy.int16(16)), + cf.gen_int32_field(default_value=numpy.int32(32)), + cf.gen_int64_field(default_value=numpy.int64(64)), + cf.gen_float_field(default_value=numpy.float32(3.14)), + cf.gen_double_field(default_value=numpy.double(3.1415)), + cf.gen_bool_field(default_value=False), + cf.gen_string_field(default_value="abc") + ] + schema = cf.gen_collection_schema(fields, auto_id=auto_id) + self.init_collection_wrap(schema=schema, + check_task=CheckTasks.check_collection_property, + check_items={"schema": schema}) + class TestCreateCollectionInvalid(TestcaseBase): """ @@ -1715,6 +1744,61 @@ class TestCreateCollectionInvalid(TestcaseBase): schema, _ = self.collection_schema_wrap.init_collection_schema(fields=field_schema_list) self.init_collection_wrap(name=c_name, schema=schema, check_task=CheckTasks.err_res, check_items=error) + @pytest.mark.tags(CaseLabel.L2) + @pytest.mark.parametrize("default_value", ["abc"]) + @pytest.mark.skip(reason="issue #24634") + def test_create_collection_with_invalid_default_value_string(self, default_value): + """ + target: test create collection with maximum fields + method: create collection with maximum field number + expected: raise exception + """ + fields = [ + cf.gen_int64_field(name='pk', is_primary=True), + cf.gen_float_vec_field(), + cf.gen_string_field(max_length=2, default_value=default_value) + ] + schema = cf.gen_collection_schema(fields) + self.init_collection_wrap(schema=schema, + check_task=CheckTasks.check_collection_property, + check_items={"schema": schema}) + + @pytest.mark.tags(CaseLabel.L2) + @pytest.mark.parametrize("default_value", ["abc", 9.09, 1, False]) + def test_create_collection_with_invalid_default_value_float(self, default_value): + """ + target: test create collection with maximum fields + method: create collection with maximum field number + expected: raise exception + """ + fields = [ + cf.gen_int64_field(name='pk', is_primary=True), + cf.gen_float_vec_field(), + cf.gen_float_field(default_value=default_value) + ] + schema = cf.gen_collection_schema(fields) + self.init_collection_wrap(schema=schema, check_task=CheckTasks.err_res, + check_items={ct.err_code: 1, + ct.err_msg: "default value type mismatches field schema type"}) + + @pytest.mark.tags(CaseLabel.L2) + @pytest.mark.parametrize("default_value", ["abc", 9.09, 1, False]) + def test_create_collection_with_invalid_default_value_int8(self, default_value): + """ + target: test create collection with maximum fields + method: create collection with maximum field number + expected: raise exception + """ + fields = [ + cf.gen_int64_field(name='pk', is_primary=True), + cf.gen_float_vec_field(), + cf.gen_int8_field(default_value=default_value) + ] + schema = cf.gen_collection_schema(fields) + self.init_collection_wrap(schema=schema, check_task=CheckTasks.err_res, + check_items={ct.err_code: 1, + ct.err_msg: "default value type mismatches field schema type"}) + class TestDropCollection(TestcaseBase): """ diff --git a/tests/python_client/testcases/test_insert.py b/tests/python_client/testcases/test_insert.py index 8ed6e60275..1adafa78c4 100644 --- a/tests/python_client/testcases/test_insert.py +++ b/tests/python_client/testcases/test_insert.py @@ -413,6 +413,10 @@ class TestInsertOperation(TestcaseBase): def dim(self, request): yield request.param + @pytest.fixture(scope="function", params=[False, True]) + def auto_id(self, request): + yield request.param + @pytest.mark.tags(CaseLabel.L2) def test_insert_without_connection(self): """ @@ -850,6 +854,67 @@ class TestInsertOperation(TestcaseBase): collection_w.insert(data=data) assert collection_w.num_entities == nb + @pytest.mark.tags(CaseLabel.L1) + @pytest.mark.parametrize("default_value", [[], None]) + def test_insert_one_field_using_default_value(self, default_value, auto_id): + """ + target: test insert with one field using default value + method: 1. create a collection with one field using default value + 2. insert using []/None to replace the field value + expected: insert successfully + """ + fields = [cf.gen_int64_field(is_primary=True), cf.gen_float_field(), + cf.gen_string_field(default_value="abc"), cf.gen_float_vec_field()] + schema = cf.gen_collection_schema(fields, auto_id=auto_id) + collection_w = self.init_collection_wrap(schema=schema) + data = [ + [i for i in range(ct.default_nb)], + [np.float32(i) for i in range(ct.default_nb)], + default_value, + cf.gen_vectors(ct.default_nb, ct.default_dim) + ] + if auto_id: + del data[0] + collection_w.insert(data) + assert collection_w.num_entities == ct.default_nb + + @pytest.mark.tags(CaseLabel.L1) + @pytest.mark.parametrize("default_value", [[], None]) + def test_insert_multi_fields_using_default_value(self, default_value, auto_id): + """ + target: test insert with multi fields using default value + method: 1. default value fields before vector, insert [], None, fail + 2. default value fields all after vector field, insert empty, succeed + expected: report error and insert successfully + """ + # 1. default value fields before vector, insert [], None, fail + fields = [cf.gen_int64_field(is_primary=True), cf.gen_float_field(default_value=np.float32(1.0)), + cf.gen_string_field(default_value="abc"), cf.gen_float_vec_field()] + schema = cf.gen_collection_schema(fields, auto_id=auto_id) + collection_w = self.init_collection_wrap(schema=schema) + data = [[i for i in range(ct.default_nb)], default_value, + # if multi default_value fields before vector field, every field must use []/None + cf.gen_vectors(ct.default_nb, ct.default_dim)] + if auto_id: + del data[0] + collection_w.insert(data, check_task=CheckTasks.err_res, + check_items={ct.err_code: 1, + ct.err_msg: "The data type of field varchar doesn't match"}) + # 2. default value fields all after vector field, insert empty, succeed + fields = [cf.gen_int64_field(is_primary=True), cf.gen_float_vec_field(), + cf.gen_float_field(default_value=np.float32(1.0)), + cf.gen_string_field(default_value="abc")] + schema = cf.gen_collection_schema(fields, auto_id=auto_id) + collection_w = self.init_collection_wrap(schema=schema) + data = [[i for i in range(ct.default_nb)], cf.gen_vectors(ct.default_nb, ct.default_dim)] + data1 = [[i for i in range(ct.default_nb)], cf.gen_vectors(ct.default_nb, ct.default_dim), + [np.float32(i) for i in range(ct.default_nb)]] + if auto_id: + del data[0], data1[0] + collection_w.insert(data) + assert collection_w.num_entities == ct.default_nb + collection_w.insert(data1) + class TestInsertAsync(TestcaseBase): """