数据库测试

上一篇 / 下一篇  2009-02-04 11:50:31 / 个人分类:知识的积累

数据库测试


随着软件业的迅猛发展,我们的开发也从以前的单层结构进入了三层架构甚至现在多层架构的设计,而数据库从以前一个默默无闻的后台仓库,逐渐成为了数据库系统,而数据库开发设计人员成为了炙手可热的核心人员。以前我们往往把数据库操作写在应用层,从而提高各个模块的独立性和易用性,而现在越来越多的数据库操作被作为存储过程直接放在数据库上进行执行来提高执行效率和提高安全性。

数据库开发既然在软件开发的比重逐步提高,随之而来的问题也突出。我们以前往往重视对代码的测试工作,随着流程技术的日益完善,软件质量得到了大幅度的提高,但数据库方面的测试仍然处于空白。我们从来没有真正将数据库作为一个独立的系统进行测试,而是通过对代码的测试工作间接对数据库进行一定的测试。随着数据库开发的日益升温,数据库测试也需要独立出来进行符合自身特点的测试工作。数据库开发和应用开发并没有实质上的区别,所以软件测试的方法同样适用于数据库测试

 

从测试过程的角度来说我们也可以把数据库测试分为

系统测试

传统软件系统测试的测试重点是需求覆盖,而对于我们的数据库测试同样也需要对需求覆盖进行保证。那么数据库在初期设计中也需要对这个进行分析,测试.例如存储过程,视图,触发器,约束,规则等我们都需要进行需求的验证确保这些功能设计是符合需求的.另一方面我们需要确认数据库设计文档和最终的数据库相同,当设计文档变化时我们同样要验证改修改是否落实到数据库上。

这个阶段我们的测试主要通过数据库设计评审来实现。

 

集成测试

集成测试是主要针对接口进行的测试工作,从数据库的角度来说和普通测试稍微有些区别对于数据库测试来说,需要考虑的是

数据项的修改操作

数据项的增加操作

数据项的删除操作

数据表增加满

数据表删除空

删除空表中的记录

数据表的并发操作

针对存储过程的接口测试

结合业务逻辑做关联表的接口测试

同样我们需要对这些接口考虑采用等价类、边界值、错误猜测等方法进行测试

 

单元测试

单元测试侧重于逻辑覆盖,相对对于复杂的代码来说,数据库开发的单元测试相对简单些,可以通过语句覆盖和走读的方式完成

 

系统测试相对来说比较困难,这要求有很高的数据库设计能力和丰富的数据库测试经验。而集成测试和单元测试就相对简单了。

 

而我们也可以从测试关注点的角度对数据库进行分类

功能测试

对数据库功能的测试我们可以依赖与工具进行

DBunit

一款开源的数据库功能测试框架,可以使用类似与Junit的方式对数据库的基本操作进行白盒的单元测试,对输入输出进行校验

QTP

大名鼎鼎的自动测试工具,通过对对象的捕捉识别,我们可以通过QTP来模拟用户的操作流程,通过其中的校验方法或者结合数据库后台的监控对整个数据库中的数据进行测试。个人觉得比较偏向灰盒。

DataFactory

一款优秀的数据库数据自动生成工具,通过它你可以轻松的生成任意结构数据库,对数据库进行填充,帮助你生成所需要的大量数据从而验证我们数据库中的功能是否正确。这是属于黑盒测试

 

 

数据库性能

虽然我们的硬件最近几年进步很快,但是我们需要处理的数据以更快的速度在增加。几亿条记录的表格在现在是司空见惯的,如此庞大的数据量在大量并发连接操作时,我们不能像以前一样随意的使用查询,连接查询,嵌套查询,视图,这些操作如果不当会给系统带来非常巨大的压力,严重影响系统性能

性能优化分4部分

1物理存储方面

2逻辑设计方面

3数据库的参数调整

4SQL语句优化.

我们如何对性能方面进行测试呢,业界也提供了很多工具

 

通过数据库系统的SQL语句分析工具,我们可以分析得到数据库语句执行的瓶颈,从而优化SQL语句

Loadrunner

这个不用多说,我们可以通过对协议的编程来对数据库做压力测试

Swingbench(这是一个重量级别的feature,类似LR,而且非常强大,只不过专门针对oracle而已)

数据库厂商也意识到这点,例如

oracle11g已经提供了real application test,提供数据库性能测试,分析系统的应用瓶颈。

还有很多第三方公司开发了SQL语句优化工具来帮助你自动的进行语句优化工作从而提高执行效率。

 

安全测试

软件日益复杂,而数据又成为了系统中重中之重的核心,从以往对系统的破坏现在更倾向于对数据的获取和破坏。而数据库的安全被提到了最前端

