ITPub博客

首页 > 应用开发 > IT综合 > WR 问题集

WR 问题集

原创 IT综合 作者:mandy23 时间:2007-11-23 17:19:38 0 删除 编辑

1)因为wr有些控件不认识,例如grid,对于一些页面上的数据我们不能通过工具检测,我想可不可以这样做?
写一个dll,实现拷屏功能,并保存起来,dll的传入参数是这个图存放路径和图名称。

然后在wr中当要检查页面上数据是否正确的时候,就调用这个dll,先把屏幕拷下来,存放在一个地方,测试完成后,再看这个图查看数据是否正确。
image checkpoint要先录制正确的图,才能做比较。我这样不需要先知道正确的图是什么样子,只需等脚本回放完后,自己再去检查拷屏的图中的数据是否正确。

[@more@]

不知道那位高手能写一个能实现拷屏的dll文件。

从CSDN上找了段代码,写了个简单的DLL,看看符不符合你的要求:
DLL export:
extern "C" __declspec(dllexport) BOOL CopyScreen(const char* dir, const char* name);
导出函数是这样定义的(就这一个)
需要传入两个参数:dir,就是目录,如"C:",name,如“wr",文件名,默认存成bmp格式,不能自己加后缀名,调用后就会复制当前屏幕内容(整个屏幕的),存成:C:wr.bmp
DLL开发环境:VC6.0 + WIN2000EN

使用步骤:
1、把这个DLL复制到系统目录下,或者在系统能找到的目录,比如winntsystem32目录下
在WR中这样使用:
extern int CopyScreen(in string, in string);
load_dll("CopyScrDll.dll");
CopyScreen("C:", "wr");
unload_dll("CopyScrDll.dll");
这样就可以了
已保存CopyScrDll.dll


2)WinRunner如何处理excel?
答:其实解决方法有很多,这里列举两种。
一.利用其他语言特性开发出dll提供给winrunner使用(vb,vc,delphi等)
二.在其他环境中实现,用winrunner调用
第一种我在这里不举例子了,第二种我利用vbs往excel中赋值给大家提供一种思路,代码如下:

'vbs中的代码
Dim ExcelApp
Dim itemX
if WScript.Arguments.Count < 2 then
r = msgbox("Requires 2 arguments", 48, "change_sheet")
else
dim fso
set fso = createobject("scripting.filesystemobject")
xlBook = fso.GetAbsolutePathName(WScript.Arguments(0))
xlSheet = WScript.Arguments(1)
set fso = Nothing
Set ExcelApp = CreateObject("Excel.Application")
ExcelApp.Workbooks.Open(xlBook)
Set itemX = ExcelApp.ActiveWorkbook.Worksheets.Item(xlSheet)
itemX.Activate

excelApp.ActiveWorkbook.Worksheets(xlSheet).Range("A1").Select
excelapp.ActiveCell.FormulaR1C1 = "1"
excelApp.ActiveWorkbook.Worksheets(xlSheet).Range("B1").Select
excelapp.ActiveCell.FormulaR1C1 = "2"
excelApp.ActiveWorkbook.Worksheets(xlSheet).Range("c1").Select
excelapp.ActiveCell.FormulaR1C1 = "3"

ExcelApp.ActiveWorkbook.Save()
ExcelApp.ActiveWorkbook.Close(1)
ExcelApp.Quit()

Set itemX = Nothing
Set ExcelApp = Nothing

end if

winrunner中的调用代码:
dos_system("wscript "C:excel_sheet.vbs" "C:SheetBook.xls" "Sheet2"");

3)在WinRunner中如何实现得到transaction时间?
答:一般情况下transaction的时间只能在最后结果中得到,如何在脚本得到这个时间呢,下边的代码可以

帮助你:
public transactions[];
function start_my_transaction(in transaction_name)
{
transactions[transaction_name] = get_time();
tl_step("Start transaction: "" & transaction_name & """,PASS,"Timestamp: " &

transactions[transaction_name]);
return (transactions[transaction_name]);
}
function end_my_transaction(in transaction_name)
{
auto end_time = get_time();
auto rc;
if(transactions[transaction_name] == "")
{
tl_step("End transaction: "" & transaction_name & """,FAIL,"Transaction was

never started.");
rc = -1;
}
else
tl_step("End transaction: "" & transaction_name & """,PASS,"Elapsed Time: "

& (rc = end_time - transactions[transaction_name]));
delete transactions[transaction_name];
return rc;
}

start_my_transaction("my_transaction");
wait(2);
rc = end_my_transaction("my_transaction");
pause("Elapsed time = " & rc);

4)一、通配符
![内容].* (空格)
如: !Form.* ,表示为“Form”+任何字符串
!.* Form,表示为任何字符串+“Form”

