java路径更换路径出现设备未准备就绪怎么办

study plan
测试技术:
白盒测试技术
自动化测试 (QTP、LR)
WEB测试技术
黑盒测试技术深入研究
相关技术:
编程语言,脚本语言
读完《软件测试》那本书
研究WEB测试
10月开始,一直学到年底吧
《JAVA与C++比较》那本书
白盒测试,研究代码
学习Selenium
<FONT color=#c年初开始
学习脚本,VBS、PYTHON、RUBY等(再议)
工作中要一直坚持深入掌握黑盒测试的东西,善于学习总结,不断完善测试用例的编写,观察测试管理
偶尔研究下数据库等测试环境的搭建
  现在一般人都有使用浏览器浏览网页的经历,用户虽然不是专业人员但是对界面效果的印象是很重要的。如果你注重这方面的测试,那么验证应用程序是否易于使用就非常重要了。很多人认为这是测试中最不重要的部分,但是恰恰相反界面对不懂技术的客户来说那相当关键,慢慢体会你会明白的。
  方法上可以根据设计文档,如果够专业的话可以专业美工人员,来确定整体风格页面风格,然后根据这个可以页面人员可以生成静态的HTML,CSS等甚至生成几套不用的方案来讨论,或者交给客户评审,最后形成统一的风格的页面/框架。注意不要靠程序员的美术素养形成你的web风格,那样可能会很糟糕。
  主要包括以下几个方面的内容:
  站点地图和导航条位置、是否合理、是否可以导航等内容布局 布局是否合理,滚动条等简介说明 说明文字是否合理,位置,是否正确
  背景/色调 是否正确、美观,是否符合用户需求;
  页面在窗口中的显示是否正确、美观(在调整浏览器窗口大小时,屏幕刷新是否正确)表单样式大小,格式,是否对提交数据进行验证(如果在页面部分进行验证的话)等
  连接连接的形式,位置,是否易于理解等
  web测试的主要页面元素
  页面元素的容错性列表(如输入框、时间列表或日历)
  页面元素清单(为实现功能,是否将所需要的元素全部都列出来了,如按钮、单选框、复选框、列表框、超连接、输入框等等)
  页面元素的容错性是否存在
  页面元素的容错性是否正确
  页面元素基本功能是否实现(如文字特效、动画特效、按钮、超连接)
  页面元素的外形、摆放位置(如按钮、列表框、核选框、输入框、超连接等)
  页面元素是否显示正确(主要针对文字、图形、签章)
  元素是否显示(元素是否存在)
  页面元素清单(为实现功能,是否将所需要的元素全部都列出来了,如按钮、单选框、复选框、列表框、超连接、输入框等等)
  测试技术
  通过页面走查,浏览确定使用的页面是否符合需求。可以结合兼容性测试对不用分辨率下页面显示效果,如果有影响应该交给设计人员提出解决方案。
  可以结合数据定义文档查看表单项的内容,长度等信息。
  对于动态生成的页面最好也能进行浏览查看。如Servelet部分可以结合编码规范,进行代码走查。是否支持中文,如果数据用XML封装要做的工作会多一点等等。
  界面测试要素:
  符合标准和规范,灵活性,正确性,直观性,舒适性,实用性,一致性
  1.直观性:
  用户界面是否洁净,不唐突,不拥挤.界面不应该为用户制造障碍.所需功能或者期待的响应应该明显,并在预期出现的地方.
  界面组织和布局合理吗?是否允许用户轻松地从一个功能转到另一个功能?下一步做什么明显吗?任何时刻都可以决定放弃或者退回,退出吗?输入得到承认了吗?菜单或者窗口是否深藏不露?
  有多余功能吗?软件整体抑或局部是否做得太多?是否有太多特性把工作复杂化了?是否感到信息太庞杂?
  如果其他所有努力失败,帮助系统真能帮忙吗?
  2.一致性
  快速键和菜单选项.在Windows 中按F1键总是得到帮助信息
  术语和命令.整个软件使用同样的术语吗?特性命名一致吗?例如,Find是否一直叫Find,而不是有时叫Search?
  软件是否一直面向同一级别用户?带有花哨用户界面的趣味贺卡程序不应该显示泄露技术机密的错误提示信息.
  按钮位置和等价的按键.大家是否注意到对话框有OK按钮和Cancle按钮时,OK按钮总是在上方或者左方,而Cancle按钮总是在下方或右方?同样原因,Cancle按钮的等价按键通常是Esc,而选中按钮的等价按钮通常是Enter.保持一致.
  3.灵活性
  状态跳转.灵活的软件实现同一任务有多种选择方式.
  状态终止和跳过,具有容错处理能力.
  数据输入和输出.用户希望有多种方法输入数据和查看结果.例如,在写字板插入文字可用键盘输入,粘贴,从6种文件格式读入,作为对象插入,或者用鼠标从其他程序拖动.
  l 4.舒适性
  恰当.软件外观和感觉应该与所做的工作和使用者相符.
  错误处理.程序应该在用户执行严重错误的操作之前提出警告,并允许用户恢复由于错误操作导致丢失的数据.如大家认为undo /redo是当然的.
  性能.快不见得是好事.要让用户看得清程序在做什么,它是有反应的.
  15、Do while方法
Dim i,RowCount '定义两个变量i=0RowCount=DataTable.GetSheet("Action1").GetRowCount '设置RowCount等于Action1中的行数。msgbox RowCountDo while i&rowcounti=i+1 '第一次进入循环,执行这句后,i=1'DataTable.GetSheet("Action1").SetCurrentRow(i) 这句话被我注释掉了,正确的写法应该是下面这样,分开写。datatable.getsheet("Action1")datatable.setcurrentrow(i)----xunhuanti----loop
  16、取对象属性(Property)值
  Dim usname
  usname =Browser("登录").Page("办公自动化系统").Frame("mainFrame_2").WebEdit("addressVO.name").GetRoProperty("Value") '获取对象属性(Property)值,如Property为Value
  MsgBox usname
  17、取得要删除的id,并删除
  'url在查看该新增记录的信息页面对象中取得,所以录制的时候,登记,查看(修改),删除
  Dim strUserid,id,strId
  id=Browser("测试登录").Page("办公自动化系统").Frame("mainFrame_4").GetROProperty("url") '在url这个属性值中存在我需要删除记录的ID信息
  strId=Mid (id,instr(60,id,"=")+1) '这一步是把需要的id值取了出来,例如:strId=Mid (id,instr(1,id,"=")+1)
  strUserid =strId 'strUserid是我要删除的记录前的复选框属性值当中的ID信息
  Browser("测试登录").Page("办公自动化系统").Frame("mainFrame").WebCheckBox("value:="&strUserid).Set "ON" 这样就把想删除的记录选中了。
  Browser("测试登录").Page("办公自动化系统").Frame("mainFrame").WebButton("删除").Click '这样就删除掉啦,呵呵
  17.2通过取得id值,并赋值进行删除