自从SQL 注入攻击被发现,冒失万无一失的数据库一下从后台变为了前台,而一旦数据库被攻破,整个系统也会暴露在黑客的手下,通过数据库强大的存储过程,黑客可以轻松的获得整个系统的权限。而SQL的注入看似简单缺很难防范,对于安全测试来说,如何防范系统被注入是测试的难点。

业界也有相关的数据库注入检测工具,来帮助用户对自身系统进行安全检测。

 

对于这点来说业界也有标准,例如ISO IEC 21827,也叫做SSE CMM 3.0,是CMM和ISO的集成的产物,专门针对系统安全领域的

 

另外一方面,数据库的健壮性,容错性和恢复能力也是我们测试的要点

 

我们也可以发现功能测试,性能测试,安全测试,是一个由简到繁的过程,也是数据库测试人员需要逐步掌握的技能,这也是以后公司对数据库测试人员的要求。

 

 

 

     很幸运能上这节'云'老师的课,一是在数据库测试、测试这方面听到了很多思路,一天的课一定不会涉及到很多具体的内容,思路就在足够了;另外更了解了自己一个很严重的缺陷,就是不擅长把简单的问题考虑周全,做深做好,学习也一样,不善于把东西学得更深入一些,不好的本性,得改;还有就是上课本身也很愉快~

        数据库测试

        范式
        范式:范式是关系数据库在设计的时候要遵守的一些规则,最常用的有1NF,2NF,3NF,还有BCNF
        1NF:数据库的每个字段都是单一属性,不可再分。(很好理解)
        2NF:数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖,也就是任何的非关键字段都依赖于任何一组关键字段。(也就是当骷辛礁鲆陨献侄问保渲幸桓霾荒艿ザ谰龆ㄎㄒ环侵骷侄危?BR>3NF:在2NF的基础上,不存在任意非关键字段对其他非关键字段的函数依赖(所有非关键字段都必须是由主键来决定的,而不能一部分非关键字段有某个非关键字段决定)

        数据库建模
        待学习…………
        想要发现数据库设计的问题,必须要很好的了解数据库设计,这是必然。

        数据库系统测试的对象
        数据库设计是否与实现相同。这是最容易做到的一点。如果没有数据库设计文档怎么办?逆向工程,可以用工具将数据库sql导出,再转换成关系图
        数据库设计是否符合范式
        数据库设计是否合理 经验
        数据库安装、配置测试

        数据库集成测试对象
        数据库的增删改操作
        数据表加满(这里的加满是指加满数据文件所在磁盘空间,可以为其分配一个小的磁盘空间,逆向思维)
        数据表空
        删除空表记录
        数据表的并发操作(即使数据库做了主键约束,在并发很多的时候也会导致插入重复主键的数据,就会导致数据库的死锁,down掉)
        针对存储过程的接口测试:也可以编写驱动和桩
        结合业务逻辑做关联表的接口测试

        数据库单元测试的重点
        语句覆盖
        走读
        eg:已知yx表,包括id,salary字段,中间2~10省略,另有yg表中的salary字段与yx.id有外键约束,要更新yg中的salary,为每个人加1级,如何写sql语句
        update yg set salary = salary + 1 对吗?


         id
          salary
         0  面议
         1  1500以下
        …   …
         11  20000以上

 

        1)11不能再加
        2)0不能加  update yg set salary = salary + 1 where salary > 0 and salary < 11;
        3)如果有4.5这样的数据怎么办?
        update yg set salary = salary + 1 where salary in (1,2,3,4,5,6,7,8,9,10);
        4)如果更新错了怎么办?写成一个事务,可以commit,rollback
        5)假设yx表中的数据发生变化了怎么办?还需要修改sql语句

        (讨厌,死机了)
        最后俺写的是
        select * from yg;
        update yg set salary = salary + 1
        where salary in ( select id from yx)
        and salary > ( select min(id) from yx)
        and salary < ( select max(id) from yx);
        关于第4)数据库事务,sqlserver有三种事务类型,隐式,显示,自动提交,默认为自动提交,可以设置
        set implicit_transactions on设置为隐式事务,就是需要另外输入commit 或rollback 来结束事务
        http://kyle.itpub.net/post/1626/10699

        数据库功能测试
        DataFactory 自动数据库数据生成器

        数据库性能测试
        Loadrunner
        Swingbench 专门针对Oracle

        性能优化考虑的顺序
        磁盘存储
        数据库设置
        数据库设计
        sql语句

        数据库安全测试
        sql注入
        数据库的健壮性  严格的检查约束,主外键约束等
        数据库的容错性
        数据库自身的恢复能力


TAG:

 

评分:0

我来说两句

Open Toolbar