From 3d3fad8805502c20cf2d54ab8e7f8ed59e9c9720 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=B4=AB=E6=99=B4?= Date: Thu, 15 Jul 2021 16:09:58 +0800 Subject: [PATCH] Update readme file of test (#6546) * Part of the fixture moved to the conftest file Signed-off-by: wangting0128 * Update README_CN.md file Signed-off-by: wangting0128 * Update index case Signed-off-by: wangting0128 * Update readme of test Signed-off-by: wangting0128 --- tests20/python_client/README_CN.md | 164 +++++++++++++---------------- 1 file changed, 72 insertions(+), 92 deletions(-) diff --git a/tests20/python_client/README_CN.md b/tests20/python_client/README_CN.md index 71a957b2be..c9997f1314 100644 --- a/tests20/python_client/README_CN.md +++ b/tests20/python_client/README_CN.md @@ -121,144 +121,123 @@
  • testcases 目录下的测试文件,继承 base/client_base.py 里的 TestcaseBase 模块,进行相应的测试用例编写。用例里用到的通用参数和数据处理方法,写入common模块供用例调用。
  • config 目录下加入一些全局配置,如日志的路径。
  • utils 目录下负责实现全局的方法,如全局可用的日志模块。
  • - +

     

    代码添加

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

     

    +
    Python 测试代码添加注意事项
    + +
      1. 测试编码风格
      -
      -
    • test 文件:每一个 SDK 类对应一个 test 文件,Load 和 Search 单独对应一个 test 文件
    • +
        +
      • test 文件:每一个 SDK 类对应一个 test 文件,Load 和 Search 单独对应一个 test 文件
      • +
      +
        +
      • test类:每一个 test 文件中分两个类

        +
          +
        • TestObjectParams :

          +
            +
          • 如 TestPartitionParams 表示 Partition Interface 参数检查测试用例类
          • +
          • 检查在不同输入参数条件下,目标类/方法的表现,参数注意覆盖default,empty,none,datatype,maxsize边界值等
          • +
          +
        • +
        +
          +
        • TestObjectOperations:

          +
            +
          • 如 TestPartitionOperations 表示 Partition Interface 针对不同 function 或操作的测试
          • +
          • 检查在合法输入参数,与其他接口有一定交互的条件下,目标类/方法的返回和表现
          • +
          +
        +
      • +
      -
    -
      -
    • test

      -

      -

      类:每一个 test 文件中分两个类

      -
        -
      • TestObjectParams :

        -
          -
        • 如 TestPartitionParams 表示 Partition Interface 参数检查测试用例类
        • - -
        -
      • - -
      -
    • - -
    -
      -
    • 检查在不同输入参数条件下,目标类/方法的表现,参数注意覆盖default,empty,none,datatype,maxsize边界值等
    • - -
    -
      -
    • TestObjectOperations:

      -
        -
      • 如 TestPartitionOperations 表示 Partition Interface 针对不同 function 或操作的测试
      • - -
      -
    • - -
    -
      -
    • 检查在合法输入参数,与其他接口有一定交互的条件下,目标类/方法的返回和表现
    • - -
    • testcase 命名

      • TestObjectParams 类

        -
          -
        • 以testcase输入参数区分命名,如 test_partition_empty_name() 表示验证空字符串作为 name 参数输入的表现
        • - -
        +
          +
        • 以testcase输入参数区分命名,如 test_partition_empty_name() 表示验证空字符串作为 name 参数输入的表现
        • +
      • -
      -
    • - -
    -
    • TestObjectOperations 类

      -
        -
      • 以 testcase 操作步骤区分命名,如 test_partition_drop_partition_twice() 表示验证连续 drop 两次 partition 的表现
      • - -
      +
        +
      • 以 testcase 操作步骤区分命名,如 test_partition_drop_partition_twice() 表示验证连续 drop 两次 partition 的表现
      • +
      • 以 testcase 验证点区分命名,如 test_partition_maximum_partitions() 表示验证创建 partition 的最大数量
      • +
    • +
    +
      -
    • 以 testcase 验证点区分命名,如 test_partition_maximum_partitions() 表示验证创建 partition 的最大数量
    • -
      -
      2. 编码注意事项
      +
      2. 编码注意事项
      -
    • 不能在测试用例文件中初始化 ORM 对象
    • -
    • 一般情况下,不在测试用例文件中直接添加日志代码
    • -
    • 在测试用例中,应直接调用封装好的方法或者属性,如下所示:
    • - +
        +
      • 不能在测试用例文件中初始化 ORM 对象
      • +
      • 一般情况下,不在测试用例文件中直接添加日志代码
      • +
      • 在测试用例中,应直接调用封装好的方法或者属性,如下所示:
      +

      如当需要创建多个 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
       
      +
      • 验证接口返回错误或异常

          -
        • check_task=CheckTasks.err_res
        • -
        • 输入期望的错误码和错误信息
        • - +
        • check_task=CheckTasks.err_res
        • +
        • 输入期望的错误码和错误信息
      • -
      -
      # create partition with collection is None
       
      +
      # 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,可以在 CheckTasks 中新建校验方法,在用例中调用使用
        • -
        • 输入期望的结果,供校验方法使用
        • - +
        • check_task=CheckTasks.check_partition_property,可以在 CheckTasks 中新建校验方法,在用例中调用使用
        • +
        • 输入期望的结果,供校验方法使用
      • -
      -
      # create partition
       
      +
      # 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})
       
      +
      3. 测试用例添加
      -
      -
    • 在 base 文件夹的 wrapper 文件底下找到封装好的同名被测接口,各接口返回2个值的list,第一个是 pymilvus-orm 的接口返回结果,第二个是接口返回结果正常/异常的判断,为True/False。该返回可用于在用例中做额外的结果检查。
    • -
    • 在 testcases 文件夹下找到被测接口相应的测试文件,进行用例添加。如下所示,全部测试用例可直接参考 testcases 目录下的所有 test 文件:
    • - +
        +
      • 在 base 文件夹的 wrapper 文件底下找到封装好的同名被测接口,各接口返回2个值的list,第一个是 pymilvus-orm 的接口返回结果,第二个是接口返回结果正常/异常的判断,为True/False。该返回可用于在用例中做额外的结果检查。
      • +
      • 在 testcases 文件夹下找到被测接口相应的测试文件,进行用例添加。如下所示,全部测试用例可直接参考 testcases 目录下的所有 test 文件:
      -
      
       
      -    @pytest.mark.tags(CaseLabel.L1)
      +
          @pytest.mark.tags(CaseLabel.L1)
           @pytest.mark.parametrize("partition_name", [cf.gen_unique_str(prefix)])
           def test_partition_dropped_collection(self, partition_name):
               """
      @@ -278,16 +257,15 @@ partition_w = self.init_partition_wrap(collection_w, partition_name, check_task=
               # 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"})
       
      +
      • Tips

        -
          -
        • 用例注释分为三个部分:目标,测试方法及期望结果,依此说明相应内容
        • -
        • 在 base/client_base.py 文件 Base 类的 setup 方法中对被测试的类进行了初始化,如下图所示:
        • - -
        +
          +
        • 用例注释分为三个部分:目标,测试方法及期望结果,依此说明相应内容
        • +
        • 在 base/client_base.py 文件 Base 类的 setup 方法中对被测试的类进行了初始化,如下图所示:
        • +
      • -
      self.connection_wrap = ApiConnectionsWrapper()
       self.utility_wrap = ApiUtilityWrapper()
       self.collection_wrap = ApiCollectionWrapper()
      @@ -296,24 +274,26 @@ self.index_wrap = ApiIndexWrapper()
       self.collection_schema_wrap = ApiCollectionSchemaWrapper()
       self.field_schema_wrap = ApiFieldSchemaWrapper()
       
      -
        -
      • 调用需要测试的接口,应按照相应封装好的方法传入参数。如下所示,除了 check_task,check_items 两个参数外,其余参数与 pymilvus-orm 的接口参数一致。
      • +
          +
        • 调用需要测试的接口,应按照相应封装好的方法传入参数。如下所示,除了 check_task,check_items 两个参数外,其余参数与 pymilvus-orm 的接口参数一致。
        def init_partition(self, collection, name, description="", check_task=None, check_items=None, **kwargs)
         
          -
        • check_task 用来选择 check/func_check.py 文件中 ResponseChecker 检查类中对应的接口检查方法,可选择的方法在 common/common_type.py 文件的 CheckTasks 类中。
        • -
        • check_items 传入检查方法所需的特定内容,具体内容由实现的检查方法所决定。
        • -
        • 默认不传这两个参数,则检查接口能正常返回请求结果。
        • - +
        • check_task 用来选择 check/func_check.py 文件中 ResponseChecker 检查类中对应的接口检查方法,可选择的方法在 common/common_type.py 文件的 CheckTasks 类中。
        • +
        • check_items 传入检查方法所需的特定内容,具体内容由实现的检查方法所决定。
        • +
        • 默认不传这两个参数,则检查接口能正常返回请求结果。
        • +
        +
      4. 框架功能添加
      -
      -
    • 在 utils 目录下添加需要的全局方法或者工具
    • -
    • 可将相应的配置内容加入 config 目录下
    • +
        +
      • 在 utils 目录下添加需要的全局方法或者工具
      • +
      • 可将相应的配置内容加入 config 目录下
      • +