qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

UIAutomation: 登录界面测试实例

 功能介绍:包括2个文本输入框,分别叫 User name 、 Password ,和一个按钮,叫 Login。
  以下为测试脚本:
//Get the handle of application main window
var window = UIATarget.localTarget().frontMostApp().mainWindow();
//Get the handle of view
var view = window.elements()[0];
var textfields = window.textFields();
var passworldfields = window.secureTextFields();
var buttons = window.buttons();
var textviews = window.textviews();
var statictexts = window.staticTexts();
var target = UIATarget.localTarget();
//Check number of Text fields
if(textfields.length != 1)
{
UIALogger.logFail("FAIL: Invalid number of Text fields");
}
else
{
UIALogger.logpass("PASS: Correct number of Text fields");
}
//TESTCASE_001: Test Log on Screen
//Check existence of desired TextField on UIScreen
if(textfields["username"]==null || textfields["username"].toString() == "[object UIAELementNil]")
{
UIALogger.logFail("FAIL:Desired textfield not found.");
}
else
{
UIALogger.logPass("PASS: Desired UITextfield is available");
}
//TESTCASE_1.2:Check existence desired of PasswordField On UIScreen
if(passwordfields[0] == null || passworldfields[0].toString() == "[object UIAElementNil]")
{
UIALogger.logFail("FAIL: Desired UISecureField not found.");
}
else
{
UIALogger.logPass("PASS: Desired UISecureField is available");
}
//TESTCASE_1.3 :Check for Existence of Buttons On UIScreen
if(button["logon"] == null || buttons["logon"].toString() == "[object UIElementNil]")
{
UIALogger.logFail("FAIL:Desired UIButton not found.");
}
else
{
UIALogger.logPass("PASS:Desired UIButton is available");
}
//TESTCASE_001: Missing User Name
textfields["username"].setValue("");
passwordfields[0].setValue("password");
buttons["logon"].tap();
//target.delay(2);
var errorVal = textviews["error"].value();
if(errorVal != "Invalid User Name or PassWord")
{
UIALoger.logFail("Did Not Get Missing UserName Error:" + errorVal);
}
else
{
UIALogger.logPass("Missing User Name");
}
//TESTCASE_003: Successful Log On
textfields["username"].setValue("username");
passwordfields[0].setValue("password");
buttons["logon"].tap();
target.delay(2);

posted @ 2014-05-14 10:10 顺其自然EVO 阅读(1738) | 评论 (0)编辑 收藏

如何制定语境驱动的测试计划

 本指南旨在帮助读者制定测试计划。请注意,真正的测试计划是实际指导自己实施测试的一套想法。不管读者是否制定书面测试计划,我们设计的这个指南都会有所帮助。
  本指南并不是一种模板,不是供读者填写的表格,而是一组旨在帮助读者思考的思想,用于降低读者遗忘重要内容的可能性。我们使用的是简洁语言和描述,有可能不太适合测试新手。本指南主要向有经验的测试员或测试组长提供支持。
  以下分 七个任务主题。这些主题没有一定顺序。实际上,读者可以按任何顺序阅读。只是需要注意,测试计划的质量与是否很好地执行了任务以及使否很好地考虑了像这里提出的问题相关。状态检查部分有助于读者确定是否制定了足够好的测试计划,但是我们建议读者要在整个项目开发过程中,重新检查并修改测试计划(至少要在心中修改)。
  1. 监视影响测试计划的主要问题
  确定影响制定实用、有效的测试策略中时间、工作量或可行性要素的风险、障碍或其他挑战。要把握计划的整体作用。在整个项目开发过程中,全程监视这些问题。
  ____ 状态检查___________________________________________________
  □ 是否有要满足的特别关键或很难度量的产品质量标准?
  □ 产品是否复杂或很难学会?
  □ 测试员是否需要特殊培训或工具?
  □ 是否很难得到或配置的部分测试平台?
  □ 是否将测试未集成或半可操作的产品组件?
  □ 是否存在具体的可测试性问题?
  □ 项目团队是否缺乏产品设计、技术或用户群的经验?
  □ 测试是否必须很快开始?
  □ 是否有制定测试计划所需的信息还没有收集到?
  □ 是否能够评审被测产品的某个版本(甚至是演示版、原型版或老版本)?
  □ 是否有足够的难以录用或组织的测试人员?
  □ 是否必须遵循自己所不熟悉的测试理论?
  □ 项目计划的制定是都没有考虑测试需要?
  □ 计划是否要经过漫长的协商或批准?
  □ 测试员是否远离客户?
  □ 计划是设计的一个内容吗?
  □ 客户是否说不出测试员能够为他们做什么?
  2. 明确任务
  本节给出的任何一部分或全部目标都可能是具体测试任务的一部分。有些任务比另外一些更重要。根据对具体项目的了解,为这些目标排队。对于所有使用的目标,找出可以用来评判的具体的成功指标。
  需要考虑的任务要素
  □ 快速找出重要问题。
  □ 进行综合质量评估。
  □ 确认产品质量是否达到具体标准。
  □ 尽可能缩短测试时间或降低测试成本。
  □ 尽可能提高测试效率。
  □ 就提高质量或可测试性问题,向客户提出建议。
  □ 就如何测试向客户提出建议。
  □ 保证测试过程总是可以充分说明的。
  □ 严格遵守特定的方法或指示。
  □ 使特定的项目相关人员感到满意。
  可能的工作产品
  □ 说明测试任务的简短电子邮件。
  □ 一页纸篇幅的测试要求。
  ____ 状态检查___________________________________________________
  □ 是否知道谁是自己的客户?
  □ 关键人物是否赞同测试任务?
  □ 测试任务是否足够清晰,以作为制定计划的基础?
