Yat(Yat Another Test Framework)框架是基于python3的自动化测试框架,核心由Kotlin语言实现,通过python在外层进行封装和粘合对外提供命令行接口,总体框架如图一所示。Yat 框架在持续演进中,以探索更高效、更先进的自动化测试框架。


openGauss数据库规格看护使用的自动化测试框架就是Yat,openGauss 2.1.0除了将Yat开源,还一并贡献了3W+自动化用例,旨在增强openGauss社区的测试能力,丰富openGauss生态,吸引更多的开发者参与社区建设。


openGauss开源自动化测试框架Yat,增强社区测试能力_gitee

图1 Yat总体框架


产品优势


1. 对数据库测试友好,用户可以直接写SQL代码并组织成测试套进行测试,无需额外配置,用例通过JDBC接口执行,可以适配各种数据库。


2. 支持多语言并可扩展


当前支持Sql、Shell、Python(unittes)、Groovy(Junit/Spock)等语言,并且可以通过adapter灵活扩展增加新语言和框架支持。其中yat支持的sql,是标准SQL的超集,即在标准SQL的基础上进行了扩充,用户可以在SQL脚本中执行shell 命令、连接控制、循环、SQL绑定执行、多session控制、并发执行等,例如:


@conn user/passwd@127.0.0.1:9090;  -- 用新的用户重新链接数据库drop table if exists tbl_x;  -- 执行sql
create table tbl_x (id int, age int, xb int);
insert into tbl_x values(1, 2, 4);insert into tbl_x values(3, 4, 5);
-- 绑定执行insert into tbl_x values(?, ?, ?);@bind { int 3 int 5 int 7}-- 批量绑定执行insert into tbl_x values(?, ?, ?);@batch { int 3 int 4 int 0 int 3 int 4 int 9 int 3 int 4 int 8 int 3 int 4 int 7}-- 执行shell命令@sh zctl.py -t stop;@sh zctl.py -t start;
-- 定义多session@session(name: s1){ @set autocommit false; update table tbl_x set par1 = 2 par2 = 2; insert into tbl_x values(1, 3, 4); commit;}
@session(name: s2, user: abc, password: 'gauss@123'){ @set autocommit false; update table tbl_x set par1 = 2 par2 = 2; insert into tbl_x values(1, 3, 4); @step { select * from tbl_x for update; } commit;}-- 执行多session中的sql@steps s1.0 s2.0 s1.1 s1.2 s2.2 s2.1;-- 循环执行@for (count: 10){ insert into abc values(1,1,3,4);}-- 并发执行@parallel { @session { select * from abc for update; commit; }
@session { select * from abc for update; commit; }}


Python语言测试脚本必须是一个unittest测试脚本,yat额外提供了一套公共库用来方便在python unittest测试脚本中进行数据库和远程ssh操作,例如:


class TestPrimaryStandby(TestCase):    node = None    node_standby = None
test_table_drop = 'drop table if exists tbl_test'; test_table_create = '''create table tbl_test ( id int, name char(20), address varchar(1024) ) '''
@classmethod def setUpClass(cls): # 初始化连接对象 cls.node = Node(node='primary') cls.node_standby = Node(node='standby') cls.node.sql(cls.test_table_drop) cls.node.sql(cls.test_table_create)
@classmethod def tearDownClass(cls) -> None: cls.node.close() cls.node_standby.close() # 关闭连接对象
def test_abc_001(self): # 通过ssh执行shell,并判断结果 self.node.sh('echo "success"').expect('success')
# 执行sql并判断结果 self.node.sql('select * from tbl_test').expect( (1, 'xxx', 'xxxxxxxxxxxxxxxxxxx'), (2, 'xxx', 'xxxxxxxxxxxxxxxxxxx'))
def test_abc_003(self): # 执行shel命令,并通过正则匹配判断结果 self.node.sh('cm ctl query').regex(r'.*success.*')


Groovy脚本可以写Junit用例也可以写Spock用例,这方面不过多介绍,更多细节可以去官网和搜索网站进行学习


3. 定义了一套标准的测试用例书写规范、测试执行流程和测试报告呈现方式


首先通过命令(yat init)创建测试套模板,执行完yat init命令后,修改指定的测试套目录下的相关内容,之后,安装JDBC驱动,在测试套根目录添加lib目录,将驱动拷贝到此目录,最后通过命令yat suite run执行测试套,可添加不同的参数设置是否打印报告以及报告的格式。测试套目录结果如图二所示。执行测试套前配置以下目录:


  • conf目录,节点配置文件
  • except目录,测试用例的期待文件
  • schedule目录,调度文件
  • testcase目录,测试用例文件

openGauss开源自动化测试框架Yat,增强社区测试能力_gitee_02

图2 测试套目录结构


4. 多测试套调度(multi-suite schedule)


Yat Schedule是Yat提供的一种同时调度多个Yat测试套的调度器,用户通过制定调度文件来进行多个Yat测试套的并行或串行的调度。在有大量测试套情况下,用户需要决定测试套的组合和顺序问题,Yat提供了便捷的方法,如下用例,用户可以将多个测试套组织为一个大测试套:


# 文件名:all.ysserial { # 串行执行测试套或测试套的集合    suite '../suite1';    suite '../suite2';    ...    parallel { # 并行执行测试套或测试套的集合        suite 'parallel/suite1';        suite 'parallel/suite2';        ...        serial { ... }    }    suite 'suite3';    ...}


通过如下命令可以一键执行所有测试套


yat schedule -s all.ys


Yat代码仓gitee地址:https://gitee.com/opengauss/Yat

欢迎大家访问,交流。


欢迎访问openGauss官方网站


openGauss开源自动化测试框架Yat,增强社区测试能力_junit_03

openGauss开源社区官方网站:

https://opengauss.org

openGauss组织仓库:

https://gitee.com/opengauss

openGauss镜像仓库:

https://github.com/opengauss-mirror


openGauss开源自动化测试框架Yat,增强社区测试能力_python_04