数据库测试开发文档.docx

上传人:牧羊曲112 文档编号:5306330 上传时间:2023-06-24 格式:DOCX 页数:17 大小:106.85KB
返回 下载 相关 举报
数据库测试开发文档.docx_第1页
第1页 / 共17页
数据库测试开发文档.docx_第2页
第2页 / 共17页
数据库测试开发文档.docx_第3页
第3页 / 共17页
数据库测试开发文档.docx_第4页
第4页 / 共17页
数据库测试开发文档.docx_第5页
第5页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《数据库测试开发文档.docx》由会员分享,可在线阅读,更多相关《数据库测试开发文档.docx(17页珍藏版)》请在三一办公上搜索。

1、1数据库测试用例分析1.1用例和和测试用数据库配置情况介绍【用例1】模拟遥控和遥测数据同时存入数据库,遥测数据速率0.5KB/40ms、遥测数据速率120KB/40ms.【用例2】大数据插入、选择测试,模拟图片存入数据库的情形,单张图片最大达150M,事件性, 无周期性.【用例3】多客户端并发访问测试,模拟最多10个客户端并发访问测试.【测试用数据库配置情况】10.0.0.15avic6151scottAa111111111.2用例工程分析1.2.1用例工程介绍数据库用例采用asdp开发,基于SOA架构,工程目录结构如下图所示,工程database】、 database2、database3分

