From 1fd1ad4d808a8fbc0359ca0dbe4f424d8ed3d04e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B4=AB=E6=99=B4?= Date: Thu, 15 Jul 2021 10:41:55 +0800 Subject: [PATCH] Add README_CN.md of test (#6525) Signed-off-by: wangting0128 --- tests20/python_client/README_CN.md | 329 +++++++++++++++++++++++++++++ 1 file changed, 329 insertions(+) create mode 100644 tests20/python_client/README_CN.md diff --git a/tests20/python_client/README_CN.md b/tests20/python_client/README_CN.md new file mode 100644 index 0000000000..d6da3be8c5 --- /dev/null +++ b/tests20/python_client/README_CN.md @@ -0,0 +1,329 @@ +

测试框架使用指南

+

简介

+

基于 pytest 编写的 pymilvus-orm 的测试框架。

+

测试代码:https://github.com/milvus-io/milvus/tree/master/tests20/python_client

+

 

+

快速开始

+
部署 Milvus
+

Milvus 支持4种部署方式,请根据需求选择部署方式,pymilvus_orm 支持任意部署下的 Milvus。

+
    +
  1. 源码编译部署
  2. +
  3. Docker Compose 部署(单机版本 分布式版本)
  4. +
  5. Kubernetes 部署(单机版本 分布式版本)
  6. +
  7. KinD 部署
  8. + +
+

KinD部署提供一键安装部署:最新的Milvus服务和测试客户端。KinD部署非常适合开发/调试测试用例,功能验证等对数据规模要求不大的场景,但并不适合性能或压力等有较大数据规模的场景。

+
    +
  1. 准备环境
  2. + +
+ +
    +
  1. 脚本安装
  2. + +
+ + +
 ./e2e-k8s.sh 
+
+

note:默认参数下KinD环境将在执行完测试用例后被自动清理

+ +
 ./e2e-k8s.sh --skip-cleanup
+
+ +
 ./e2e-k8s.sh --skip-cleanup --skip-test --manual
+
+

Note:需要log in到测试客户端的container进行手动执行或调试测试用例

+ +
 ./e2e-k8s.sh --help
+
+ +
 kind export logs .
+
+

 

+
pymilvus_orm 测试环境部署及用例执行
+

推荐使用 Python 3(>= 3.6) ,与 pymilvus_orm 支持的 python 版本保持一致。

+

Note: 如选择KinD部署方式,以下步骤可以自动完成。

+
    +
  1. 安装测试所需的 python 包,进入代码 */milvus/tests20/python_client/ 目录,执行命令:
  2. + +
+
pip install -r requirements.txt
+
+
    +
  1. config目录下,测试的日志目录默认为:/tmp/ci_logs/,可在启动测试用例之前添加环境变量来修改log的存放路径:
  2. + +
+
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
+
    +
  1. 在主目录 pytest.ini 文件内可设置默认传递的参数,如下例中 ip 为所需要设置的 milvus 服务的ip地址,*.html 为测试生成的 report
  2. + +
+
addopts = --host *.*.*.*  --html=/tmp/ci_logs/report.html
+
+
    +
  1. 进入 testcases 目录,命令与 pytest 框架的执行命令一致,运行如下命令执行测试用例:
  2. + +
+
python3 -W ignore -m pytest <选择的测试文件>
+
+

 

+

模块介绍

+

模块调用关系图

+

img

+
工作目录及文件介绍
+ +

 

+
主要设计思路
+ +

 

+

代码添加

+

可参考添加新的测试用例或框架工具。

+

 

+
Python 测试代码添加注意事项
+
    +
  1. 测试编码风格
    +
  2. + +
+ + + + + + + + +
    +
  1. 编码注意事项
    +
  2. + +
+ +

如当需要创建多个 partition 对象时,可调用方法 self.init_partition_wrap(),该方法返回的结果就是新生成的 partition 对象。当无需创建多个对象时,直接使用 self.partition_wrap 即可

+
# 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
+
+ +
# 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"})
+
+ +
# 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})
+
+
    +
  1. 测试用例添加
    +
  2. + +
+ +

+
+    @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: 1. 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: 1, ct.err_msg: "can't find collection"})
+
+ +
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()
+
+ +
def init_partition(self, collection, name, description="", check_task=None, check_items=None, **kwargs)
+
+ +
    +
  1. 框架功能添加
    +
  2. + +
+