✈️快速开始

创建项目

在命令行输入aomaker create projectname即可。

项目结构

  • apis:接口层,存放接口文件
  • conf
    • config.yaml:配置文件,如环境、账户、数据库连接、全局变量等信息
    • utils.yaml:工具配置,如企业微信webhook配置
    • aomaker.yaml:多进程/线程worker分配策略配置
  • data
    • api _data:单接口用例测试数据
    • scenario_data:场景用例测试数据
  • database
    • aomaker.db: 全局变量和依赖变量存储库
  • logs:日志存放
  • reports:测试报告
  • testcases
    • test_api:单接口用例文件
    • test_scenario:场景用例文件
  • yamlcase:yaml自动转代码
  • conftest.py:pytest插件注册
  • login.py:登录配置
  • hooks.py:自定义全局cli参数和hook函数配置
  • pytest.ini:pytest配置文件
  • run.py:项目主启动文件

修改配置文件

conf/config.yaml

# 当前运行环境
env: test
# test环境配置
test:
  account:
    pwd: 123456
    user: aomaker002
  host: http://test.aomaker.com
# release环境配置
release:
  account:
    pwd: 123456
    user: aomaker001
  host: http://release.aomaker.com

在这里需要配置好项目的环境信息,上述示例是最基础的配置,如果有其它配置,直接在对应环境下加键值对即可。

注:accounthost 是最基础的配置,请不要更改key 的名字。

配置登录

关于登录和请求头鉴权的处理,需要在项目根目录下的login.py模块下配置处理,login.py模块下预置了一个Login的class和两个方法:loginmake_headers

login.py

from requests import request

from aomaker.fixture import BaseLogin


class Login(BaseLogin):

    def login(self):
        resp_login = {}
        return resp_login

    def make_headers(self, resp_login):
        headers = {
            'Cookie': f'csrftoken=aomakerniubility'}
        return headers

需要注意的是,上面是一个基础模板,loginmake_headers两个方法必须实现,且需要完成这两个方法内部逻辑,即login方法 需要构造登录,并return登录接口的响应;make_headers方法需要构造鉴权所需要的头部信息。

此外,BaseLogin中读取了config.yaml配置文件中的环境信息、账户信息以及host信息,所以在Login中可以直接引用。

login.py中配置好了登录,在启动测试任务前,会自动去登录和配置请求头,请求头的配置会被读取的BaseApi的实例属性中,所有的接口类是继承于BaseApi的,所以所有的接口都可以直接调用基类BaseApi中的所有实例属性,包括:

class BaseApi:

    def __init__(self):
        # cache表的连接对象
        self.cache = Cache()
        # config表的连接对象
        self.config = Config().get_all()
        # 配置文件中当前环境的host
        self._host = self.config.get('host')
        # login.py中配置的请求头
        self._headers = self.cache.get('headers')

编写ao

基于aomaker的核心编排思想:ao,api object,即所有接口都被封装成对象,同类型的接口为一个class,比如集群的增删改查接口,那么“集群”这个class下,对应着“增、删、改、查”四个method,也就是四个接口,每个method下,就是对这个接口的http协议进行填充,举个例子:

# 所有接口类都继承于BaseApi
from aomaker.base.base_api import BaseApi

# 作业类,作业相关的接口都封装在该类下
class Job(BaseApi):
    # 提交作业接口
    def submit_hpc_job(self):
        body = {
            "service": "hpc",
            "action": "job/submitJob",
        }
        # 构造http请求协议体
        # 需要注意的是:
        # 请求体中,不用指明host和headers,因为在baseapi中已经封装好了,
        # 当发送请求时,会自动加上host和headers
        http_data = {
            "method": "post",
            "api_path": "/portal_api",
            "params": {'action': 'job/submitJob'},
            "data": {
                'params': json.dumps(body)
            }
        }
        # 发送接口请求(Baseapi提供)
        # 返回json格式数据,如果响应数据不是json格式,会返回txt格式
        # 
        resp = self.send_http(http_data)
        return resp

编写case

case文件编写在工程根目录下的testcases下,该目录下分为单接口case:test_api目录和场景case:test_scenario目录,根据自己需要在对应目录下编写case,这里以单接口为例:

testcases/test_api/test_job.py

import pytest
import allure
# 导入BaseTestcase基类,该类提供内置断言方式
from aomaker.base.base_testcase import BaseTestcase
# 导入data_maker工具方法,帮助读取数据文件,进行数据驱动
from aomaker.aomaker import data_maker

from apis.job import job

# 测试类继承基类
class TestJob(BaseTestcase):
    @allure.title("提交hpc作业")
    @pytest.mark.hpc
    # 解析数据文件,获取数据驱动的参数列表,data_maker接收三个参数:
    # 1.数据文件的相对路径(相对工程根目录)
    # 2.数据文件中的类名key
    # 3.数据文件中的方法名key
    @pytest.mark.parametrize("test_data", data_maker("data/api_data/job.yaml", "job", "hpc_submit_job"))
    def test_hpc_submit_job(self, test_data):
        resp = job.submit_hpc_job(test_data)
        ret_code = resp.get("ret_code")
        # 基类提供的断言方法
        self.assert_eq(ret_code, 0)
        self.assert_schema(resp, 'submit_hpc_job')

运行用例

测试用例提供两种运行方式:

  • cli:arunaomaker run ,支持pytest的所有参数(推荐)
  • run.py:

run.py

from aomaker.runner import run

# 导入登录类
from login import Login

if __name__ == '__main__':
    # 第一个参数为列表,接收pytest支持的所有参数
    run(['-m ehpc'], login=Login())

查看用例结果

aomaker 默认安装了pytest-allure 插件,运行完成后会自动收集allure 报告。(请确保运行环境已安装allure

报告会收集在reports 目录下:

如果不想使用allure ,也支持其它所有pytest 报告插件,可以自行使用。

results matching ""

    No results matching ""