2、别实现上文提到的三个用例。工程database?对应为用例1的实现,相关代码在工程目录database?下可以找到,数 据库操作部分采用平台接口实现。设计时将遥控数据和遥测数据表简化为测试数据库中的表 tb4和tb5,表创建脚本如下。-遥控数据表tb4create table tb4(id Integer not null, value varchar(4000), primary key(id);-遥测数据表tb5create table tb5(id Integer not null, value varchar(4000), primary key(id);类的静态关系图如图1所示,Ac

3、tivator类是由SOA框架提供的接口类,WorkThread类 设计为实际完成数据库操作的工作类,dbXmlParse类是为了测试软件在多个数据库环境下测 试提供的配置文件db.xml文件的解析类。SOA框架通过调用Activator类的start函数启动我 们的测试用例app,在Activator类的start函数中通过调用dbXmlParse类的构造函数获得一 个局部实例dbXml,调用dbXml.Parse解析获得数据库配置信息,成功获取数据库配置信息 后,在堆上创建WorkThread类的实例t0和t1,在t0内部的定时器回调函数中向遥控数据 表tb4中插入模拟遥控数据,在t1内部

4、的定时器回调函数中向遥测数据表tb5中插入模拟 遥测数据,SOA框架通过调用Activator类的stop函数停止测试用例app。dbXmlParse+username : QString+password : QString+hostName : QString+dbName : QString+Parse() : boolWorkThread+username : QString +password : QString +hostName : QString +dbName : QString +tablename : QString +begin()t0 : WorkThreaduser

5、name : QString = scottpassword : QString = Aa11111111hostName : QString = 10.0.0.15dbName : QString = avic6151tablename : QString = tb4t1 : WorkThreadusername : QString = scottpassword : QString = Aa11111111hostName : QString = 10.0.0.15dbName : QString = avic6151tablename : QString = tb5图1database2

6、类静态关系图WorkThread类的状态图如图3所示,在Activator类的start类中创建实例instance之后, 设置完需要的属性,调用实例的instance.begin函数,实例开始进入正常的工作状态。每个 WorkThread类的实例内部拥有一个40ms的Q.T定时器,定时器事件触发调用instance.timeout 函数,在instance函数内执行数据插入操作。图2WorkThread类状态图.2.2.1 WorkThread:timeoutvoid WorkThread:timeout()QMutexLocker locker(&m_mutex);safe_flag =

7、false;QString value(per_size,A);for(int i=0;itablename+ values( + QString:number(index) + ,+ value+);if(!conn-Exec(sql)QString error = error: +sql;Log(error);elseQString ok=ok: +QString:number(index);recordCounts+;Log(ok);index+;QString speed=40 ms insert Bytes: +QString:number(per_size*repeat_time+

8、4);Log(speed);conn-Exec(commit);safe_flag =true;工程databasel对应为用例2的实现,相关代码在工程目录databasel下可以找到,数 据库部分采用QT原生接口实现。大数据插入、选择测试数据表tbbig,脚本如下。create table tbbig (id Integer not null, picture_size Integer not null, picture blob, primary key(id) );类的静态关系图如图3所示,BigDataDialog设计与操作人员交互的界面类, BigDataDialog类包含了一个Db

9、Process类实例db,实例db负责操纵数据库表单tbbig. BigDataDialog类对应的交互界面如图4所示。连接数据库操作:鼠标点击connet按钮, 函数调用关系,BigDataDialog:: connet()-db.conncet();向数据库中插入一条记录:设定 插入记录的大小(M),点击trigger insert按钮,函数调用关系,BigDataDialog:: insert()-db.insert_process();从数据库选择一条记录:设定要选择记录的id,点击select 按钮,记录存放在目录SELECT_*.dat(*从1开始增加),函数调用关系,BigDat

10、aDialog:: select()-db.select_process();dbXmlParse+username : QString +password : QString +hostName : QString +dbName : QString 十Parse()BigDataDialog+hostName : QString+dbName : QString+userName : QString+password : QStringDbProcess+connect()+insert_process()+select_process()+picture_size_changed()11

11、+insert()+select()+sizeChanged(in size : int)+IdChanged(in id : QString)+connect()图3 database1类静态关系图图4BigDataDialog对话框和信号槽关系图1.2.3.1 DbProcess:connectbool DbProcess:connect(QString userName,QString passWord,QString hostName,QString dataBaseName,QString type) (QSqlDatabase db = QSqlDatabase:addDataba

12、se(type,connect_name);db.setHostName(hostName);db. setDatabaseName(dataBaseName);db.setUserName(userName);db.setPassword(passWord);if(!db.open()(QMessageBox:critical(0,QObject:tKDatabase Error),db.lastError().text();return false;QSqlQuery query(db);if(!query.exec(delete from tbbig)QString str = quer

13、y. lastError().text().toLocal8Bit().data();qDebug()str;LogNormal()str;elseLogNormal() delete from tbbig success;query.exec(commit);return true;1.2.3.2 DbProcess:insert_processvoid DbProcess:insert_process()(qDebug()insert.n;LogNormal() INSERT EVENT.;QString str;str=INSERT INTO TBBIG VALUES(id,pictur

14、e_size,picture) + id = +QString: number(index+1)+ - picture_size = +QString:number(picture_size)+ - value = 0xaa;LogNormal()str;QSqlDatabase db = QSqlDatabase:database(connect_name);QSqlQuery query(db);query.prepare(insert into tbbig values(?,?,?);query.addBindValue(+index);QByteArray value(picture_

15、size,0xaa);query.addBindValue(value. size();QVariant tmp(value);query.addBindValue(tmp);if(!query.exec() (QString str = query. lastError (). text(). toLocal8Bit(). data();qDebug()str;LogNormal()str;LogNormal() INSERT EVENT FAIL;else (qDebug()Insert success;LogNormal() INSERT EVENT SUCCESS.;query.exe

16、c(commit);1.2.3.2 DbProcess:select_processvoid DbProcess:select_process()(qDebug()select.n;LogNormal() SELECT EVENT.;QString str=SELECT * FROM TBBIG WHERE ID =+QString:number(select_index)+”;LogNormal()str;QSqlDatabase db = QSqlDatabase:database(connect_name);QSqlQuery query(db);QString sql=SELECT *

17、 FROM tbbig where id = +QString:number(select_index);if(!query.exec(sql)(QString str = query. lastError (). text(). toLocal8Bit(). data();qDebug()str;LogNormal()str;LogNormal() SELECT EVENT FAIL;else(while(query.next()(if (query.isNull(0) = false)(qDebug()id:query.value(0).toInt()n;LogNormal()id = q

18、uery.value(0).toInt()size =query.value(1).toInt();qDebug() size:query.value(1).toInt()n;QString data_path=SELECT_+QString:number(path_index+)+.dat;LogNormal()save data path - +data_path+;QByteArray data =query.value(2).toByteArray();save(query. value(2). toByteArray (),data_path);LogNormal()pushButt

19、on_d-setEnabled(true);WorkThread *work = new WorkThread(hostName,dbName,userName,passWord);thread_queue .enqueue(work);thread_count+;ui-label-setText(Thread: +QString:number(thread_count);work-start();1.2.4.2QThreadDialog:deleteClientvoid QThreadDialog:deleteClient ()(if(thread_count0)(WorkThread *w

20、ork = (WorkThread *)thread_queue.dequeue();work-stop();delete work;work=NULL;thread_count-;ui-label-setText(Thread: +QString:number(thread_count);if(thread_count = 0)(ui-pushButton_d-setEnabled(false);else(return;1.2.4.3WorkThread:connectbool WorkThread:connect()(QSqlDatabase db = QSqlDatabase:addDa

21、tabase(QOCI,connectName);db. setHostName(hostName);db.setDatabaseName(dbName);db.setUserName(userName);db.setPassword(passWord);if(!db.open()(/std:coutdb.lastError().text().toStdString()tb_name+ values( + QString:number(index+) + ,+ QString:number(rand() + );QSqlDatabase db = QSqlDatabase:database(c

22、onnectName);QSqlQuery query(db);if(!query.exec(sql)(QString error = error: +sql;Log(error);QString str =query. lastError (). text(). toLocal8Bit().data();Log(str);return;else(QString ok=ok: +sql;recordCounts+;Log(ok);1.2.4.5WorkThread:runvoid WorkThread:run()while(1)(if(!connect_flag)( connect();els

23、e(/qDebug()work Thread.;if(inde =0)delete_table();insert_select();if(end_flag)QSqlDatabase:removeDatabase(connectName); end_flag = false;break;sleep(2); /2s2 oracle数据库程序开发流程总结2.1开发环境准备以海地的开发平台为例,首先得编译QT的oracle数据库驱动QOCI,需要一台装有oracle 数据库和QT的redhat电脑,编译过程可以从网上找到,编译生成libqsqloci.so (平台已经 为我们编译好了),将 libqs

24、qloci.so 放入/opt/Qt5.5.0/5.5/gcc_64/plugins/sqldrivers 目录下,QT 的oracle数据库驱动QOCI就配置好了。在没有安装oracle数据库或者oracle数据库客服端 的电脑上做开发还需要安装oci库,oracle公司为我们提供了一个叫做oracle installclient的 简化安装包,包里面包含了 oci驱动相关的库文件,在linux下只需要安装对应数据库版本 的oracle installclient,再设置好$LD_LIBRARY_PATH变量的值,oci驱动也就算安装完成了。完成了上面这两步,在QT下开发oracle数据库的

25、环境就配置完成了。2.2使用QT原生接口使用QT原生接口编写数据程序,主要流程可以简单的归纳为下面三个步骤:连接数据 库一 在连接上操纵数据库一 关闭连接.2.2.1连接数据库示例代码:QSqlDatabase db = QSqlDatabase:addDatabase(QOCI,connectName);db. setHostName(hostName);db.setDatabaseName(dbName);db.setUserName(userName);db.setPassword(passWord);if(!db.open()(std:coutdb.lastError().text()

26、.toStdString()std:endl;return false;Std:cout”connet ok.”std:endl;QSqlDatabase:addDatabase是QSqlDatabase类的一个静态函数,功能是用来向应用程序 数据库连接list中加入一个数据库连接,并将这个连接返回给应用程序使用,第一个参数是 要连接的数据库的类型驱动名称,第二个参数是连接的名称,QT通过connectName区分不 同的数据库连接,如果connectName和已有的连接重名了,已有的连接将被移除。而且连 接名connectName可以不指定,如果不指定,那么返回的连接将作为应用程序的默认数据

27、 库连接使用。获取到驱动返回的连接对象db之后,只需要设置登录数据库的远程ip: hostName、数 据库名:dbName、登录用户名:userName、登录用户密码:passWord,如果设置正确,并 且数据库可访问,调用db.open即可成功打开数据库连接,之后则可以通过connetName获 取到这个连接,在连接上进行数据库操作。如果有错误可以调用db.lastError获取驱动返回 的错误信息。2.2.2在连接上操纵数据库这里给出几种频率较高的数据库操作示例代码:DELETE 操作:QString sql = delete from tbbig;QSqlDatabase db = Q

28、SqlDatabase:database(connectName);QSqlQuery query(db);if (!query.exec(sql) (QString str = query. lastError (). text(). toLocal8Bit(). data(); coutlastError ();coutstr;INSERT 操作:QString sql = insert into tb4 values(1,1001);QSqlDatabase db = QSqlDatabase:database(connectName);QSqlQuery query(db);if(!q

29、uery.exec(sql)(QString str =query. lastError (). text(). toLocal8Bit ().data();coutlastError ();coutstr;QSqlDatabase db = QSqlDatabase:database(connect_name);QSqlQuery query(db);query.prepare(insert into tbbig values(?,?,?);query.addBindValue(+index);QByteArray value(picture_size ,0xaa);query.addBin

30、dValue(value.size();QVariant tmp(value);query.addBindValue(tmp);if(!query.exec() (QString str = query. lastError (). text(). toLocal8Bit(). data();coutstr;query.exec(commit);QSqlDatabase db = QSqlDatabase:database(connect_name);QSqlQuery query(db);QString sql=SELECT * FROM tbbig where id = +QString:

31、number(select_index); if(!query.exec(sql)(QString str = query. lastError (). text(). toLocal8Bit(). data();coutstr;else(while(query.next()(if (query.isNull(0) = false)(qDebug()id:query.value(0).toInt()n;qDebug() size: query.value(1).toInt()GetConnectionPoolId(username,passwd,host,db,”QOCI”);DbConnec

32、tion *conn = dbutils-GetConnection(poolid);if(conn = NULL)(Log(GetConnection error.);DbUtils是一个单实例对象,应用程序要操作数据库必须通过DbUtils:getInstance获得 DbUtils实例指针,通过调用DbUtils类的成员函数GetConnectionPoolId将数据库的远程ip: host、数据库名:db、登录用户名:username、登录用户密码:passwd、数据库类型:“QOCI” DbUtils实例,实例返回一个连接池id: poolid,应用程序根据poolid则可从连接池中

33、获取一 个可用的DbConnection对象指针,如果连接池资源耗尽则会返回一个NULL,接下来应用程 序则可以通过这个DbConnection对象操纵数据库。2.3.2在连接对象操作数据库通过DbConnection对象操纵数据库与2.2.2节操纵数据库的步骤基本类似,可以简要划 分为下面几个步骤:1、准备sql语句;2、调用DbConnection的成员函数Exec执行sql语句;3、通过Exec返回值判断语句执行成功没有,执行失败调用DbConnection的成员函数 lastError获取出错代码,建议都要处理,是排故的关键;4、如果执行SELECT语句,可以通过DbConnectio

34、n类的成员函数next和返回的DbRecord 类获取记录值。示例代码:INSERT 操作:QString sql = insert into tb4 values(index,value); if (! conn-Exec(sql)(QString error =conn-lastError().text();couterrorExec(commit);if (! conn-Exec(select *from tb4”)(QString error = conn-lastError ();std:coutNext()(Int id=record-GetField(0).toInt();int value=record-GetField(1). toInt(); std:coutidFreeConnection(conn),释放工作就OK 了。目前数据库asdp平台提供的接口操作没有实现数据库支持的占位符功能(QT由 QSqlQuery类的prepare函数和addBindValue实现),所以对大数据字段的插入暂时还是无能 为力的。本文档旨在通过对3个数据库测试用例代码分析,同大家分享QT下进行oracle数据库 开发和借用平台接口开发oracle数据库程序流程。App源代码在目录下的app.rar压缩文件里。万宏 Email: scu.wanhong

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号