3. 分析产品
  了解被测试产品及其内部技术。了解如何使用被测产品。需要深入下去。随着对产品了解的深入,测试会变得越来越好,因为自己越来越接近成为产品专家
  分析什么
  □ 用户(用户是谁,他们的职业是什么)。
  □ 结构(代码、文件等)。
  □ 功能(产品做什么)。
  □ 数据(输入、输出、状态等)。
  □ 平台(外部硬件和软件)。
  □ 运营(产品是用来完成什么任务的)。
  分析方式
  □ 执行探索式测试。
  □ 评审产品和项目文档。
  □ 与设计人员和用户面谈。
  □ 与类似产品进行比较。
  可能的工作产品
  □ 测试覆盖大纲。
  □ 带注释的规格说明。
  □ 产品问题清单。
  ____ 状态检查___________________________________________________
  □ 设计人员赞同产品覆盖大纲吗?
  □ 设计人员认为测试员了解产品吗?
  □ 测试员能够可视化产品并预测产品行为吗?
  □ 测试员能够产生测试数据(输入和结果)吗?
  □ 测试员能够配置并操作被测产品吗?
  □ 测试员理解产品将被怎样使用吗?
  □ 测试员是否发现设计中的不一致问题?
  □ 测试员是否找出显式和隐式规格说明?
  4. 分析产品风险
  被测产品可能怎样以一种重要方式失效?开始测试员最多也智慧有一个一般想法。随着测试员对产品了解的深入,测试策略和测试会变得越来越好,因为对被测产品的失效机理了解的越来越多。
  分析对象
  □ 威胁(具有挑战性的条件和数据)。
  □ 脆弱性(在什么地方可能失效)。
  □ 失效模式(可能的问题种类)。
  □ 失效影响(问题的严重程度)。
  分析方式
  □ 评审需求和规格说明。
  □ 评审实际失效。
  □ 与设计人员和用户面谈。
  □ 对照风险启发和质量评判大纲评审产品。
  □ 找出一般问题和失效模式。
  可能的工作产品
  □ 组件/风险矩阵。
  □ 风险清单。
  ____ 状态检查___________________________________________________
  □ 设计人员和用户对风险分析认可吗?
  □ 测试员能够找出所有重要的问题种类吗?这些问题都应该在测试期间出现吗?
  □ 为了尽可能提高测试效果,测试员知道该把测试工作集中到哪些对象上吗?
  □ 设计人员是否采取措施使重要问题更容易被检测,或降低发生的可能性?
  □ 测试员如何发现自己的风险分析是否准确?
  5. 设计测试策略
  为了根据已有的产品最佳信息快速、有效地测试,测试员可以做什么?首先尽可能做出最好的决策,同时又要让测试策略能够在项目整个开发过程中改进。
  考虑五方面的手段
  □ 以测试员为核心的手段。
  □ 以覆盖率为核心的手段(结构覆盖率和功能覆盖率)。
  □ 以问题为核心的手段。
  □ 以活动为核心的手段。
  □ 以评估为核心的手段。
  计划方式
  □ 针对风险和产品域确定手段。
  □ 可视化具体和实用手段。
  □ 使测试策略多样化,尽可能减少遗漏重要问题的机会。
  □ 寻找通过自动化测试扩展测试策略的途径。
  □ 不要计划得过死,使测试员能够发挥自己的才智。
  可能的工作产品
  □ 逐项列出的每条所选测试策略以及如何运用的说明。
  □ 风险/任务矩阵。
  □ 所选测试策略固有的问题或挑战清单。
  □ 针对没有充分覆盖的产品部分提出的建议。
  □ 测试用例(仅当需要时)。
  ____ 状态检查___________________________________________________
  □ 客户认同测试员制定的测试策略吗?
  □ 测试策略给出的所有内容都是必要的吗?
  □ 测试策略是否能够实际贯彻?
  □ 测试策略是否过于通用?可以容易地用于任何产品吗?
  □ 是否还有不准备测试的任何重要问题?
  □ 测试策略利用了可用的资源和帮助者吗?
