qixuan 36147b10f5 test: Add insert and upsert related cases for null and default value support (#36932) | 14 小时之前 | |
---|---|---|
.. | ||
assets | 2 年之前 | |
base | 3 周之前 | |
bulk_insert | 6 月之前 | |
chaos | 3 月之前 | |
check | 2 周之前 | |
common | 1 周之前 | |
config | 1 年之前 | |
customize | 4 月之前 | |
deploy | 2 月之前 | |
graphs | 2 年之前 | |
load | 5 月之前 | |
loadbalance | 10 月之前 | |
milvus_client | 4 天之前 | |
rate_limit | 2 年之前 | |
resource_group | 4 月之前 | |
scale | 2 年之前 | |
standby | 11 月之前 | |
testcases | 14 小时之前 | |
utils | 4 月之前 | |
.dockerignore | 3 年之前 | |
.gitignore | 2 年之前 | |
Dockerfile | 1 月之前 | |
README.md | 1 年之前 | |
README_CN.md | 2 年之前 | |
conftest.py | 5 月之前 | |
pytest.ini | 4 月之前 | |
requirements.txt | 1 周之前 | |
run.sh | 3 年之前 |
This document guides you through the Pytest-based PyMilvus test framework.
You can find the test code on GitHub.
To accommodate the variety of requirements, Milvus offers as many as four deployment methods. PyMilvus supports Milvus deployed with any of the methods below:
Install with Docker Compose
Install on Kunernetes
Install with KinD
For test purposes, we recommend installing Milvus with KinD. KinD supports the ClickOnce deployment of Milvus and its test client. KinD deployment is tailored for scenarios with small data scale, such as development/debugging test cases and functional verification.
Prerequisites
Install KinD with script
$ ./e2e-k8s.sh
$ ./e2e-k8s.sh --skip-cleanup
$ ./e2e-k8s.sh --skip-cleanup --skip-test --manual
Note: You need to log in to the containers of the test client to proceed manual execution and debugging of the test case.
$ ./e2e-k8s.sh --help
$ kind export logs .
We recommend using Python 3 (3.8 or higher), consistent with the version supported by PyMilvus.
Note: Procedures listed below will be completed automatically if you deployed Milvus using KinD.
$ pip install -r requirements.txt
$ export CI_LOG_PATH=/tmp/ci_logs/test/
Log Level | Log File |
---|---|
debug |
ci_test_log.debug |
info |
ci_test_log.log |
error |
ci_test_log.err |
addopts = --host *.*.*.* --html=/tmp/ci_logs/report.html
where host
should be set as the IP address of the Milvus service, and *.html
is the report generated for the test.
$ python3 -W ignore -m pytest <test_file_name>
This section specifies references while adding new test cases or framework tools.
Test files: each SDK category corresponds to a test file. So do load
and search
methods.
Test categories: test files fall into two categories
TestObjectParams
:TestPartitionParams
represents the parameter test for Partition interface.default
, empty
, none
, datatype
, maxsize
, etc.TestObjectOperations
:TestPartitionOperations
represents the function/operation test for Partition interface.Testcase naming
TestObjectParams
:
Name after the parameter input of the test case. For instance, test_partition_empty_name()
represents test on performance with the empty string as the name
parameter input.
TestObjectOperations
Name after the operation procedure of the test case. For instance, test_partition_drop_partition_twice()
represents the test on the performance when dropping partitions twice consecutively.
Name after assertions. For instance, test_partition_maximum_partitions()
represents test on the maximum number of partitions that can be created.
To create multiple partitions objects, call
self.init_partition_wrap()
, which returns the newly created partition objects. Callself.partition_wrap
instead when you do not need multiple objects.
# create partition -Call the default initialization method
partition_w = self.init_partition_wrap()
assert partition_w.is_empty
# create partition -Directly call the encapsulated object
self.partition_wrap.init_partition(collection=collection_name, name=partition_name)
assert self.partition_wrap.is_empty
check_task=CheckTasks.err_res
. # create partition with collection is None
self.partition_wrap.init_partition(collection=None, name=partition_name, check_task=CheckTasks.err_res, check_items={ct.err_code: 1, ct.err_msg: "'NoneType' object has no attribute"})
check_task=CheckTasks.check_partition_property
. You can build new test methods in CheckTasks
for invocation in test cases. # create partition
partition_w = self.init_partition_wrap(collection_w, partition_name, check_task=CheckTasks.check_partition_property, check_items={"name": partition_name, "description": description, "is_empty": True, "num_entities": 0})
True
/False
. The returned judgment can be used in the extra result checking of test cases. @pytest.mark.tags(CaseLabel.L1)
@pytest.mark.parametrize("partition_name", [cf.gen_unique_str(prefix)])
def test_partition_dropped_collection(self, partition_name):
"""
target: verify create partition against a dropped collection
method: 1. create collection1
2. drop collection1
3. create partition in collection1
expected: raise exception
"""
# create collection
collection_w = self.init_collection_wrap()
# drop collection
collection_w.drop()
# create partition failed
self.partition_wrap.init_partition(collection_w.collection, partition_name, check_task=CheckTasks.err_res, check_items={ct.err_code: 4, ct.err_msg: "collection not found"})
Tips
Initialize the tested category in the setup method of the Base category in the base/client_base.py file, as shown below:
self.connection_wrap = ApiConnectionsWrapper()
self.utility_wrap = ApiUtilityWrapper()
self.collection_wrap = ApiCollectionWrapper()
self.partition_wrap = ApiPartitionWrapper()
self.index_wrap = ApiIndexWrapper()
self.collection_schema_wrap = ApiCollectionSchemaWrapper()
self.field_schema_wrap = ApiFieldSchemaWrapper()
check_task
and check_items
.
python
def init_partition(self, collection, name, description="", check_task=None, check_items=None, **kwargs)
check_task
is used to select the corresponding interface test method in the ResponseChecker check category in the check/func_check.py file. You can choose methods under the CheckTasks
category in the common/common_type.py file.
The specific content of check_items
passed to the test method is determined by the implemented test method check_task
.
The tested interface can return normal results when CheckTasks
and check_items
are not passed.
Add global methods or tools under utils directory.
Add corresponding configurations under config directory.