☄️变量管理
为了对多任务运行测试用例有更好的支持,aomaker
采用了本地数据库sqlite
的方案来存储管理整个测试生命周期的变量(包括全局配置变量、接口上下游之间的依赖变量、缓存变量等等),sqlite
是一个非常轻量的本地文件数据库,可以直接访问存储文件,而且不需要任何安装配置~
SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。 就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。
当使用aomaker创建完脚手架后,会在database
目录下创建aomaker.db
数据库文件,并且aomaker内置了三张数据表,来分别管理全局变量、接口依赖参数、jsonschema,这三张表分别是:
- config:存储配置文件中的全局变量,如账户信息,环境host等配置信息,当启动测试任务后,会根据当前选择的测试环境,自动读取
config.yaml
中的配置存到config
表中,该配置会固化不清理,除非更改了测试环境。 - cache:存储测试过程中上下游接口之间的依赖接口的响应,会搭配后文将要讲到的
dependece
装饰器使用 。当一个依赖接口被调用后,会存储它完整的response·,如果后续有其它接口也依赖这个接口,那么该接口将不会再被调用,而是直接从该接口存储的response中去读取需要的依赖参数。整个测试任务结束后,会自动清理cache
表。 - schema:存储接口的
jsonschema
信息,当一个接口第一次被调用后,会自动从它的response
中解析出response.json()
的jsonschema
,在用例层进行断言时,可以对此次接口响应的结构体与schema
表中存储的结构体进行比较,检测是否有参数变动。(后文细讲)
三张表的结构其实都非常简单,就是键值对:
在aomaker
的baseapi
中,初始化了cache
和config
两张表的连接对象,因为所有接口都是继承于baseapi
的,所以所有接口都可以通过self.config
和self.cache
来拿到连接对象,当有了连接对象就可以通过封装好的set()
和get()
方法来存取变量了。
另外,三张表的数据读写,都是做了线程安全的,在多线程模式下也能保证数据安全。
1.config
在整个测试生命周期里,可以在任何地方通过config
对象来存取配置变量。
假设全局配置如下:
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
当aomaker
开始运行后,会自动把conf\config.yaml
中的所有配置全部存到config
表中:
当在BaseApi
的子类中想获取env
信息,可以直接self.config.get("env")
即可获取到;
当在其它地方想获取env
信息,比如用例层,可以:
from aomaker.cache import config
def test_demo():
env = config.get("env")
asssert env == "test"
特别地,整个config
表内存储的配置信息是固化的,不会随着测试结束而清理,当配置发生变更后,如环境切换了,config
表会自动更新,不需要人为操作。
2.cache
同样的cache这张表,也是在全生命周期内都可以任意调用,不同的是cache
是用来存放本次测试过程中的一些临时变量,如headers
、接口上下游之间的依赖变量等,在测试结束后,会全部清空。
调用方式同config
,
当在BaseApi
的子类中想获取headers
,可以直接self.cache.get("headers")
即可获取到;
当在其它地方想存放某个变量,比如用例层,可以:
from aomaker.cache import cache
def test_demo():
name = "aomaker"
cache.set("name",name)
def test_demo2():
name = cache.get("name")
assert name == "aomaker"
需要注意的是,cache
表的var_name
是唯一键,如果cache.set
一个已存在的var_name
会自动忽略,如果想要修改已存在的var_name
的值,可以调用cache.update
方法进行修改。
3.schema
后文断言扩展中详细介绍。