6. 条件计划
  测试经理将如何实现测试策略?测试策略会受到条件约束或指示的很大影响,努力争取所需的资源,并尽量利用可用的所有资源。
  保障条件方面的问题
  □ 测试工作量估计和进度评估。
  □ 可测试性宣传。
  □ 测试团队力量(合适技能)。
  □ 测试员培训与管理。
  □ 测试员任务分配。
  □ 产品信息收集与管理。
  □ 项目团队会议、沟通和协同。
  □ 与项目团队所有其他小组、包括开发小组的关系。
  □ 测试平台的获得和配置。
  □ 约定和协议。
  □ 测试工具和自动化测试。
  □ 插桩和模拟需要。
  □ 测试包的管理和维护。
  □ 构建和传送协议。
  □ 测试周期管理。
  □ 错误报告系统和协议。
  □ 测试状态报告协议。
  □ 代码冻结与增量测试。
  □ 项目最后的压力管理。
  □ 测试停止协议。
  □ 测试效果的评估。
  可能的工作产品
  □ 问题清单。
  □ 产品风险分析。
  □ 责任矩阵。
  □ 测试进度计划。
  ____ 状态检查___________________________________________________
  □ 项目团队的保障条件是否支持已制定的测试策略?
  □ 是否存在阻碍测试的问题?
  □ 测试条件和策略是否能够修改,以适应可以预见的问题?
  □ 现在是否可以开发测试,以后再解决其余问题?
  7. 共享测试计划
  测试员并不孤独。测试过程必须服务于项目团队。因此,要吸收项目团队成员参与测试计划的制定。不必夸大这个问题,至少要与团队的关键成员讨论,从而得到他们的理解和隐含的支持,以争取实现测试计划。
  共享方式
  □ 吸收设计人员和项目相关人员参加测试计划制定过程。
  □ 积极征求有关测试计划的意见。
  □ 尽自己所能帮助开发人员获得成功。
  □ 帮助开发人员理解他们的行为会对测试产生的影响。
  □ 与技术文档编写员和技术支持人员就分享质量信息进行沟通。
  □ 请设计人员和开发人员评审和批准参考材料。
  □ 记录和跟踪约定。
  □ 请别人分段评审测试计划。
  □ 通过减少测试计划文档中不必要的文字,来改进文档的可评审性。
  目标
  □ 对测试过程的一致理解。
  □ 对测试过程的一致承诺。
  □ 测试过程的合理参与。
  □ 管理层对测试过程的合理预期。
  ____ 状态检查___________________________________________________
  □ 项目团队是否关注测试计划。
  □ 项目团队,特别是一线管理人员是否理解测试小组的角色?
  □ 项目团队是否感觉到测试小组关心项目团队的最佳利益?
  □ 测试小组和项目团队其他小组之间是否有对立或积极的关系?
  □ 是否有人认为测试员没有将注意力集中到重要的测试上?
  =========================================================================
  这是一篇很长的文章,是讨论如何制定语境驱动测试的测试计划。会有很多的检查项,帮助读者不要忘记重要的内容。如果想照搬,肯定是不现实的。

