平台化支持

为了更好的支持测试用例平台化,Seldom 提供了API用于获取用例列表,以及根据传入的用例信息运行测试用例。

seldom-platform: https://github.com/SeldomQA/seldom-platform

目录结构如下:

mypro/
├── test_dir/
│   ├── module_api/
│   │   ├── test_http_demo.py
│   ├── module_web/
│   │   ├── test_first_demo.py
│   │   ├── test_ddt_demo.py
└── run.py

获取用例信息

# run.py
from seldom import SeldomTestLoader
from seldom import TestMainExtend

if __name__ == '__main__':
    SeldomTestLoader.collectCaseInfo = True
    main_extend = TestMainExtend(path="./test_dir/")
    case_info = main_extend.collect_cases(json=True)
    print(case_info)

说明

返回的用例信息列表:

  • collectCaseInfocollectCaseInfo设置为True 说明需要收集用例信息。
  • TestMainExtend(path="./test_dir/")TestMainExtend类是TestMain类的扩展,path设置收集用例的目录,不能为空。
  • collect_cases(json=False, level="data", warning=False):返回收集的用例信息。
    • json=False:默认为list格式;设置为True返回json格式。
    • level="data" :默认为data,数据驱动的每条数据被解析为一条用例。如果设置为 method 数据驱动的方法被解析为一条用例。
    • warning=False: 默认为False, 在收集用例的过程中,因为缺少依赖库,或导包错误会导致部分用例收集报错,是否要将这些错误保存下来。开启(True)后,默认保存在reports/collect_warning.log 文件中。
[
  {
    "file": "module_api.test_http_demo",
    "class": {
      "name": "TestRequest",
      "doc": "\n    http api test demo\n    doc: https://requests.readthedocs.io/en/master/\n    "
    },
    "method": {
      "name": "test_get_method",
      "doc": "\n        test get request\n        ",
      "label": null
    }
  },
  {
    "file": "module_api.test_http_demo",
    "class": {
      "name": "TestRequest",
      "doc": "\n    http api test demo\n    doc: https://requests.readthedocs.io/en/master/\n    "
    },
    "method": {
      "name": "test_post_method",
      "doc": "\n        test post request\n        ",
      "label": null
    }
  },
  {
    "file": "module_web.test_ddt_demo",
    "class": {
      "name": "BaiduTest",
      "doc": "Baidu search test case"
    },
    "method": {
      "name": "test_baidu_0",
      "doc": "used parameterized test [with name=1, search_key='seldom']\n        :param name: case name\n        :param search_key: search keyword\n        ",
      "label": null
    }
  },
  {
    "file": "module_web.test_ddt_demo",
    "class": {
      "name": "BaiduTest",
      "doc": "Baidu search test case"
    },
    "method": {
      "name": "test_baidu_1",
      "doc": "used parameterized test [with name=2, search_key='selenium']\n        :param name: case name\n        :param search_key: search keyword\n        ",
      "label": null
    }
  },
  {
    "file": "module_web.test_ddt_demo",
    "class": {
      "name": "BaiduTest",
      "doc": "Baidu search test case"
    },
    "method": {
      "name": "test_baidu_2",
      "doc": "used parameterized test [with name=3, search_key='unittest']\n        :param name: case name\n        :param search_key: search keyword\n        ",
      "label": null
    }
  },
  {
    "file": "module_web.test_first_demo",
    "class": {
      "name": "BaiduTest",
      "doc": "Baidu search test case"
    },
    "method": {
      "name": "test_case",
      "doc": "a simple test case ",
      "label": null
    }
  }
]

数据结构说明:

  • file: 获取类的文件名,包含目录名。
  • class: 测试类的名字name 和 描述doc
  • method: 测试方法的名字name 和 描述doc, label

注明:seldom==3.11.0 版本测试方法增加label字段。

执行用例信息

当获取用例信息之后,可以进行自定义,例如 挑选出需要执行的用例,重新传给Seldom 执行。

# run.py
from seldom import TestMainExtend

if __name__ == '__main__':
    # 自定义要执行的用例
    cases = [
        {
            "file": "module_web.test_first_demo",
            "class": {
                "name": "BaiduTest",
                "doc": "Baidu search test case"
            },
            "method": {
                "name": "test_case",
                "doc": "a simple test case ",
                "label": ""
            }
        }
    ]
    main_extend = TestMainExtend(path="./test_dir")
    main_extend.run_cases(cases)

说明:

  • cases 定义要执行的用例信息, doc 非必填字段。
  • TestMainExtend(path="./test_dir") : 其中path指定从哪个目录查找用例集合。
  • run_cases(cases): 运行用例。

接入平台必读

如果你只是使用seldom框架编写用例,那么代码只要框架能运行即可,如果要接入seldom-platform平台,那么需要注意一下几点。

🚧 测试每个子目录必须包含__init__.py文件。

  • 目录结构
├───reports
├───test_data
├───test_dir
│   ├───api_case
│   │   └───__init__.py
│   ├───app_case
│   │   └───__init__.py
│   ├───web_case
│   │   └───__init__.py
│   └───__init__.py
└───run.py

如果子目录不添加 init.py 文件会导致目录下面的用例无法解析。

🚧 用例的前置动作

在用 seldom框架写用例的时候需要执行一些前置/后置动作。

import seldom
from seldom.utils import cache

if __name__ == '__main__':
    # 前置动作
    cache.set({"token": "token123"})
    # 执行用例
    seldom.main("./test_dir")
    # 后置动作
    cache.clear("token")

但是,平台执行的时候,不会执行 前置/后置动作。 那么,为了使平台可以执行前置动作,需要使用confrun.py文件进行配置。

  • 目录结构
├───reports
├───test_data
├───test_dir
│   ├───...
├───confrun.py
└───run.py
  • confrun.py配置
"""
seldom confrun.py  hooks function
"""
from seldom.utils import cache


def start_run():
    """前置动作"""
    cache.set({"token": "token123"})


def end_run():
    """后置动作"""
    cache.clear("token")
  • run.py文件
import seldom

if __name__ == '__main__':
    # 执行用例
    seldom.main("./test_dir")

通过上面的配置,前置、后置动作就可以在平台上运行,当然,这样设置本地也可正常运行。