☄️变量管理

为了对多任务运行测试用例有更好的支持,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表中存储的结构体进行比较,检测是否有参数变动。(后文细讲)

三张表的结构其实都非常简单,就是键值对:

aomakerbaseapi中,初始化了cacheconfig两张表的连接对象,因为所有接口都是继承于baseapi的,所以所有接口都可以通过self.configself.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

后文断言扩展中详细介绍。

results matching ""

    No results matching ""