Browser("测试登录").Page("办公自动化系统").Frame("mainFrame_2").WebEdit("addressVO.name").Set DataTable("p_Text", dtGlobalSheet)Browser("测试登录").Page("办公自动化系统").Frame("mainFrame_2").WebEdit("addressVO.address").Set DataTable("p_Text1", dtGlobalSheet)Browser("测试登录").Page("办公自动化系统").Frame("mainFrame_2").WebEdit("addressVO.unitTel").Set DataTable("p_Text2", dtGlobalSheet)Dim xname,address,unitTelxname=DataTable("p_Text", dtGlobalSheet) '从datatable中取值address=DataTable("p_Text1", dtGlobalSheet)unitTel=DataTable("p_Text2", dtGlobalSheet)Dim res,cmd,sqlSet res=createobject("adodb.recordset")Set cmd=createobject("mand")Cmd.activeconnection="DRIVER={Oracle in OraHome92};SERVER=HKORACLE;UID=USER22;PWD=ZJLH;DBQ=HKORACLE;DBA=W;APA=T;EXC=F;XSM=DFEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BAM=IfAllSNUM=NLS;DPM=F;MTS=T;MDI=Me;CSR=F;FWC=F;FBS=60000;TLO=O;"<mandType = 1'sql="select addressid from address_list t where name ='"&xname&"'"'sql="select addressid from address_list t where name ='"&xname&"'sql="select addressid from address_list t where name ='"&xname&"' and address='"&address&"' and unitTel='"&unitTel&"'"<mandText = sqlSet res = Cmd.Execute()MsgBox res(0) '打印res(0)DataTable("addressid", dtGlobalSheet)=Cstr(res(0)) '输出值到datatable中Browser("测试登录").Page("办公自动化系统").Frame("mainFrame").WebCheckBox("value:="&res(0)).Set "ON"Set res = nothingSet cmd.ActiveConnection = nothingSet Cmd= nothing
18、赋值语句有:
1:Browser("测试登录").Page("办公自动化系统").Frame("mainFrame").WebCheckBox("value:="&strUserid).Set"ON"2:Browser("湛江信息化测试登录").Page("湛江东兴石油企业有限公司办公自动化系统").Frame("mainFrame").WebCheckBox("value:="&res(0)).Set"ON"3:Browser("测试登录").Page("办公自动化系统").Frame("mainFrame").WebCheckBox("IDS").SetTOProperty"value",Cstr(res(0))'Cstr为转换成小数方法4:Browser("测试登录").Page("办公自动化系统").Frame("mainFrame").WebCheckBox("IDS").SetTOProperty"value",strUserid
  19、取字符串方法:
  1:instr方法
  InStr([start, ]string1, string2[, compare])
  这个函数需要的的参数是起始位置、主体字符串、要查找的字符串;Compare是可选参数。指定字符串比较。此compare参数是可以省略的,也可以是 0, 1或 2。
  指定0(缺省)做二进制比较。指定1做不区分大小写的文本比较。例如我们要查找在字符串“abcdefg”中是否存在“cd”并返回其位置,则使用下面的语句就可以实现:
  pos=InStr(1,"abcdefg","cd") 则pos会返回3表示查找到并且位置为第三个字符开始。这就是“查找”的实现,而“查找下一个”功能的实现就是把当前位置作为起始位置继续查找。
  或者:id=87444=ddddd
  instr(1,id,"="),从位置为第一个字符起,查找=字符
  2:mid方法
  Mid(string, start[, length])
  如:MyVar =Mid("VB Script. is fun!", 4, 6) 'MyVar contains "Script".从第4位字符开始,后面6位字符
  例如:MyVar2=Mid("VB Script. is fun",4) 'MyVar contains "Script. is fun!"
  '从第4位字符开始,后面的字符
  3:Right方法
  Right(string, length)
  例子:
Dim AnyString, MyStrAnyString = "Hello World" ' Define string.MyStr = Right(AnyString, 1) ' Returns "d".MyStr = Right(AnyString, 6) ' Returns " World".MyStr = Right(AnyString, 20) ' Returns "Hello World".
  20、datatable方法
  1:AddSheet方法
  DataTable.AddSheet(SheetName)
  如:Variable=DataTable.AddSheet ("MySheet").AddParameter("Time", "8:00")
  在global中,添加sheet,并在sheet添加列和列值
  2:DeleteSheet方法
  DataTable.DeleteSheet SheetID
  例如:DataTable.DeleteSheet "MySheet"
  3:Export方法
  DataTable.Export(FileName)
  例如:DataTable.Export ("C:\flights.xls")
  4:ExportSheet方法
  DataTable.ExportSheet(FileName, DTSheet) 'DTSheet 为sheet的index
  例如:DataTable.ExportSheet "C:\name.xls" ,1
  5:GetCurrentRow
  DataTable.GetCurrentRow
  例子:row = DataTable.GetCurrentRow
  Reporter.ReportEvent 1, "Row Number", row
 6:GetRowCount
  DataTable.GetRowCount
  例子:
  rowcount = DataTable.GetSheet("MySheet").GetRowCount
  Reporter.ReportEvent 2, "There are " &rowcount, "rows in the data sheet."
  7:GlobalSheet Property方法
  DataTable.GlobalSheet
  例如:DataTable.GlobalSheet.AddParameter "Time", "5:45"
  8:Import方法
  DataTable.Import(FileName)
  例子:DataTable.Import ("C:\flights.xls")
  9:ImportSheet方法
  DataTable.ImportSheet(FileName, SheetSource, SheetDest)
  例子:
  DataTable.ImportSheet "C:\name.xls" ,1 ,"name"
  '从name.xls导入sheet,index为1,sheet名称为:name
  10:LocalSheet Property 方法
  DataTable.LocalSheet
  例子:DataTable.LocalSheet.AddParameter("Time", "5:45")
  11:SetCurrentRow方法
  DataTable.SetCurrentRow(RowNumber)
  例子:DataTable.SetCurrentRow (2)
  例子2:DataTable.SetCurrentRow (i)
  12:SetNextRow方法
  DataTable.SetNextRow
  例子:
  DataTable.SetNextRow
  13:Value Property方法
  1:DataTable.Value(ParameterID [, SheetID]) 或者 DataTable(ParameterID [, SheetID])
  2:DataTable.Value(ParameterID [, SheetID])=NewValue
  或者 DataTable(ParameterID [, SheetID]) =NewValue
  例子1:DataTable.Value ("Destination", "ActionA")="New York"
  例子2:DataTable("addressid", dtGlobalSheet)=Cstr(res(0))
  'Cstr(res(0))为一变量,addressid为sheet一列名称
  14:取datatable中某一行值
  datatable.getsheet(“global”).getparameter("列名").valuebyrow(i)
  如果想取第一行,就将i变为1
  21、ReportEvent Method 方法
  Reporter.ReportEvent EventStatus, ReportStepName, Details [, in]
  'EventStatus状态:pass:0,失败:1,done:2,警告:3,
  状态:0 or micPass,1 or micFail,2 or micDone,3 or micWarning:
  ReportStepName为Name of the intended step in the report (object name)
  例子1:
  Reporter.ReportEvent micFail, "Custom Step", "The user-defined step failed."
  例子2:
  row = DataTable.GetCurrentRow
  Reporter.ReportEvent 1, "Row Number", row
  row为一变量
 22、reusable action参数的传递方法1
  注:action1和action2都是reusable action,在action3中调用action1和action2
  1:action1中参数化,datatable参数名称为:p_Text,Global类型的
  2:action2中,编写代码如下:
Dim name1name1=DataTable.value("p_Text","Global")Browser("测试登录").Page("办公自动化系统_2").Frame("mainFrame").Link("收文名称001").SetTOProperty "text",name1//text为对象的属性
  3:在action3中,直接调用action1和action2就可以。多个reusable也类似这么做。
  23、action 参数传递方法2(没有验证过)
  不知道你是不是想把Action2的一些值传递给Action3。
  Action Param 既可以作输入也可以作输出,所以他们之间的参数传递是很简单的。
  在Action1里面只要实现如下代码就可以了:
  RunAction "Action2", oneIteration, InputParamToAction2, OutputParamFromAction2
  RunAction "Action3", oneIteration, OutputParamFromAction2
  上面的变量OutputParamFromAction2就同时作为Action2的输出和Action3的输入。
  24、action 参数传递方法3(没有验证过)
  Action级别的参数调用:
  1: 设置参数
  Action Properters && Action Parameter
  增加input的参数和output的参数
  2: Action 1 的脚本:
parameter("output")="Action1 Output"msgbox("Action1 Input:"&parameter("input"))msgbox("Action1 Output:"&parameter("output"))
  3:Action 2 的脚本:
RunAction"Action1",oneIteration,"Action2Input",action2msgbox("OutputinAction2:"&action2)
  我们不难发现在QTP的Action之间关系
  作为被调用Action1,都是使用parameter("参数名")来使用的。
  作为调用Action1的Action2而言,input参数是可以往被调用Action1的操作输入的参数。Output的参数是从被调用的Action1返回的值。
 25、关于datatable和Sheet例子
datatable.AddSheet("husheet") 'datatable添加一个sheetdatatable.ImportSheet "c:\test.xls","testsheet","husheet" '从外部导入一EXCEl为test.xlsDim i,RowCount '定义两个变量i=0RowCount=datatable.GetSheet("husheet").GetRowCount '设置RowCount等于51sheet中的行数。msgbox RowCountDo while i&rowcounti=i+1 '第一次进入循环,执行这句后,i=1'datatable.getsheet("51sheet").setcurrentrow(i) 这句话被我注释掉了,正确的写法应该是下面这样,分开写。datatable.getsheet("husheet")datatable.setcurrentrow(i)'执行过上面两句后,CurrentRow是第一行。tempData=DataTable.GetSheet("husheet").GetParameter("Name").Value'现在,我们调用msgbox看看下面得到的是什么值?每次循环都能得到每行的值,下次循环得到的是第二行msgbox "GetParameter-Name:"&tempData '这里弹出我们要看的值。'下面我们用另外一种方法来得到。msgbox "GetParameter-i:"&DataTable.GetSheet("husheet").GetParameter(1).Value '这里我用GetParameter(1)去得到sheet中第一列的值。loop
 文章比较长,一共三部分:
  1、连接查询例子,无参数化
  //查询收文操作,通过数据库查询记录数是否正确
  //1、输出记录数值,例如78条2、获取输出的记录数值3、连接数据库,查询记录数
  4、输出记录数值和从数据库中查询记录数值,相比较,相等则成功,不等则失败