二、文件路径

TSL 语言中,文件路径要用“”表示


三、控件识别问题
??有时录制脚本时发现有的控件识别不了(比如WEB页面中的标准控件识别不了),
可能由以下情况造成:
1. 启动WinRunner时没有加载相应的Addin;
2. WinRunner在应用程序之后启动;

四、建立数据库检查点
有的人发现建立数据库检查点时不能建立新的查询,觉得很奇怪,这是因为系统中没有安装Microsoft Query
的缘故。
??Office 2000 中有Microsoft Query的安装,不过缺省是不安装Microsoft Query的,只要运行Office 2000
的安装程序,在更改安装中将Microsoft Query设为从本机运行,确定安装即可。


五、自动加载GUI Map文件

static test_Path = getvar("testname"); # 得到测试用例的路径
static guifile_path = test_Path & "GUI_File.gui";
# GUI Map文件名,建议将GUI Map文件保存在测试脚本的目录中,如果不是,
将这里改为相应的绝对路径或相对路径

GUI_unload_all(); # 清空已经加载的GUI Map
GUI_load(guifile_path); # 加载GUI Map文件

report_msg(test_Path); # 报告路径,调试脚本时用,正式执行可以不要

5)如何利用winruner在系统中建一个txt文件,并写入内容创建文件 c:filename.txt
file_open("C:filename.txt",FO_MODE_APPEND);
这两个参数 FO_MODE_APPEND and FO_MODE_WRITE 都可以

例子
savemyFile = "C:filename.txt";
rc = file_open(myFile, FO_MODE_WRITE);
if(rc == E_OK)
{
file_printf(myFile, "%srn", text);
file_close(myFile);
}
else
{
report_msg("file_open failed with error " & rc);
}

6)

一般windows控件经过加密处理,在控件的消息中加入了对WM_GETTEXT进行处理,所以一般想得到密码框的文本都是加密的字符串!java可能处理方式不同
这里是个delphi对密码框处理WM_GETTEXT 消息的代码,你可以从中看到其中的奥秘!

下边是得到password密码框密码的源代码!你可以通过这段delphi代码得到你要的得到的password框的代码
// 显示鼠标当前所在的文本框内容
function ShowWindowText()tring;
var
pPoint:TPoint;
WinTexttring;
mText:PChar;
hWnd:Integer;
begin
GetCursorPos(pPoint);
SetLength(WinText,256);
hWnd:=WindowFromPoint(pPoint);
GetWindowText(hWND,PChar(WinText),256);
SetLength(WinText,StrLen(PChar(WinText)));
result:=WinText;
end;

而windows有的密码框控件对这个消息进行了处理,下边是一个控件的代码:
unit uCEdit;

interface

uses Windows,StdCtrls,Messages,Classes;

TYPE
TCEdit=class(TEdit)
private
bEnable:boolean; // 允许使用
procedure WndProc(var Msg: TMessage);override;
public
constructor Create(AOwner: TComponent); override;

function MyGetText()tring;
published

end;

procedure Register;

implementation

{ CEdit }

//注册控件
procedure Register;
begin
RegisterComponents('Additional', [TCEdit]);
end;

constructor TCEdit.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
// 禁止使用
bEnable:=false;
end;

function TCEdit.MyGetText: string;
begin
// 程序本身还是用允许的
bEnable:=true;

result:=Text;
end;

procedure TCEdit.WndProc(var Msg: TMessage);
begin
if (Msg.Msg=WM_GETTEXT) or (Msg.Msg=EM_GETLINE) then
begin
if bEnable then
begin
bEnable:=false;
inherited;
end;
end
else inherited;
end;

end.

所以你遇到这样的控件你是很难得到他的password的!其实winrunner获得属性,得到密码的情况类似!

对于java的情况我没有做实验,所以无法得出具体的情况!不过从自动化实现上来说我觉得得到一个密码框的密码,我觉得这需要考虑!比如java,我就遇到过此情况,加了java add-in后显示的就是实际输入文本.

7)

Winrunner中写文件实现每一行回车操作。
在Winrunner中写文件可以在循环中写下面的语句,就可以实现每一行都回车了!希望可以对大家有帮助,这是我试了好多遍才实现的。
file_printf("c:client.txt","%s "&(line)&"n",i);