posted @ 2014-05-14 10:09 顺其自然EVO 阅读(141) | 评论 (0)编辑 收藏

如何切分用户故事

  在把用户故事切分成小块,从而更好地利用敏捷技术时,很多新组建的敏捷团队都会遇到困难。 敏捷社区的成员在多篇文章中为如何有效地切分用户故事提供了指导。
  当把庞大的用户故事切分成小块时,是否有一些一般的准则供我们遵循呢? Rachel Davies建议对每个用户故事都要进行切分,从而让产出的软件:
  · 能够工作
  · 交付价值
  · 能有效地得到用户的反馈
  Richard Lawrence提供了以下技术,他认为在切分大型用户故事时它们会很有用:
  根据工作流程的步骤来切分故事——可能是把简单的首尾循环的用例作为一个故事,然后让工作流中的其它步骤作为单独的故事。
  切分故事,让业务规则中的每种变化都是其自身的故事。
  把故事切分为“实现第一个[X]”,然后“实现其它[X]”。 当实现第一个[X]的时候所要付出的努力要比实现之后的所有[X]所要付出的都大时,就可以应用这种方法。
  当面对复杂故事的时候,把故事最简单的版本切分为单独的故事。
  通过故事所操作的数据类型来切分。
  通过找到简单数据输入方法和更复杂方法之间的区别来切分故事。
  把对当前故事的性能的考虑转移到一个或多个新故事中。
  按照创建-读取-更新-删除(CRUD)来切分故事。
  最后一种方法,创建一个spike故事,从而描述出如何实现特性。
  Rachel Davies提供了关于如何根据输入/输出的数据来切分故事的细节:
  你可以为每个输入页面创建故事。
  你可以为输入页面每个可用的元素创建故事。
  你可以创建简单的(不是很漂亮的)UI。
  你可以创建一个命令行界面。
  此外,Bob Hartman为切分故事提供了以下技术:
  在涉及到多个角色的故事中,根据角色来对其进行切分。
  切分故事,使得高风险的部分和低风险的部分分离。
  切分故事,从而使能够在每个故事上工作的开发者数量最大化。
  切分故事以有助于测试
  你认为最有用的切分用户故事的方式是什么呢?

posted @ 2014-05-14 10:07 顺其自然EVO 阅读(180) | 评论 (0)编辑 收藏

基于Selenium的自动化平台设计

 前言
  相信说起QTP,大部分测试的同学都会知道;它作为一个成功商业软件,其功能的强大自然不言而喻,但同时它也有自己的局限性;所以当人们在工作中发现有些想要的功能,在现有的工具中不能得到满足的时候;可能就需要产生出一种新的设计或者方式来解决问题。
  本文中提到的就是类似的一种产出物,一个类QTP的又能满足我们自己测试需求的测试工具。它是一个基于Selenium的上层自动化测试平台,主要做的工作就是围绕selenium来搭建起一套相对完善的自动化测试套件,让基于selenium的自动化测试也能像QTP的测试体系一样完整、易用。
  关键字:selenium、自动化平台、web自动化测试
  设计的目的
  在自动化测试工具的使用方面,相信有很多人选择QTP,也有不少人选择selenium;所以选择哪个工具都是基于具体项目的情况来确定的,而这里选择selenium的初因可以大致罗列几条:
  · 支持浏览器的兼容性测试
  · 支持跨平台的web测试
  · 支持多种主流语言开发
  · 免费的、开源的项目
  · 易于二次开发和集成
  自然就像前面所提到的一样,每一个工具都有它自己的局限和不足;selenium也没有做到尽善尽美,但是当它的基本功能已经可以满足我们核心业务的时候,剩下的工作可能需要我们自己来慢慢完善。这里也罗列几条selenium不够完善的部分:
  · 不支持对象库管理功能
  · 没有用例管理和执行功能
  · 没有历史结果查看系统
  · 不适合非技术人员使用
  依据上面的分析,我们可以很容易的发现selnium的不足正是QTP所拥有的;而QTP不支持的也是Selenium的被大家喜爱的原因之一。那么怎么能把它们各自的优点合二为一就是本文所要讲述的内容----实现一个基于Selenium的自动化平台。
     ......
  查看全文请点击下载:http://www.51testing.com/html/15/n-860515.html
  测试用例管理模块:
  测试用例管理模块主要作用是新建、查询、修改、执行测试用例;所以它要完成的功能有:
  · 测试用例的新建
  · 测试用例的查看
  · 测试用例的修改
  · 测试用例的执行
  测试结果管理模块:
  测试结果管理模块主要作用是查询测试用例的执行结果、历史记录;所以它要完成的功能有:
  · 按测试用例查看结果
  · 按测试用例查询历史
  平台的设计
  针对前面所设计到的功能;其主要功能都体现在管理上面,并非常见的代码层面,所以要设计的平台肯定要基于UI的;其次为了有更好的共享和通用性,所以应该选择基于WEB的架构开发。
    ......
   查看全文请点击下载:http://www.51testing.com/html/15/n-860515.html