Browser("湛江信息化登录").Page("湛江东兴石油企业有限公司办公自动化系统").Frame("mainFrame").[color=#ff00ff]OutputCheckPoint("78")[/color][color=#ff00ff]Dimmm[/color]'mm=DataTable.GlobalSheet.GetParameter("mainFrameOutput_Text_out").Value//注释,获取datatable值与DataTable("mainFrameOutput_Text_out",dtGlobalSheet)一致[color=#ff00ff]mm=DataTable("mainFrameOutput_Text_out",dtGlobalSheet)[/color]MsgBoxmmDimres,cmd,sqlSetres=createobject("adodb.recordset")Setcmd=createobject("mand")Cmd.activec<mandType=1sql="selectcount(*)fromoa_receivebumfwhereBUMFNAME[color=#ff0000]like'%收文测试%'"[/color]'sql="selectcount(*)fromoa_receivebumfwhereBUMFNAME='"&nn&"'"//注释,sql语句,等于时sql语句//sql="selectcount(*)fromoa_receivebumfwhereBUMFNAMElike'%nn%'"//like时sql语句<mandText=sqlSetres=Cmd.Execute()//msgboxres("name")MsgBoxres(0)[color=#ff00ff]IfCstr(res(0))=Cstr(mm)Then[/color]Reporter.ReportEventmicPass,"","查询成功"elseReporter.ReportEventmicfail,"test","查询失败"EndIfSetres=nothingSetcmd.ActiveConnection=nothingSetCmd=nothing
  2、登记用户,查看是否登记成功
  //登记用户,查询用户是否存在在数据库中
  1、参数化2、取参数化值3、查询语句中,赋值给查询条件
  4、从数据库中查询出用户名,与参数化中值做比较
  脚本如下:
Browser("测试登录").Page("办公自动化系统").Frame("mainFrame_2").WebEdit("addressVO.name").[color=#0000ff]SetDataTable("p_Text",dtGlobalSheet)[/color][color=#0000ff]Dimxnamexname=DataTable("p_Text",dtGlobalSheet)MsgBoxxname[/color]Dimres,cmd,sqlSetres=createobject("adodb.recordset")Setcmd=createobject("mand")Cmd.activec<mandType=1sql="selectnamefromaddress_listtwherename='[color=#0000ff]"&xname&"'"[/mandText=sqlSetres=Cmd.Execute()'msgboxres("name")MsgBoxres(0)Setres=nothingSetcmd.ActiveConnection=nothingSetCmd=nothing
  1、Datatable方法GetRowCount
  DataTable.GetSheet("Action1").GetRowCount//获取总行数
  使用如:
  CountNum=DataTable.GetSheet("Action1").GetRowCount
  2、Datatable方法SetNextRow
  DataTable.GetSheet("Action1").SetNextRow//取得下一行
  datatable.setcurrentrow(n)//取得某一行
  3、Datatable方法getcurrentrow//获得当前行数
  例如:datatable.getcurrentrow
  4、获取datatable值
  4.1DataTable("p_Text",dtLocalSheet)//取得datatable中参数名称为:p_Text的值
  4.2DataTable.GlobalSheet.GetParameter("p_Text").Value//获取参数值方法和DataTable("p_Text",dtLocalSheet)一样
  例如:xname为变量,dimxname
  xname=DataTable("p_Text",dtLocalSheet)
  xname=DataTable.GlobalSheet.GetParameter("p_Text").Value
  5、datatable.value("num")只在global形式下的一种省略形式;完整形式是:
  datatable.value("num",dtlocalsheet)
  -----向某一列的单元格赋值:
  datatable.value("column_name",dtlocalsheet)="nanjing"
  6、字符转换Cstr
  Cstr(mm)
  7、获取对象属性名称用法:
  GetRoProperty----从应用程序界面上获取对象属性(即,是脚本运行时,获取的对象动态属性值)
  例如:获取对象库中index属性值,似乎只能用GetToProperty,因为应用程序界面上对象没有该属性,只是
  QTP为识别该对象创立的描述属性;
  GetToproperty----从对象库中描述对象的属性,静态值
  GetToProperties----获取用于标识对象的属性集;对于这个集合,有count等属性方法
  8、如果弹出对话框就获取上面提示信息并与表中的信息对比,不统一证明弹出的提示出错,主要用来验证
ifbrowser("web_name").dialog("dialog_name").exist(1)then'如果不出现=falseerror_message=browser("web_name").dialog("diaglog_name").static("用户密码错误!".getRoproperty("text")iferror_message&&(datatable.value("error_info"))thenmsgbox(error_message)endifbrowser("web_name").dialog("diaglog_name").closeendif
这里总结了两点技巧:
  一是:对于dialog中,虽然提示信息对象名称是"用户密码错误",但如果信息对象名称是“该用户不存在”,不用更改会自动识别,我想主要是录制第一遍时,“用户密码错误”只是让运行时能找到这个控制,而不管它是什么内容,因为在对象仓库中,text不是决定该对象的属性
  二是:如果对于提示信息比较长的,可以用mid(error_message,n,m)取一部份特征提示信息进行验证,这样我想可以节省处理时间,又可以避免长度以及空格等字符的处理
  9、数据库检查点模块:
subdatabase_checksetcon=createobject("adodb.connection")con.open"Description=IBM_ODBC;DRIVER=SQLSSERVER=IBM;UID="&_"PWD=123456;APP=QuickTestPWSID=IBM;DATABASE=IBM_table"'access方式:con.open"DRIVER={MicrosoftAccessDriver(*.mdb)};DBQ=d:\test.mdb"'Orocle方式:con.open"DRIVER={OracleinOraHome92};SERVER=CESHI;UID=CND_TEST;PWD=CND;DBQ=CESHI;DBA=W;APA=T;EXC=F;XSM=DFEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BAM=IfAllSMTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;"setrecord=createobject("adodb.recordset")sql="select*fromibm_one_table"record.opensql,conDOif(record("ibm_table_column")="kai")then'//查找表格中有多少kainum=num+1;endifrecord.movenextloopuntilrecord.eof=truerecord.closesetrecord=nothingcon.closesetcon=nothingendsub
10、"is+*"类型function
  isarray'是否是数组
  isconnected'判断QTP是否连接到TD
  isdate'是否是合法的日期类型
  isempty'判断是否初始化
  isNull'判断是否为空值
  isNumeric'判断是否是数字型
  isobject'判断是否一个功能对象
  isready'判断设备是否准备就绪
  isRootFolder'是否是根目录
  11、for方法1,参数化时选择:dtLocalSheet
DimCountNumCountNum=DataTable.GetSheet("Action1").GetRowCountFori=0toCountNum-1----xunhuanti------DataTable.GetSheet("Action1").SetNextRow//使用SetNextRow方法Next
  12、for方法2,参数化时选择:dtLocalSheet
dimcountNumcountNum=DataTable.GetSheet("Action1").GetRowCountFori=1tocountNumDataTable.GetSheet("Action1").SetCurrentRow(i)//使用SetCurrentRow(i)方法―――ddd―――next
  13、while方法1,参数化时选择:dtLocalSheet
DimCountNum,ii=1CountNum=DataTable.GetSheet("Action1").GetRowCountWhilei&=CountNum------xuhuanti---DataTable.GetSheet("Action1").SetNextRowi=i+1Wend
  14、while方法2,参数化时选择:dtLocalSheet
DimCountNum,ii=1CountNum=DataTable.GetSheet("Action1").GetRowCountWhilei&=CountNumDataTable.GetSheet("Action1").SetCurrentRow(i)----xuhuanti---i=i+1Wend
  白盒体现了几个概念,第一是知道程序里面的实现逻辑;第二是进行单元测试,这些单元可以是一个方法,一个类。介入的时机程序员开发完一个方法或者一个类的时候,往往需要检测我们的代码是否排除错误并按照预期运行。这个时候就需要进行白盒单元测试。
  的内容根据代码里面的实现逻辑,测试代码是否对非法输入进行控制,测试代码是否按照预期的进行了工作。在jtest工具中,它认为重点在于输入数据,尽可能在所有的路径上运行程序,并尽可能的压垮程序。如果程序能够经受考验,那么认为这个关是通过的。至于代码是否按照需求定义那样运行,在这个阶段并不关心,而是在阶段。
  目前很多实践中,并没有严格区分单元的白盒和黑盒测试。
  白盒单元测试,是尽量的保证所有的路径都覆盖,同时包括合法的和非法的。但是并不关心实现逻辑是否按照需求预期的逻辑进行。所以,基于这种思想,可以完全实现用例的自动化生成、自动化执行。预期输入、预期输出都可以通过判断程序内部逻辑来生成,所以完全可以自动化。
  黑盒单元测试,是尽量的保证所有的路径都覆盖,同时重点关注输出的预期是按照需求预期来输出的。所以,数据驱动测试在这里可以应用,根据输入输出数据用来生成测试用例。测试用例设计工具测试用例,说白了就是调用被测的代码,检查结果是否正确,程序是否崩溃。
  Xunit框架可以很方便的实现测试用例的设计和执行。
  用例的生成,可以手工开发,也可以使用自动化工具自动生成。
  衡量测试用例的质量:
  测试用例是否已经充分了,我们往往是通过覆盖率指标来统计的,理想的情况下是达到100%。现在也很多统计的自动化工具可以嵌入到开发工具,或者运行测试用例中后台收集。(
  经过一段时间白盒静态扫描,目前已经扫了两个包,发现了100多个bug。
  值得欣慰的是,自己开发的工具也扫描出了一些bug,这段时间熬夜的开发没有白费。总结一下,主要问题的分类。随着这些经验的积累,可以作为日后人工审查和开发的。
  经典案例:
单例action里面包含有属性并且允许读写
public class XxxAction extends Action{private StringBuffer vo = new StringBuffer();public void setVo(StringBuffer invo){vo=}public StringBuffer getVo(){return this.}.................
单例action里面包含有属性进行读写会引起数据错乱
Badpractice
字符串比较用==或者=
if(dao.getADTerminalByServiceCode(serviceCode).getServicecode() == serviceCode){
String类型的比较不要用==或者!=,应该用equal方法就上面的代码永远都为false,因为==表示在同一常量区才会为true
字符串分割正则表达式使用不对
String[] area = areaSize.split("*");
正则表达式使用不对,会一直抛出异常应该使用转义字符
字符串比较的空点异常
vo.getVirtualFlag().equals("NO")
建议修改为"NO".equals(vo.getVirtualFlag())
对象比较不对
if (this == obj) {}
对象必须重再了hashcode方法,比较才有意义
InputStream input = new BufferedInputStream(file.getInputStream());
流没有关闭会造成文件句柄资源耗尽,那么就无法再打开新的流
connection statement rs等没关闭
try{.....} catch(..){}finallyif(rs!=null){rs.close();}if(stmt!=null){stmt.close();}if(conn!=null){conn.close();}}
在rs有异常会关闭不了statement conn在statement有异常会关闭不了conn
Performance
循环中创建字符串
String children = "" ;ClassSpecVO[] t = cs.getTree();if ( t == null )return "";for ( int i = 0 ; i & t. i ++ ){if ( children.length() != 0 )children += ",";children += constructJsonString(t[i]);}
children会循环创建对象,必须改为StringBuffer对象。用append进行连接字符串
不应该创建字符串对象
String vsplist=new String();
在编写循环结构的程序很多程序会犯一个错误,就是在循环判断体中做重复计算。
例如:for(int i = 0;i &list. i ++) {
&&&&&&&&&&…
应替换为:
for(int i = 0,int len = list.size();i & i ++) {
&&&&&&&&&&&…
该检测器详细介绍:
PERFORMANCE_LOOP_CALCULATE
Verson:<st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="30" Month="12" Year=".0
Author:&River.liu
Email :&&.cn
例如:for(int i = 0;i & list. i ++) {
&&&&&&&&&&&…
应替换为:
for(int i = 0,int len = list.size();i & i ++) {
&&&&&&&&&&&…
preDirectCount个指令,判断是否存在includeMethordsDirect指定的指令,同时判断是否调用了includeMethords指定的方法,如果存在就表示存在循环计算。
pluginConfig.propertiesjarjar
PERFORMANCE_LOOP_CALCULATE.isOpen=true
includeMethords
在循环中进行计算的方法的名字,比如list.size()为szie
每个方法名以逗号分隔
PERFORMANCE_LOOP_CALCULATE.includeMethords=size
1.1.1.5.3preDirectCount
preDirectCount个指令,
也就是循环指令的前preDirectCount指令中调用了指定的方法就算匹配了
PERFORMANCE_LOOP_CALCULATE.preDirectCount=3
1.1.1.5.4includeMethordsDirect
循环指令的前preDirectCount个指令中调用的指令的列表
# all methord direct:INVOKEVIRTUAL = 182;INVOKESPECIAL = 183;INVOKESTATIC = 184;INVOKEINTERFACE = 185;
PERFORMANCE_LOOP_CALCULATE.includeMethordsDirect=182,185
1、可能会把循环体里面的计算当作条件判断的计算
如果preDirectCount参数的值过大
可能会把aa.size();当作循环计算
&for(int i = 0,int len = list.size();i & i ++) {
&&&&&&&&&&&aa.size();
Mercury QuickTest Professional&#8482;是一款先进的自动化测试解决方案,用于创建功能和回归测试。它自动捕获、验证和重放用户的交互行为。
Mercury QuickTest Professional为每一个重要软件应用和环境提供功能和回归测试自动化的行业最佳解决方案。
QuickTest Professional是新一代自动化测试解决方案,采用了关键词驱动(Keyword-Driven)测试的理念,能完全简化测试的创建和维护。QuickTest关键词驱动方式独有之处在于,测试自动化专家可以通过一个整合的脚本和纠错环境,拥有对基础测试脚本和对象属性的完全访问权限,这些脚本和纠错环境与关键词视图(Keyword View)可以互为同步。
QuickTest Professional同时满足了技术型和非技术型用户的需求,让各个公司有能力部署更高质量的应用,同时部署的速度更快,费用更低,风险也更小。QuickTest Professional和我们新的测试自动化系统Mercury Business Process Testing&#8482;的紧密结合,可以将非技术型的业务专家(SME, Subject-Matter Experts)引入质量流程,这一意义重大的引入可以将IT和业务更好地融合,最终建立起更出色的应用。
有了该产品,您的QA机构可以获取多方面的优势:
&#61599;用最少的培训赋予整个小组创建成熟测试方案的能力。
&#61599;确保跨所有环境、数据包和业务流程的正确功能点。
&#61599;为开发人员全面记录和复制缺陷,使他们能更快地修复缺陷,满足最后上线期限。
&#61599;对不断变化的应用和环境展开便捷的回归测试。
&#61599;成为帮助整个机构实现高质量产品和服务、提高总收入和收益率的关键角色。
QuickTest Professional是如何工作的
QuickTest Professional易于操作,即使是初级的测试人员也能在短时间内对其驾轻就熟。您可以使用无需脚本的关键词视图来表现测试的每个步骤,仅由此就可创建一个测试。您还可以通过QuickTest Professional所集成的录制能力来捕获测试步骤。该产品用简单的英语以文档形式记录每个步骤,并通过活动屏幕将文档与一个集成截屏相结合。传统的脚本记录工具所生产的脚本不易修改,与此不同的是,QuickTest Professional的关键词驱动方式能让您便捷地插入、修改、数据驱动(data-drive)和移除测试步骤。
QuickTest Professional可以自动引入检查点来验证应用的属性和功能点,比如确认输出量或检查链接的有效性。在关键词视图的每一步骤中,活动屏幕可显示被测应用在该步骤中的确切状态。您还可以为任意对象加入几种检查点,仅仅在活动屏幕中点击该对象,就可以验证该组件行为是否达到了期望值。
然后您可以将测试数据输入数据表(Data Table),它拥有和Excel同样完善的功能特性,是一个集成的电子数据表格。您可以使用数据集并创建多种重复测试,无需编程就可以扩展测试案例的覆盖面。数据可以通过键入的方式输入或从、数据表格或文本文档中导出。
高级测试人员可以在专家视图(Expert View)中查看和修改他们的测试,在专家视图中显示了由QuickTest Professional自动生成的基于行业标准的基本VBscrīpt语言。在专家视图中所做的任何改动将自动与关键词视图同步。
一旦测试人员运行了一个脚本,TestFusion报告将显示测试运行各方面的信息,包括:高水平的结果纵览;一个可扩展的测试脚本树状视图(Tree View),其明确指出了应用错误的发生位置;被使用的测试数据;每个步骤的应用截屏,其中并标明了所有的差异;以及通过或未通过每个检查点的详细解释。您可以将TestFusion报告和QuickTest Professional结合,从而与整个QA和开发小组分享这些报告。
QuickTest Professional处理一些应用的新版本问题。当一个被测应用发生变化时,比如把一个”Login”按钮被改名为”Sign in”,您可以在共享对象容器(Shared Object Repository)中做一次更新,接着此次更新将扩展到所有涉及这个对象的脚本。您可以将测试脚本公布给Mercury Quality Management,使其它的QA小组成员也可以使用您的测试脚本,从而减少了重复工作。
通过与Business Process Testing的整合,在一个基于Web的系统中,QuickTest Professional被用于实现自动化操作,使非技术型用户可以便捷地在一个完全的无脚本环境中也能够建立起测试。
QuickTest Professional支持多种企业环境的,包括Windows、Web、.NET、 Java/J2EE、SAP、Siebel、Oracle、PeopleSoft、Visual Basic、ActiveX、Mainframe. terminal emulators和Web services。
Mercury功能测试
那些在Mercury WinRunner&测试工具上投入大量资金,并想转入Mercury QuickTest Professional&#8482;的用户,可以使用Mercury Functional Testing&#8482;来实现这种转变。Mercury Functional Testing将QuickTest Professional和结合成一种集成产品,它不仅可以使用WinRunner脚本,也可以使用QuickTest Professional脚本,使测试资源得到极大地利用。质量工程师可以使用Mercury Functional Testing来创建“复合脚本”测试,这些脚本是在WinRunner和QuickTest Professional中建立的。Mercury Functional Testing是WinRunner和QuickTest Professional的集成,产品间可以相互调用脚本,测试结果可以在一个共有的报告界面上呈现。
Mercury质量中心的组成部分之一
Mercury QuickTest Professional是Mercury质量中心(Mercury Quality Center&#8482;)的组成部分之一,Mercury质量中心集成了一整套软件、服务和最佳实践,用于自动化关键质量活动,包括需求管理、、缺陷管理、功能测试和业务流程测试。
特点和优势
具有行业领先的便于使用的特性,以及支持提前配置环境的功能,确保了快速的投资回报。
可独立运行,也可以同Mercury Business Process Testing和Mercury质量中心集成。
引进了QuickTest Professional 8.0中新一代的“零配置”关键词驱动,从而实现了快速建立测试、测试脚本更易维护,和更强大的数据驱动能力。
使用独特智能对象识别(Unique Smart Object Recognition)来发现对象,即使对象创建不断在改变,但仍可保证无监控方式脚本执行的可靠性。
恢复管理器(Recovery Manager)可处理不可预知的应用意外事件,实现24x7的不间断测试,赶上测试项目的最后期限。
自动文档技术把测试文档的建立与测试脚本的建立同步。
通过集成的数据表,可数据驱动任意对象、方式、检查点和输出值。
为QA工程师提供全面的集成开发环境。
通过使用QuickTest Professional和WinRunner集成的TSL资源,使您在Mercury WinRunner测试脚本上的投资得以保值。
TestFusion报告可快速隔离和诊断缺陷。
通过完善检查点,实现应用的全面验证。
是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner 能够对整个企业架构进行测试。通过使用LoadRunner ,企业能最大限度地缩短测试时间,优化性能和加速应用系统的发布周期。
目前企业的网络应用环境都必须支持大量用户,网络体系架构中含各类应用环境且由不同供应商提供软件和硬件产品。难以预知的用户负载和愈来愈复杂的应用环境使公司时时担心会发生用户响应速度过慢,系统崩溃等问题。这些都不可避免地导致公司收益的损失。Mercury Interactive 的 LoadRunner 能让企业保护自己的收入来源,无需购置额外硬件而最大限度地利用现有的IT 资源,并确保终端用户在应用系统的各个环节中对其测试应用的质量,可靠性和可扩展性都有良好的评价。
LoadRunner 是一种适用于各种体系架构的自动负载测试工具,它能预测系统行为并优化系统性能。LoadRunner 的测试对象是整个企业的系统,它通过模拟实际用户的操作行为和实行实时性能监测,来帮助您更快的查找和发现问题。此外,LoadRunner 能支持广范的协议和技术,为您的特殊环境提供特殊的解决方案。
轻松创建虚拟用户
使用LoadRunner 的Virtual User Generator,您能很简便地创立起系统负载。该引擎能够生成虚拟用户,以虚拟用户的方式模拟真实用户的业务操作行为。它先记录下业务流程(如下订单或机票预定),然后将其转化为测试脚本。利用虚拟用户,您可以在Windows ,UNIX 或 机器上同时产生成千上万个用户访问。所以LoadRunner能极大的减少负载测试所需的硬件和人力资源。另外,LoadRunner 的TurboLoad 专利技术能。
提供很高的适应性。TurboLoad 使您可以产生每天几十万名在线用户和数以百万计的点击数的负载。
用Virtual User Generator 建立测试脚本后,您可以对其进行参数化操作,这一操作能让您利用几套不同的实际发生数据来测试您的应用程序,从而反映出本系统的负载能力。以一个订单输入过程为例,参数化操作可将记录中的固定数据,如订单号和客户名称,由可变值来代替。在这些变量内随意输入可能的订单号和客户名,来匹配多个实际用户的操作行为。
LoadRunner 通过它的Data Wizard 来自动实现其测试数据的参数化。Data Wizard 直接连于服务器,从中您可以获取所需的数据(如定单号和用户名)并直接将其输入到测试脚本。这样避免了人工处理数据的需要,Data Wizard 为您节省了大量的时间。
为了进一步确定您的Virtual user 能够模拟真实用户,您可利用LoadRunner 控制某些行为特性。例如,只需要点击一下鼠标,您就能轻易控制交易的数量,交易频率,用户的思考时间和连接速度等。
创建真实的负载
Virtual users 建立起后,您需要设定您的负载方案,业务流程组合和虚拟用户数量。用LoadRunner 的Controller,您能很快组织起多用户的测试方案。Controller 的Rendezvous 功能提供一个互动的环境,在其中您既能建立起持续且循环的负载,又能管理和驱动负载测试方案。
而且,您可以利用它的日程计划服务来定义用户在什么时候访问系统以产生负载。这样,您就能将测试过程自动化。同样您还可以用Controller 来限定您的负载方案,在这个方案中所有的用户同时执行一个动作---如登陆到一个库存应用程序----来模拟峰值负载的情况。另外,您还能监测系统架构中各个组件的性能---- 包括服务器,数据库,网络设备等----来帮助客户决定系统的配置。
LoadRunner 通过它的AutoLoad 技术,为您提供更多的测试灵活性。使用AutoLoad ,您可以根据目前的用户人数事先设定测试目标,优化测试流程。例如,您的目标可以是确定您的应用系统承受的每秒点击数或每秒的交易量。
定位性能问题
LoadRunner 内含集成的实时监测器,在负载测试过程的任何时候,您都可以观察到应用系统的运行性能。这些性能监测器为您实时显示交易性能数据(如响应时间)和其它系统组件包括application server, web server,网路设备和数据库等的实时性能。这样,您就可以在测试过程中从客户和服务器的双方面评估这些系统组件的运行性能,从而更快地发现问题。
再者,利用LoadRunner 的ContentCheck TM ,您可以判断负载下的应用程序功能正常与否。ContentCheck 在Virtual users 运行时,检测应用程序的网络数据包内容,从中确定是否有错误内容传送出去。它的实时浏览器帮助您从终端用户角度观察程序性能状况。
分析结果以精确定位问题所在
一旦测试完毕后,LoadRunner 收集汇总所有的测试数据,并为您提供高级的分析和报告工具,以便迅速查找到性能问题并追溯原由。使用LoadRunner 的Web 交易细节监测器,您可以了解到将所有的图象、框架和文本下载到每一网页上所需的时间。例如,这个交易细节分析机制能
够分析是否因为一个大尺寸的图形文件或是第三方的数据组件造成应用系统运行速度减慢。另外,Web 交易细节监测器分解用于客户端、网络和服务器上端到端的反应时间,便于确认问题,定位查找真正出错的组件。例如,您可以将网络延时进行分解,以判断DNS 解析时间,连接服务器或SSL 认证所花费的时间。通过使用LoadRunner 的分析工具,您能很快地查找到出错的位置和原因并作出相应的调整。
重复测试保证系统发布的高性能
负载测试是一个重复过程。每次处理完一个出错情况,您都需要对您的应用程序在相同的方案下,再进行一次负载测试。以此检验您所做的修正是否改善了运行性能。
Enterprise Java Beans的测试
LoadRunner 完全支持EJB 的负载测试。这些基于Java 的组件运行在应用服务器上,提供广泛的应用服务。通过测试这些组件,您可以在应用程序开发的早期就确认并解决可能产生的问题。
利用LoadRunner, 您可以很方便地了解系统的性能。 它的Controller 允许您重复执行与出错修改前相同的测试方案。它的基于HTML 的报告为您提供一个比较性能结果所需的基准,以此衡量在一段时间内,有多大程度的改进并确保应用成功。由于这些报告是基于HTML 的文本,您可以将其公布于您公司的内部网上,便于随时查阅。
最大化投资回报
所有Mercury Interactive 的产品和服务都是集成设计的, 能完全相容地一起运作。由于它们具有相同的核心技术,来自于LoadRunner和ActiveTest TM 的测试脚本,在Mercury Interactive 的负载测试服务项目中,可以被重复用于性能监测。借助Mercury Interactive的监测功能--Topaz TM 和ActiveWatch TM ,测试脚本可重复使用从而平衡投资收益。更重要的是,您能为测试的前期布署和生产系统的监测提供一个完整的应用性能管理解决方案。
支持无线应用协议
随着无线设备数量和种类的增多,您的测试计划需要同时满足传统的基于浏览器的用户和无线互联网设备,如手机和PDA。LoadRunner 支持2 项最广泛使用的协议:WAP和I-mode。此外,通过负载测试系统整体架构,LoadRunner 能让您只需要通过记录一次脚本,就可完全检测上述这些无线互联网系统。
支持Media Stream应用
LoadRunner 还能支持Media Stream应用。为了保证终端用户得到良好的操作体验和高质量Media Stream,您需要检测您的Media Stream应用程序。使用LoadRunner ,您可以记录和重放任何流行的多媒体数据流格式来诊断系统的性能问题,查找原由,分析数据的质量。
完整的企业应用环境的支持。
LoadRunner 支持广泛的协议,可以测试各种IT 基础架构。
一、Web基础知识(HTML、XML、CSS基础语法):1、HTML/XML规范中,元素结束标签是以尖括号括起来,并以/还是\开头再加上元素名称?即body的结束标签是&/body&还是&\body&2、符合XHTML规范的文档一定符合XML规范吗?XSL和HTML的文档呢?3、XML规范中,第一行必须是&?xml… 还是&!xml… 开头?4、一个HTML文档必须包含三个元素,它们是head、body和哪个?5、HTML中文档内联注释应该是以&!-开头还是&!--或者&?-,又以什么结尾?6、Javascrīpt脚本必须写在什么标签之内。7、FireFox浏览器是否支持VBscrīpt脚本?8、我们现在使用的IE的版本一般是多少,IE的英文全称是什么?9、CSS规范中,每一条样式的结束符是;(分号)还是: (冒号) ?样式名与样式值之间的分隔符是:(冒号)还是=(等号) ?10、CSS规范中,.(句点)后面跟一个名称代表什么含义?#(井号)后面跟一个名称代表什么含义?如果要对一个元素设置CSS样式,应将CSS样式写在它的什么属性内?&&1、&/body&2、XHTML和XSL都必然符合XML规范,HTML不符合。3、&?xml4、html5、&!--和--&6、&scrīpt&7、不支持8、Internet Explorer 6.0 SP2/5.5/5.0/6.0 SP1/7.0 beta2/7.0 beta3都算对。9、;,:和=都可以10、.后面跟个名称表示文档中所有class属性值包含这个名称的应用其后样式,#后面跟个名称表示文档中ID为此名称的元素应用其后样式。
二、Web进阶知识(javascrīpt、DOM、CSS进阶):1、试图说明setTimeout和setInterval的不同。2、请指出body是什么元素的属性,alert是什么元素的方法。3、onblur事件在什么时机被触发?onmouseover事件当鼠标在元素上移动时是仅触发一次还是连续触发?那么onmouseout呢?4、在CSS中a:hover、a:link各表示什么意思?a与A是否有不同?XHTML规范要求所有标签名称必须大写还是小写?属性名称呢?5、在&form&中的元素不能在脚本中直接用元素ID来访问,这个时候我们一般用document的一个方法来获取这个元素。这个方法是:getElementByID、getElementById、getNodeById、getNodeByID、GetNodeById。6、由于class是javascrīpt中的保留字,所以元素的class属性在javascrīpt中没有用class这个名称,那么是用什么名称来代替的?7、如何简单的使一个变量的值为NaN?8、试说明parent和opener属性各代表什么?9、指出border-style样式在javascrīpt应如何访问?10、指出div与span的不同。&1、setTimeout在经过指定时间后执行一次,setInterval则是经过指定时间就执行一次。2、window.document、window3、onblur在控件失去焦点时触发,onmouseover是连续触发,onmouseout仅触发一次。4、a:hover表示当鼠标放在连接上时,连接该使用什么样式,a:link表示正常情况下连接该使用什么样式,在现行的CSS标准中不区分大小写,所以a与A没有不同。XHTML要求所有的标签名和属性名都必须小写。5、getElementById6、className7、a = 1/0;8、parent代表父框架,opener代表打开这个窗口的窗口9、element.style.borderStyle10、默认的display样式不同,div是block而span是
  经过一段时间的准备,结合平时的开发经验,已经开发出了一系列的自定义检测器。现在需要规划好静态检查的可操作方案。
  一、初步积累期
  静态扫描工具由于会出现误报,以及自行开发的检测插件也是需要经过一定时间的考验。同时,也需要积累一些常见的问题,共享给开发以免再次犯同样的错误。所以,需要一个初步积累的阶段。
  1)手工分析扫描结果
  取得class和对应的源代码,可以先挑一些包,使用Findbugs的GUI工具进行扫描。
  对扫描的结果我们先进行分析。
  2)每天发送分析报告给开发
  报告的特点,必须是转换我们自己的语言,指明会导致的问题,代码的具体位置。
  同时让开发每天对报告进行反馈。
  3)积累bug库
  对于每天扫描出的问题,整理成文档,可以作为原始积累。这些积累,可以作为开发以后的文档,乃至日后人工代码评审的文档。
  二、正式使用期
  随着大家都对扫描工具对发现问题的价值的认可,我们会很迫切的要求需要贯彻到我们日常的中。
  1)开发阶段
  把插件安装到开发的eclipse环境中,让开发提交代码之前就对代码进行静态扫描。
  让bug消灭在萌芽阶段。
  2)构建阶段
  构建完成之后,我们使用ANT增加一个扫描任务。
  扫描出结构之后,形成报告,并自动发送到开发、测试等人员中。
  让漏网之鱼无处可逃。
  3)完善阶段
  我们需要不断的开发我们的检测器来构筑更加强调的扫描体系。
  可以从开发、以及资料找到容易出现问题的代码,然后开发成检测器。
  构筑更加强大、坚固的质量堡垒。
序·本人的第一份面经,就献给了百分点。。
下午突然接到百分点信息科技的电话,我只隐约记得这个公司,但是对所应聘的测试工作已完全没有印象。whatever,随便聊聊。
打电话的是个GG(后来感觉应该是个技术人员),上来简单的闲聊几句,就直接切入到测试工作的问题中来。
首先,大概问问现在工作的情况,怎么进行软件测试。我blabla说了一通测试的基本流程。然后给了一个例子,就一个自动贩卖机进行测试。当时我还没怎么缓过神儿来,一直以为只是单纯的HR面。。突然意识到是来真的了。忙理了下思路,可还是有点乱。先是回答大概要从几个方面,如UI方面,功能测试方面,性能、安全等等。然后分别举例说明。但说了半天,大部分还是围绕在功能测试方面(这就是所谓的“工作经验”吧。。彻底被禁锢了)。其间,电话那头没啥声音,就算我中间停顿思考,那边也很安静,让我觉得有点冷场。。。也看不到对方的反应。最后停顿了好久,想不出来就实话实说,对方这才有所反应,提醒我可以考虑下除了功能性测试的其他方面的测试。但我也没说多少。。只能和人承认,自己平时做多了功能测试,其他方面的测试的考虑的不够多,那人称理解,也有些许的无奈吧。然后问了问平时测试使用的工具,会不会白盒测试,有没有自己写过代码,会不会LR/QTP。。哎,有点苍白,基本回答不会、没有。。。自己要加强的地方真的太多了。
最后问了下期望的薪资。。这个我回答的太实诚了-_-!
大概就是这些问题,最后面试GG说会大家讨论一下,再决定下次面试的安排。。自己感觉不太好,也就这样了吧。。。
本次面试总结:
1. 测试思维太过局限,平时要注意多留意多学习多思考,不能仅仅考虑功能测试;2. 简历上东西要烂熟于心,对现在的工作做个总结,包括学到的东西,受到的启发等;3. 不能总是用工作作为借口,自己有空还是要继续学习软件测试的东西;4. 回答问题还是会紧张,本来优势就不太大,再一紧张连正常水平都不能发挥了;
不过总算是等到了第一个面试机会,希望调整好心态,加强专业知识水平,以后发挥的更好!
后记·自动贩卖机的测试用例(简单的思路)
1. 硬件方面的测试如产品的材质,适应的温度、适度,电源电压。硬件的异常处理,比如突然停电会怎样。。
2. 软件方面的测试易用性测试:产品的外观有无缺陷,操作、说明各种指示是否清晰,不会让user产生歧义;功能性测试:是否可以正确识别纸币,纸币的真伪、新旧程度;是否可以正常的输入钱币输出货物及找零,购买一个或多个(不同品种);没有输入,user却要输出;欲购的商品没有了,机器怎样处理;。。性能测试:一次购买很多个商品;多个user连续购买。。
随时补充。。
算算正式入职已经近两个月了,加上实习的10个月,可以说是干了1年的手工测试工作。
人嘛,得有点危机意识。工作的东西能学到什么呢?还是靠自己。咱不是说一直就在珠海待下去了,咱不能现在就享受安逸啊。所以得有目标。
近期目标——
学习QTP,每晚坚持回来看QTP use guide & tutorial,争取这下半年搞定(这时间是不是有点长??没办法,看电子版的书俺就是龟速。。)
远期目标——
希望通过两到三年的测试工作加之自己的自学努力,能为将来的跳槽打造一个好的条件,尽全力提高自己的竞争力!
每天一小步,人生一大步}

我要回帖

更多关于 java 相对路径 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信