Abstract
目的: 使用Alloy tool set对DBMS做黑盒测试
步骤:
- 输入: a database schema & an SQL query
- formulate Alloy models for both inputs
- Q: 这里的both是什么意思?难道不是只有一个input query??
- Answer: 最后发现是这个工具是用户需要提供数据库Schema(有几张表,主键外键),然后给定查询query(支持SELECT, from, and, or, not, join),工具会尽量随机给出一个较小的数据库,并且给出查询query的结果,为了提升覆盖率,工具会尽量覆盖数据的等价类,比如select x where x > 3;工具就会生成x > 3和x<=3的,把这两个等价类都照顾到。
- 使用Alloy来生成一个完全的包含了input和oracle的测试套件。use the Alloy Analyzer to generate:
- input data
- the expected result
生成工具: ADUSA
实验: 显示能够找到bugs
Intro
目前的自动DB testing一般需要
- SQL queries
- test databases
- Oracles
已有进展 - RAGS和QGEN能随机将SQL语句结合在一起来生成valid queries
- 有研究针对又cardinality constraints的queries
- 一些研究能生成满足指定schema的constraints的数据库,但是这些数据库是query unaware的(不需要提供query信息)
本文提供了基于黑盒测试的model-based testing方法
主要方式: - 使用Alloy(一种可分析的关系型语言)将输入的db schema和input SQL query转化为对应的Alloy specification(use Alloy to model the inputs),
- 使用Alloy Analyzer(本文写的)来生成bounded non-isomorphic databases和预期inputs
本文实现工具:ADUSA
实验:
测试对象:HSQLDB,MySQL,Oracle11g
应用前景:ADUSA+ SQL query generator就能测数据库
Overview
Alloy是一种strongly typed specification langs,有多个paragraphs,用来定义型类型,引入类型间关系或者为类型or关系添加constraints
Alloy示例
对于这样一张表:
CREATE TABLE student ( id int, name varchar(50), PRIMARY KEY (id) );
对应Alloy标准
//定义varchar这个类型,Alloy只支持整数默认类型
sig varchar{}
one sig student {
rows: Int -> varchar
}{
//PRIMARY KEY
all x: rows.varchar | one x.rows
}
对于这样一个查询
SELECT DISTINCT id FROM student WHERE (id=1 OR (id>=3 AND id<=5));
对应Alloy
fun query () : Int { {select[where[from[student.rows]]]} }
fun select (rows: Int -> varchar) : Int { {rows.varchar} }
fun where(rows: Int -> varchar) : Int -> varchar { {x1: rows.varchar, x2: x1.rows | condition[x1]} }
pred condition(x1: Int) { {eq[x1, 1] or (gte[x1, 3] and lte[x1, 5] )} }
fun from(rows: Int -> varchar) : Int -> varchar { {rows} }
然而可惜的是我没看到DISTINCT的建模或者是DISTINCT能被支持这一点。虽然id当然是distinct的。
Alloy Analyzer则会试图枚举每个等价类,找到全部instances。不过每种类型的data elements个数是有限制的。可以指定,例如 run query for exactly 2 varchar
生成query
用了off-the-shelf SAT来举出instances
生成Test oracle
Alloy
ADUSA framework
在创建时支持create table语句,primary key以及foreign key两种关系
在查询时支持select语句,支持from,join(cross join, natural join)
对于变量是先建模对应的数据类型为一个空的数据类型,然后再让该变量成为一个单例类
Case Studies
Oracle 11g
- 为何选这个数据库
- 实验:
- 使用的schema和query
- ADUSA会结束,结束的条件
- 意义:
- Fig8成功找到了不连续性
- 生成速度比较快
- 用Fig8说明计算的结果是正确的
MySQL
指出了bug编号
HSQLDB
用了注入bug的方法,成功检查到了对应bug
注入的是什么bug,方式(跑一遍原先的,再跑一遍注入了bug的,进行对比)
Discussion
还做不到每种数据生成太多元素,以及还做不到正则表达式等复杂类型