发布新日志

  • 数据库测试的分类和方法

    2009-06-03 10:57:42

    测试过程的角度来说我们也可以把数据库测试分为
    系统测试
    传统软件系统测试的测试重点是需求覆盖,而对于我们的数据库测试同样也需要
    对需求覆盖进行保证。那么数据库在初期设计中也需要对这个进行分析,测试.例
    如存储过程,视图,触发器,约束,规则等我们都需要进行需求的验证确保这些
    功能设计是符合需求的.另一方面我们需要确认数据库设计文档和最终的数据库相
    同,当设计文档变化时我们同样要验证改修改是否落实到数据库上。
    这个阶段我们的测试主要通过数据库设计评审来实现。
    集成测试
    集成测试是主要针对接口进行的测试工作,从数据库的角度来说和普通测试稍微
    有些区别对于数据库测试来说,需要考虑的是
    数据项的修改操作
    数据项的增加操作
    数据项的删除操作
    数据表增加满
    数据表删除空
    删除空表中的记录
    数据表的并发操作
    针对存储过程的接口测试
    结合业务逻辑做关联表的接口测试
    同样我们需要对这些接口考虑采用等价类、边界值、错误猜测等方法进行测试
    单元测试
    单元测试侧重于逻辑覆盖,相对对于复杂的代码来说,数据库开发的单元测试相
    对简单些,可以通过语句覆盖和走读的方式完成
    系统测试相对来说比较困难,这要求有很高的数据库设计能力和丰富的数据库测
    经验。而集成测试和单元测试就相对简单了。
    而我们也可以从测试关注点的角度对数据库进行分类
    功能测试
    对数据库功能的测试我们可以依赖与工具进行
    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的集成的产物,专门针对系统安全领域的
    另外一方面,数据库的健壮性,容错性和恢复能力也是我们测试的要点
    我们也可以发现功能测试,性能测试,安全测试,是一个由简到繁的过程,也是
    数据库测试人员需要逐步掌握的技能,这也是以后公司对数据库测试人员的要求
  • mysql 导入导出命令

    2008-09-02 17:37:58

    1.导出整个数据库

      mysqldump -u 用户名 -p 数据库名 > 导出的文件名

      mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql

      2.导出一个表

      mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名

      mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql

      3.导出一个数据库结构

      mysqldump -u wcnc -p -d --add-drop-table smgp_apps_wcnc >d:\wcnc_db.sql

      -d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table

      4.导入数据库

      常用source 命令

      进入mysql数据库控制台,

      如mysql -u root -p

      mysql>use 数据库

      然后使用source命令,后面参数为脚本文件(如这里用到的.sql)

      mysql>source d:\wcnc_db.sql


    补充:
    mysqldump支持下列选项:  

    --add-locks  
    在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(为了使得更快地插入到MySQL)。  
    --add-drop-table  
    在每个create语句之前增加一个drop table。  
    --allow-keywords  
    允许创建是关键词的列名字。这由在列名前面加表名的方法做到。  
    -c, --complete-insert  
    使用完整的insert语句(用列名字)。  
    -C, --compress  
    如果客户和服务器均支持压缩,压缩两者间所有的信息。  
    --delayed  
    用INSERT DELAYED命令插入行。  
    -e, --extended-insert  
    使用全新多行INSERT语法。(给出更紧缩并且更快的插入语句)  
    -#, --debug[=option_string]  
    跟踪程序的使用(为了调试)。  
    --help  
    显示一条帮助消息并且退出。  
    --fields-terminated-by=...  
    --fields-enclosed-by=...  
    --fields-optionally-enclosed-by=...  
    --fields-escaped-by=...  
    --fields-terminated-by=...  
    这些选择与-T选择一起使用,并且有相应的LOAD DATA INFILE子句相同的含义。  
    LOAD DATA INFILE语法。  
    -F, --flush-logs  
    在开始导出前,洗掉在MySQL服务器中的日志文件。  
    -f, --force,  
    即使我们在一个表导出期间得到一个SQL错误,继续。  
    -h, --host=..  
    从命名的主机上的MySQL服务器导出数据。缺省主机是localhost。  
    -l, --lock-tables.  
    为开始导出锁定所有表。  
    -t, --no-create-info  
    不写入表创建信息(CREATE TABLE语句)  
    -d, --no-data  
    不写入表的任何行信息。如果你只想得到一个表的结构的导出,这是很有用的!  
    --opt  
    同--quick --add-drop-table --add-locks --extended-insert --lock-tables。  
    应该给你为读入一个MySQL服务器的尽可能最快的导出。  
    -pyour_pass, --password[=your_pass]  
    与服务器连接时使用的口令。如果你不指定“=your_pass”部分,mysqldump需要来自终端的口令。  
    -P port_num, --port=port_num  
    与一台主机连接时使用的TCP/IP端口号。(这用于连接到localhost以外的主机,因为它使用 Unix套接字。)  
    -q, --quick  
    不缓冲查询,直接导出至stdout;使用mysql_use_result()做它。  
    -S /path/to/socket, --socket=/path/to/socket  
    与localhost连接时(它是缺省主机)使用的套接字文件。  
    -T, --tab=path-to-some-directory  
    对 于每个给定的表,创建一个table_name.sql文件,它包含SQL CREATE 命令,和一个table_name.txt文件,它包含数据。 注意:这只有在mysqldump运行在mysqld守护进程运行的同一台机器上的时候才工作。.txt文件的格式根据--fields-xxx和-- lines--xxx选项来定。  
    -u user_name, --user=user_name  
    与服务器连接时,MySQL使用的用户名。缺省值是你的Unix登录名。  
    -O var=option, --set-variable var=option
    设置一个变量的值。可能的变量被列在下面。  
    -v, --verbose  
    冗长模式。打印出程序所做的更多的信息。  
    -V, --version  
    打印版本信息并且退出。  
    -w, --where='where-condition'  
    只导出被选择了的记录;注意引号是强制的!  
    "--where=user='jimf'" "-wuserid>1" "-wuserid<1"  

    最常见的mysqldump使用可能制作整个数据库的一个备份:  

    mysqldump --opt database > backup-file.sql  

    但是它对用来自于一个数据库的信息充实另外一个MySQL数据库也是有用的:  

    mysqldump --opt database | mysql --host=remote-host -C database  

    由于mysqldump导出的是完整的SQL语句,所以用mysql客户程序很容易就能把数据导入了:  

    mysqladmin create target_db_name  
    mysql target_db_name < backup-file.sql
Open Toolbar