8)

A.分解TestCase  
在大型程序测试中,往往有很多任务是可以分开来Record。同时,如果录制的代码过长的,进行调试是很麻烦的事情,此外如果今后某一部分的程序进行了修改的话,修改和重新录制的工作也是非常痛苦的一件使用。因此我们可以将一个TestCase 进行分解,分解TestCase 可以采用以下几种方式
  1、将任务分段,比如Log、Logout、公共窗口的打开、关闭
  2、错误处理的分类,比如将某一输入项目的各中错误输入分开录制
  3、公共界面的操作函数化统一处理,这种方式主要可以象移动BOSS 的业务受理等不同窗口使用同一子界面的情况,如DELPHI/C++ Builder 中的Frame。
 将不同任务(TestCASE)的分解之后,我们可以使用call 函数及自定义函数机制来调用不同的子Script、函数来完成一个的TestCase
B.通过随机组合实现大规模路径覆盖
  有时候我们需要将一组数据随机组合来进行大量数据测试,如填写某些表单。那么我们有两种办法:一是使用外边工具随机生成大量数据,也可用使用先将各个数据按测试要求生成一小组数据,然后使用rand 方法随机抽取数据来测试伪代码如下
  data a[];
  date b[];
  for (i=0;i<要测试的次数;i++){
                 ca=a[rand()]
                 cb=b[rand()]
                 dosomething;
  }
  使用这种代码的好处是随意调整测试力度,缺点是数据单一,不像外边工具一样生产的数据的多样化。如果想根据数据分段标准动态产生不同数据,应该使用其他编程工具来生产而不应采用这种办法。
C.动态修改chk 文件实行参数化的动态Check
  有时候我们知道在测试过程中的某些数据是动态生产的,比如某些按顺序或随机产生的单号,而我们又往往需要根据这个单号进行一些判断,比如数据库中对应的数据是否完整。
  还有,当我们需要根据输入的某些条件来判断输出的条件是否正确,这个时候WINRUNNER就无能为力了,因为它目前没有提来实现参数化的Check。但是我们可用使用WINRUNNER 的函数及WINNRUNNER 的录制功能,先录制一个使用ULTRAEDIT(或类似工具)手工修改chk 文件的函数。然后将要修改的内容参数化,在主SCRIPT 执行Check 以前先调用该函数。
D. 在Script 里面管理GUI  
使用WINRUNNER 都知道GUI 文件的重要性,MI 推荐的一种方式是专人来管理GUI文件,整个测试使用同一个/系列GUI 文件。但实际我觉得这很困难的,特别是程序比较的话,光是找出所有的窗口就已经是很痛苦的一件事情。我认为应该首先应该将GUI 与SCRIPT同时存储在同一目录下。
  然后使用GUI_load 在SCRIPT 开始以前就装载GUI,在SCRIPT 开始增加:
   if (GUI_load(".login.gui")!=0)
   {
   pause ("Can't load login.gui");
   texit;
   }
  使用Winner 做过复杂测试的可能会问,如果不同GUI 文件中的对象名称相同的话,运行时候就会出问题。因此我们应该在SCRIPT 完毕的时候加入GUI_close(".login.gui");
E. 注意恢复测试前的状态  此外,如果我们要连续运行多个测试CASE、就必须考虑将被测试程序恢复测试前的状态,比如我们在测试SCRIPT A 中打开了窗口A,如果下一个TESTCASE 不需要用到窗口A,那么在SCRIPT A 窗口A。这样下一个TESTCASE 才能正常运行。
  如果我们采用采用批处理及CALL 的方式来组织SCRIPT 的话,就应该坚持这样一个原则:“谁打开、谁关闭”,这样才便于管理。
  此外如果对数据库的操作也要根据具体要求考虑恢复。这些操作可以考虑通过录制通过数据库客户端的操作来实现。

9)WINRUNNER在录制时无法识别窗口(VC开发),从而导致窗口内的所有对象都不能识别?

可以自己写脚本,定义要识别的对象的,做为资源文件脚本(例如命名为:VC_Addin)放在安装路径的Lib文件夹下,其中主要用到的的方法就是:
set_class_map,
set_record_attr,
set_record_method;   
然后打开dattslinit脚本,在脚本最末尾增加一行代码 call VC_Addin();
运行
这样就可以识别了,并且以名指定的名称识别的。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7531461/viewspace-983355/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
  • 博文量
    26
  • 访问量
    12976