鲲鹏社区首页
中文
注册
openGauss开源自动化测试框架Yat,增强社区测试能力

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

openGauss

发表于 2021/11/19

0

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

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

图1 Yat总体框架


产品优势:

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

(2)支持多语言并可扩展

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

1)用新的用户重新链接数据库

@conn user/passwd@127.0.0.1:9090; 

2)执行sql

drop table if exists tbl_x;

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);

3)绑定执行

insert into tbl_x values(?, ?, ?);
@bind {
int 3
int 5
int 7
}

4)批量绑定执行

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
}

5)执行shell命令

@sh zctl.py -t stop;
@sh zctl.py -t start;

6)定义多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;
}

7)执行多session中的sql

@steps s1.0 s2.0 s1.1 s1.2 s2.2 s2.1;

8)循环执行

@for (count: 10)
{
insert into abc values(1,1,3,4);
}

9)并发执行

@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执行测试套,可添加不同的参数设置是否打印报告以及报告的格式。测试套目录结果如图二所示。执行测试套前配置以下目录:

1)conf目录,节点配置文件

2)except目录,测试用例的期待文件

3)schedule目录,调度文件

4)testcase目录,测试用例文件

图2 测试套目录结构

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

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

# 文件名:all.ys
serial { # 串行执行测试套或测试套的集合
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开源社区官方网站:

https://opengauss.org/

openGauss组织仓库:

https://gitee.com/opengauss

openGauss镜像仓库:

https://github.com/opengauss-mirror