✈️快速开始
创建项目
在命令行输入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
在这里需要配置好项目的环境信息,上述示例是最基础的配置,如果有其它配置,直接在对应环境下加键值对即可。
注:account
和host
是最基础的配置,请不要更改key
的名字。
配置登录
关于登录和请求头鉴权的处理,需要在项目根目录下的login.py
模块下配置处理,login.py
模块下预置了一个Login
的class和两个方法:login
和make_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
需要注意的是,上面是一个基础模板,login
和make_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:
arun
或aomaker 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
报告插件,可以自行使用。