posted @ 2014-05-14 10:06 顺其自然EVO 阅读(253) | 评论 (0)编辑 收藏

Java socket 服务和客户端传值

packagesockerk;
importjava.io.DataInputStream;
importjava.io.IOException;
importjava.net.Socket;
importjava.net.UnknownHostException;
publicclassSocketClient{
publicstaticvoidmain(String[]args){
Socketsocket=null;
try{
socket=newSocket("127.0.0.1",8888);
DataInputStreamdis=newDataInputStream(socket.getInputStream());
Stringstring="";
while(!"end".equals(string)){
string=dis.readUTF();
System.out.println(string);
}
socket.close();
}catch(UnknownHostExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
  服务端
packagesocket;
importjava.io.BufferedReader;
importjava.io.DataOutputStream;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassSocketSingleServer{
publicstaticvoidmain(String[]args)throwsIOException{
ServerSocketserverSocket=null;
Socketclient=null;
try{
serverSocket=newServerSocket(8888);
client=serverSocket.accept();
BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
DataOutputStreamdos=newDataOutputStream(client.getOutputStream());
while(!client.isClosed()){
Stringstr="";
if((str=br.readLine())!=null){
dos.writeUTF(str);
dos.flush();
}
}
}catch(IOExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
client.close();
}
}
}
  客服端

posted @ 2014-05-13 16:26 顺其自然EVO 阅读(438) | 评论 (0)编辑 收藏

Orcale 数据库客户端PL/SQL中文乱码的问题

  配置一下环境变量即可:
  1.我的电脑--> 属性---> 高级系统设置 --> 环境变量
  2.配置环境变量
  变量名:NLS_LANG
  变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
  这样在PL/SQL 中就没有乱码了,也支持中文的查询了。

posted @ 2014-05-13 16:26 顺其自然EVO 阅读(156) | 评论 (0)编辑 收藏

软件测试过程管理——脑图

  软件测试过程管理,主要包括软件测试是什么样的过程,如何评价一个软件测试过程,如何进行配置管理和测试风险分析以及测试成本的管理。

posted @ 2014-05-13 16:25 顺其自然EVO 阅读(205) | 评论 (0)编辑 收藏

LoadRunner监控tomcat的代码

  最近想对tomcat的性能指标做监控,于是 想到loadrunner关联函数的用法,于是做了本次尝试,没想到效果还不错,所以拿出来供大家分享,通过本次测试发现,关联的作用太强大了~
Action()
{
double atof(const char *string);
web_reg_save_param("JVM_FreeMemory",
"LB=Free memory: ",
"RB= MB",
"Ord=1",
LAST);
web_reg_save_param("JVM_TotalMemory",
"LB=Total memory: ",
"RB= MB",
"Ord=1",
LAST);
web_reg_save_param("JVM_MaxMemory",
"LB=Max memory: ",
"RB= MB",
"Ord=1",
LAST);
web_reg_save_param("http_MaxThreads",
"LB=Max threads: ",
"RB= ",
"Ord=1",
LAST);
web_reg_save_param("http_CurrentThreadCount",
"LB=Current thread count: ",
"RB= ",
"Ord=1",
LAST);
web_reg_save_param("http_CurrentThreadBusy",
"LB=Current thread busy: ",
"RB= ",
"Ord=1",
LAST);
web_reg_save_param("http_MaxProcessingTime",
"LB=Max processing time: ",
"RB= ms",
"Ord=1",
LAST);
web_reg_save_param("http_ProcessingTime",
"LB=Processing time: ",
"RB= s",
"Ord=1",
LAST);
web_reg_save_param("http_RequestCount",
"LB=Request count: ",
"RB= ",
"Ord=1",
LAST);
web_reg_save_param("http_ErrorCount",
"LB=Error count: ",
"RB= ",
"Ord=1",
LAST);
web_reg_save_param("http_BytesReceived",
"LB=Bytes received: ",
"RB= MB",
"Ord=1",
LAST);
web_reg_save_param("http_BytesSent",
"LB=Bytes sent: ",
"RB= MB",
"Ord=1",
LAST);
web_set_user("tomcat", "123","10.40.15.8:8080");
lr_think_time(20);
web_url("status",
"URL=http://10.40.15.8:8080/manager/status",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
LAST);
lr_user_data_point("Tomcat JVM FreeMemory", atof(lr_eval_string("{JVM_FreeMemory}")));
lr_user_data_point("Tomcat JVM TotalMemory", atof(lr_eval_string("{JVM_TotalMemory}")));
lr_user_data_point("Tomcat JVM MaxMemory", atof(lr_eval_string("{JVM_MaxMemory}")));
lr_user_data_point("Tomcat http MaxThreads", atof(lr_eval_string("{http_MaxThreads}")));
lr_user_data_point("Tomcat http CurrentThreadCount", atof(lr_eval_string("{http_CurrentThreadCount}")));
lr_user_data_point("Tomcat http CurrentThreadBusy", atof(lr_eval_string("{http_CurrentThreadBusy}")));
lr_user_data_point("Tomcat http MaxProcessingTime", atof(lr_eval_string("{http_MaxProcessingTime}")));
lr_user_data_point("Tomcat http ProcessingTime", atof(lr_eval_string("{http_ProcessingTime}")));
lr_user_data_point("Tomcat http RequestCount", atof(lr_eval_string("{http_RequestCount}")));
lr_user_data_point("Tomcat http ErrorCount", atof(lr_eval_string("{http_ErrorCount}")));
lr_user_data_point("Tomcat http BytesReceived", atof(lr_eval_string("{http_BytesReceived}")));
lr_user_data_point("Tomcat http BytesSent", atof(lr_eval_string("{http_BytesSent}")));
return 0;
}

posted @ 2014-05-13 16:24 顺其自然EVO 阅读(540) | 评论 (0)编辑 收藏

Jmeter做web压力测试时设置持续时间注意点

  头一回使用jmeter做web压力测试,遇到个很莫名其妙的问题,不管我的线程组怎么设置,它就是执行一次就结束了。
  设置循环次数为300,不使用调度器--〉执行一次就结束了,循环次数未生效
  设置循环次数永远,设置高度器的开始和结束时间,不使用延迟和持续--〉开始时间有效,执行一次就结束了,结束时间未生效
  设置循环次数永远,设置延迟1秒,持续1200秒--〉延迟1秒执行,执行一次就结束了,持续时间未生效
  不管我怎么设置,都是执行一次就结束了,也没有错误发生,就是正常的结束
  jmeter版本2.9和2.11都一个德行的
  脚本是压测web脚本,利用badboy录制的,应该不会有问题,然后我就跟以前的脚本一个个比对,终于被我发现了!
  在step里还有个设置,需要勾选上永远才行

posted @ 2014-05-13 16:23 顺其自然EVO 阅读(741) | 评论 (0)编辑 收藏

QTP校验数据库中数据后台项目

 数据校验功能后台主要包括两个类:QTPCommonServlet.java和QTPCommonDao.java
  其中QTPCommonServlet.java为:
package com.runqianapp.qtp;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.runqianapp.qtp.QTPCommonDao;
import com.geezn.exception.GeeznException;
import com.runqianapp.common.log.GEZLoggerManager;
import com.runqianapp.common.servlet.AbstractGezServlet;
/**
QTP数据检查Servlet
* @author RAQ
*
*/
public class QTPCommonServlet extends AbstractGezServlet {
/**获取表中所有数据*/
private static final String GET_ALL_DATA = "getAllData";
/**检查删除操作结果*/
private static final String CHECK_DELETE_RESULT = "checkDeleteResult";
/**
* 重写service()方法
*/
public void service(HttpServletRequest request, HttpServletResponse response){
response.setContentType("text/html");
PrintWriter out = null;
try {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
out = response.getWriter();
} catch (Exception e) {
GeeznException ge;
if(e instanceof GeeznException){
ge = (GeeznException) e;
}else{
ge = new GeeznException(QTPCommonDao.MODULE_QTP, GEZLoggerManager.LOGLEVEL_ERROR,"设置字符格式、获取输出对象时,发生错误", e, "{}");
}
out.print(ge.getErrorMessageJson());
}
String action = request.getParameter("action");
if(GET_ALL_DATA.equals(action)){
String sql = request.getParameter("sql");
String sqlDateNumber = request.getParameter("sqlDateNumber");
String allDatas = "";
try {
allDatas = QTPCommonDao.getAllDatas(sql,sqlDateNumber);
} catch (GeeznException e) {
GeeznException ge;
if(e instanceof GeeznException){
ge = (GeeznException) e;
}else{
ge = new GeeznException(QTPCommonDao.MODULE_QTP, GEZLoggerManager.LOGLEVEL_ERROR,"得到表中数据时,发生错误", e, "{}");
}
out.print(ge.getErrorMessageJson());
}
out.print(allDatas);
}else if(CHECK_DELETE_RESULT.equals(action)){
String sql = request.getParameter("sql");
boolean deleteResult = false;
try {
deleteResult = QTPCommonDao.checkDeleteResult(sql);
} catch (GeeznException e) {
GeeznException ge;
if(e instanceof GeeznException){
ge = (GeeznException) e;
}else{
ge = new GeeznException(QTPCommonDao.MODULE_QTP, GEZLoggerManager.LOGLEVEL_ERROR,"检查删除动作结果时,发生错误", e, "{}");
}
out.print(ge.getErrorMessageJson());
}
out.print(deleteResult);
}
}
}
 QTPCommonDao.java为:
package com.runqianapp.qtp;
import java.sql.*;
import com.geezn.exception.GeeznException;
import com.runqian.mis2.util.DBAccess;
import com.runqianapp.common.log.GEZLoggerManager;
/**
* QTP通用数据库操作类
* @author RAQ
*
*/
public class QTPCommonDao {
/**
* 用于存储表字段名称,各字段名称之间用“;”分隔
*/
public static StringBuffer columns = new StringBuffer();
/**
* 用于存储当前操作表名
*/
public static String tableName = "";
/**
* 用于日志输出,模块标识
*/
public static final String MODULE_QTP = "qtpModule";
/***
* 获取表字段名称及所有数据信息
* @param sql 用户输入的查询sql语句
* @param sqlDateNumber 查询数据条数(保留功能,目前暂不处理)
* @return 表字段名称及所有链接信息 如:"short_link;...;link_name||/link1,...,百度@_@{};/link2,...,谷歌@_@{}"
*         表字段名称与表数据之间用"||"分隔,各表字段名称之间与各表数据之间用";"分隔,每条表数据内部用"#"和"@_@"分隔
*         其中"#"用来分隔表字段数据,"@_@"用来分隔表字段数据与json字符串
* @throws GeeznException
*/
public static synchronized String getAllDatas(String sql, String sqlDateNumber)
throws GeeznException {
getTableName(sql);  //解析出表名
PreparedStatement pstmt = null;
DBAccess dba = null;
ResultSet rs = null;
StringBuffer allDatas = new StringBuffer();  //方法返回的字符串
try {
dba = new DBAccess();
rs = dba.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
/** 每次请求处理之前,先对columns进行一次清空 */
columns = columns.delete(0, columns.length());
/** 在返回的字符串里添加表字段信息 */
for (int i = 1; i <= columnCount; i++) {
allDatas.append(rsmd.getColumnName(i)).append(";");
columns.append(rsmd.getColumnName(i)).append(";");
}
allDatas.deleteCharAt(allDatas.length() - 1);
columns.deleteCharAt(columns.length() - 1);
String[] column = columns.toString().split(";");
allDatas.append("||");
/** 在返回的字符串里添加表数据信息 */
while (rs.next()) {
for (int i = 0; i < column.length; i++) {
allDatas.append(rs.getString(column[i])).append("#");
}
allDatas.deleteCharAt(allDatas.length() - 1);
allDatas.append("@_@");  //以"@_@"符号分隔前台的数据字段信息和整条数据信息
/**生成每条数据的json字符串*/
allDatas.append("{");
for (int i = 0; i < column.length; i++) {
allDatas.append("\"").append(column[i]).append("\"")
.append(":")
.append("\"").append(rs.getString(column[i])).append("\"")
.append(",");
}
allDatas.deleteCharAt(allDatas.length() - 1);
allDatas.append("}");
allDatas.append(";");
}
allDatas.deleteCharAt(allDatas.length() - 1);
} catch(Exception e){
throw new GeeznException(QTPCommonDao.MODULE_QTP, GEZLoggerManager.LOGLEVEL_ERROR,"根据传入的sql获取数据时,发生错误", e,"{}");
} finally {
close(dba, pstmt, rs);
}
return allDatas.toString();
}
/**
* 从用户输入的sql语句中解析出表名并存入变量tableName中
* @param sql 用户输入的sql语句
*/
public static void getTableName(String sql){
if (sql.contains("where") || sql.contains("WHERE")) {
int start = 0;
int end = 0;
if (sql.contains("from")) {
start = sql.indexOf("from");
} else if (sql.contains("FROM")) {
start = sql.indexOf("FROM");
}
if (sql.contains("where")) {
end = sql.indexOf("where");
} else if (sql.contains("WHERE")) {
end = sql.indexOf("WHERE");
}
if (start == 0 || end == 0) {
System.out.println("解析表名失败");
} else {
tableName = sql.substring(start + 5, end);
}
} else {
int start = 0;
if (sql.contains("from")) {
start = sql.indexOf("from");
} else if (sql.contains("FROM")) {
start = sql.indexOf("FROM");
}
if (start == 0) {
System.out.println("解析表名失败");
} else {
tableName = sql.substring(start + 5, sql.length());
}
}
}
/**
* 判断某条数据是否已被成功删除方法
* @param sql 查询删除数据的sql语句
* @return  返回某条超链接是否已被成功删除 true:已被删除 false:没有被删除
* @throws GeeznException
*/
public static synchronized Boolean checkDeleteResult(String sql)throws GeeznException{
boolean flag = true; //方法返回的字符串
DBAccess dba = null;
ResultSet rs = null;
try{
dba = new DBAccess();
rs = dba.executeQuery(sql);
while(rs.next()){
flag = false;
}
}catch(Exception e){
throw new GeeznException(QTPCommonDao.MODULE_QTP, GEZLoggerManager.LOGLEVEL_ERROR,"判断某条数据是否已被成功删除时,发生错误", e,"{}");
}finally{
close(dba, null, rs);
}
return flag;
}
/**关闭所有连接
* @throws GeeznException
*/
private static void close(DBAccess dba,Statement ps,ResultSet rs) throws GeeznException{
try{
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(dba!=null){
dba.close();
}
}catch(Exception e){
throw new GeeznException(QTPCommonDao.MODULE_QTP, GEZLoggerManager.LOGLEVEL_ERROR,"关闭所有连接时,发生错误", e,"{}");
}
}
}

posted @ 2014-05-13 16:22 顺其自然EVO 阅读(292) | 评论 (0)编辑 收藏

仅列出标题
共394页: First 上一页 113 114 115 116 117 118 119 120 121 下一页 Last 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