51Testing软件测试论坛

标题: 如何将web_reg_save_param与Excle中的数据进行比较 [打印本页]

作者: guxingyun    时间: 2007-5-11 15:48
标题: 如何将web_reg_save_param与Excle中的数据进行比较
如何将web_reg_save_param与Excle中的数据进行比较?
录制了一段代码,将服务器返回的数据(就是一个变量,如用户名之类)保存在参数中(使用web_reg_save_param()函数),为了验证获得的参数是否正确,想使用某个方法将这个参数和excel表格中的某列数据进行比较,确定其正确性。
作者: rickyzhu    时间: 2007-5-11 17:35
写函数从Excel文件中读取,然后进行对比
作者: zoeHuang    时间: 2007-5-11 17:53
标题: 回复 #2 rickyzhu 的帖子
请教 函数如何写? 不好意思比较弱
作者: shanxi    时间: 2007-5-11 17:58
Excel里面的函数,宏

最基本的技能耶,写Report的时候必备的能力
作者: yhmin    时间: 2007-5-11 23:26
正准备去学学EXCEL里面宏的知识.

不过比较好奇,这个宏如何在LR里调用呢?

我解决这个问题的方法很土,把这个EXCEL存成文本文件,在LR里面写C的脚本把文件读出来跟获得的参数比较.基本上可以满足需要
作者: guxingyun    时间: 2007-5-12 08:26
谢谢各位的回复,我计划先采取使用vc读取excle中的数据进行对比的方式进行。关于 shanxi 提到的“Excel里面的函数,宏”的方式暂时没有接触过,稍后再试。
作者: shanxi    时间: 2007-5-12 09:23
用代码读excel的行列数据成本还是有些高的,其实也就几十行的代码。

恩,适合自己的工作就行


LR如果能调用Excel里面的宏应该能引用Excel.Application这个对象

[ 本帖最后由 shanxi 于 2007-5-12 09:35 编辑 ]
作者: guxingyun    时间: 2007-5-13 22:23
在一个blog中看到这样的一个例子
“导出带有逗号和引号分隔符的文本文件”
http://blog.csdn.net/naive1010/archive/2004/11/05/169126.aspx
其中涉及到了从 excel 中读取值并写入文件的宏代码 至于在 lr 中如何调用继续学习中,请指教。
具体的宏代码整理如下:

Sub QuoteCommaExport()

Dim DestFile As String
Dim FileNum As Integer
Dim ColumnCount As Integer
Dim RowCount As Integer
' 提示用户指定目标文件名。
DestFile = InputBox("Enter the destination filename" & Chr(10) & "(with complete path and extension):", "Quote-Comma Exporter")
' 获取下一个可用的文件句柄编号。
FileNum = FreeFile()
' 关闭错误检查功能。
On Error Resume Next
' 尝试打开目标文件以供输出。
Open DestFile For Output As #FileNum
' 如果出现错误,则报告错误并结束程序。
If Err <> 0 Then MsgBox "Cannot open filename " & DestFileEnd
' End If
' 打开错误检查功能。
On Error GoTo 0
' 循环选择的每一行。
For RowCount = 1 To Selection.Rows.Count
' 循环选择的每一列。
For ColumnCount = 1 To Selection.Columns.Count
' 将当前单元格中的文本写入到文件中,文本用引号括起来。
Print #FileNum, """" & Selection.Cells(RowCount, ColumnCount).Text & """";
' 检查单元格是否位于最后一列。
If ColumnCount = Selection.Columns.Count Then
' 如果是,则写入一个空行。
Print #FileNum,
Else
' 否则,则写入一个逗号。
Print #FileNum, ",";
End If
' 开始 ColumnCount 循环的下一个迭代。
Next ColumnCount
' 开始 RowCount 循环的下一个迭代。
Next RowCount
' 关闭目标文件。
Close #FileNum

End Sub
作者: shanxi    时间: 2007-5-14 08:50
其它任何程序要能调用Excel里面的操作

都必须具备 "引用Excel.Application这个对象"的能力

PB,VB,VC,C#能调用我能确定,LR不晓得哟
作者: guxingyun    时间: 2007-5-14 12:00
如果使用DLL不知道可否实现,将查到的一篇比较好的介绍加载DLL的帖子转载过来,供大家研究
“LoadRunner下DLL的调用”
原帖地址http://www.softqa.net/bbs/index.php?showtopic=100
具体内容如下:
LoadRunner下DLL的调用
场景介绍
最近在做类似于QQ的通信工具的性能测试时发现了一些问题,现总结出来与大家分享一下。希望大家在使用LoadRunner时不仅仅停在只是录制/播放角本,而全面提升角本的编程技术,解决复杂场景。
本次测试中碰到的问题是这样的,在消息的传送过程中遇到了DEC加密的过程,LoadRunner录制到的全是加密的消息,比如我录制了某一个用户的登陆,发送消息,退出,但由于是加密的,只能单个用户使用,但如果我想并发多少个用户就存在很多问题,最直接的一个问题就是用户名是加密的,密码是加密的,当然你可以说让程序那里注掉加密的代码进行明码的测试,当然也是一种办法。但程序组提出了要使用更真实的方法来模拟,这时就必需使用下面介绍的方法。
一开始是直接把API移植到LoadRunner中来,不过由于加密算法异常复杂,有几层循环,而角本是解释执行的,进行一次加密运算可能需要好几分钟,当然在角本里可以把角本本身运行的时间去掉,但这样做显然没有直接调用DLL来的效率高。由于程序组比较忙,所以无法提供DLL给测试,所以测试完成了DLL的编写,并在LoadRunner中调用成功,高效的完成了用户信息加密,参数关联,成功的完成了测试。
动态链接库的编写
  在Visual C++6.0开发环境下,打开FileNewProject选项,可以选择Win32 Dynamic-Link Library建立一个空的DLL工程。
  1. Win32 Dynamic-Link Library方式创建Non-MFC DLL动态链接库

  每一个DLL必须有一个入口点,这就象我们用C编写的应用程序一样,必须有一个WINMAIN函数一样。在Non-MFC DLL中DllMain是一个缺省的入口函数,你不需要编写自己的DLL入口函数,用这个缺省的入口函数就能使动态链接库被调用时得到正确的初始化。如果应用程序的DLL需要分配额外的内存或资源时,或者说需要对每个进程或线程初始化和清除操作时,需要在相应的DLL工程的.CPP文件中对DllMain()函数按照下面的格式书写。
 
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
default:
break;
}
return TRUE;
}
  
参数中,hMoudle是动态库被调用时所传递来的一个指向自己的句柄(实际上,它是指向_DGROUP段的一个选择符);ul_reason_for_call是一个说明动态库被调原因的标志,当进程或线程装入或卸载动态链接库的时候,操作系统调用入口函数,并说明动态链接库被调用的原因,它所有的可能值为:DLL_PROCESS_ATTACH: 进程被调用、DLL_THREAD_ATTACH: 线程被调用、DLL_PROCESS_DETACH: 进程被停止、DLL_THREAD_DETACH: 线程被停止;lpReserved为保留参数。到此为止,DLL的入口函数已经写了,剩下部分的实现也不难,你可以在DLL工程中加入你所想要输出的函数或变量了。

  我们已经知道DLL是包含若干个函数的库文件,应用程序使用DLL中的函数之前,应该先导出这些函数,以便供给应用程序使用。要导出这些函数有两种方法,一是在定义函数时使用导出关键字_declspec(dllexport),另外一种方法是在创建DLL文件时使用模块定义文件.Def。需要读者注意的是在使用第一种方法的时候,不能使用DEF文件。下面通过两个例子来说明如何使用这两种方法创建DLL文件。

  1)使用导出函数关键字_declspec(dllexport)创建MyDll.dll,该动态链接库中有两个函数,分别用来实现得到两个数的最大和最小数。在MyDll.h和MyDLL.cpp文件中分别输入如下原代码:
 
//MyDLL.h
extern "C" _declspec(dllexport) int desinit(int mode); 更新为 extern "C" _declspec(dllexport) int desinit(int ,int);
extern "C" _declspec(dllexport) void desdone(void); 更新为 extern "C" _declspec(dllexport) void desdone(int ,int);

extern "C" _declspec(dllexport) void des_setkey(char *subkey, char *key);
extern "C" _declspec(dllexport) void endes(char *block, char *subkey);
extern "C" _declspec(dllexport) void dedes(char *block, char *subkey);
//MyDll.cpp
#include"MyDll.h"
//这里我用了比较大小的函数代替了我要实现的函数
int desinit(int a, int b)
{
if(a>=b)return a;
else
return b;
}
int desdone(int a, int b)
{
if(a>=b)return b;
else
return a;
}
该动态链接库编译成功后,打开MyDll工程中的debug目录,可以看到MyDll.dll、MyDll.lib两个文件。LIB文件中包含DLL文件名和DLL文件中的函数名等,该LIB文件只是对应该DLL文件的"映像文件",与DLL文件中,LIB文件的长度要小的多,在进行隐式链接DLL时要用到它。读者可能已经注意到在MyDll.h中有关键字"extern C",它可以使其他编程语言访问你编写的DLL中的函数。
LoadRunner调用动态链接库
上面完成动态链接库开发后,下面就介绍动态链接库如何被LoadRunner进行调用,其实也是很简单的。在LoadRunner中的DLL调用有局部调用与全局调用,下面介绍局部调用。
首先把你编译的DLL放在角本路径下面,这里是MyDll.dll,MyDll.lib.然后在Action中使用
lr_load_dll("MYDll.dll"),此函数可以把DLL加载进来,让你调用DLL里面的函数,而DLL中的运算是编译级的,所以效率极高,代码样例如下:
#include "lrs.h"
Action()
{
//
int nRet = 6;
char srckey[129];
memset(srckey, 'a', 128);
lr_message(lr_eval_string(srckey));
lr_load_dll("MyDLL.dll");
nRet = desinit(5,8);
lr_message("比较的结果为%d",nRet);
return 0;
}
运行结果
比较的结果为8

全局的动态链接库的调用则需要修改mdrv.dat,路径在LoadRunner的安装目录下面(LoadRunner/dat directory);在里面修改如例:
[WinSock]
ExtPriorityType=protocol
WINNT_EXT_LIBS=wsrun32.dll
WIN95_EXT_LIBS=wsrun32.dll
LINUX_EXT_LIBS=liblrs.so
SOLARIS_EXT_LIBS=liblrs.so
HPUX_EXT_LIBS=liblrs.sl
AIX_EXT_LIBS=liblrs.so
LibCfgFunc=winsock_exten_conf
UtilityExt=lrun_api
ExtMessageQueue=0
ExtCmdLineOverwrite=-WinInet No
ExtCmdLineConc=-UsingWinInet No
WINNT_DLLS=user_dll1.dll, user_dll2.dll, ...
//最后一行是加载你需要的DLL
这样你就可以在LR中随意的调用程序员写的API函数,进行一些复杂的数据加密,准备的一些操作,进行复杂的测试。同时如果你觉的有大量高复杂的运算也可以放在DLL中进行封装,以提高效率。
<--- From Chen WeiJun blog.--->

[ 本帖最后由 guxingyun 于 2007-5-15 11:42 编辑 ]
作者: rickyzhu    时间: 2007-5-14 14:15
QTP和Excel的集成就比较好,可以直接弄,呵呵,LR要自己写代码。
作者: shanxi    时间: 2007-5-14 15:59
dll调用在任何语言中都这么写的

dll import

是跟Excel的相关dll,好像是类似引用Microsoft   Excel   11.0   Object   Library(EXCEL2003),MSOWC.DLL,Microsoft.Office.Interop.Excel.dll,自己查下吧

不在LR中读Excel,还可以用java读(仅限2003及以前版本),Java读Excel有两种方法。

如何在 Microsoft Visual C# .NET 中实现 Microsoft Excel 自动化


Microsoft.Office.Interop.Excel Namespace
作者: guxingyun    时间: 2007-5-15 20:48
我现在暂时的实现方法是将web_reg_save_param获取的参数写在记事本中,然后使用Utraedit自带的对比功能对比数据,道路走的很曲折呢sdlkfj2 , 写入的方法使用的是zee的blog中介绍的一个方法,在另一篇帖子中得到 shanxi 的帮助 http://bbs.51testing.com/thread-75983-1-1.html 得以实现。
关于使用vc读取或者是加载dll或者是宏,都只是进行了一部分就暂停了,暂时的疑惑是web_reg_save_param是每个pacing获取一次值,然后用这个值与dll或宏中的相应值进行比较,那么dll或宏在取相应值的时候和pacing的关系是怎样的?因为每次pacing,web_reg_save_param的值在变化,那么如何来控制dll或宏中的取值也相应变化呢?暂时还没有想到如何实现,在之后的学习中会继续。请各位指教。
作者: guxingyun    时间: 2007-5-24 11:42
标题: (转贴)请问怎么用vc读写excel中的数据?
在网上找到这样的一片帖子,在此感谢 gjd111686(数字金刚)的这篇帖子。讲述的是用vc读写excel中的数据,在执行中提示找不到“未找到宏CopyRow”,但是内容却复制成功了,红色标注的是执行到此为止出的保错。我的是Excel2003。在工程中加载的头文件Excel9.h,源文件Excel9.cpp,因为没有找到D:\Program   Files\Microsoft   Office\office\Excel9.OLB这个文件。
原帖子链接地址:http://topic.csdn.net/t/20050312/15/3845545.html
具体方法转贴如下:
在开发软件时,经常要将数据输出到Excel   2000中,在Excel   2000中对该数据进行进一步地格式化处理或进行计算处理。在Visual   Basic中处理起来较简单,Excel   2000的VB编程帮助中有较为详细的介绍。在Visual   C++中如何进行处理了?利用Excel   2000的ActiveX   Automate功能,处理起来同VB中类似。但要注意以下几点:     
  对于对象的属性值的读取或赋值,需要用GetProperty()或SetProperty(NewValue)函数,不能象VB中直接通过属性名称取值或赋值。例如:Worksheet.GetCount(),   Worksheet.SetName(“Sheet1”)。     
  对集合对象中的成员对象的引用,必须使用集合对象的GetItem()函数。例如:Worksheets.GetItem(ColeVariant((long)1))或Worksheets.GetItem(ColeVariant(“Sheet1”))取得第一个工作表。     
  在COM接口中,时常用到Variant,BSTR,SafeArray数据类型。Variant数据类型是一个联合,可表示几乎所有的类型的数据,具体用法见MSDN中的相关介绍,类_variant_t是对VARIANT数据类型的封装。在Excel   2000的VB编程帮助中,如果提到某函数或属性需要一个值,该值的数据类型通常是Variant,在封装Excel   2000对象的类定义中,说明了具体需要的数据类型。BSTR是一个包括了字符串和字符串长度的数据结构,类_bstr_t是对BSTR数据类型的封装。在Excel   2000的VB编程帮助中提到的字符串通常指BSTR。具体函数参数或属性的数据类型,见封装该对象的类的定义。SafeArray是一个包括数组和数组边界的结构,数组边界外的内容不允许访问。在Excel   2000的VB编程帮助中提到的数组是指SafeArray。关于SafeArray的处理,请见MSDN的相关帮助。     
  对于缺省参数和缺省值。在VB中,函数的参数可以空缺,在VC++中不允许,必须将所有的参数填写完全。如果你希望指定某个参数为缺省值,根据参数数据类型的不同,可指定不同的缺省值。当参数数据类型为字符串时,可以用长度为0的字符串。如果参数是Variant类型,可用常量vtMissing,该常量在comdef.h中定义。也可用_variant_t(DISP_E_PARAMNOTFOUND,   VT_ERROR)产生一个Variant对象。     
  Excel对象中的集合对象有时包括的子对象是不一定的,例如:Range对象,可以表示Cell的集合,也可以表示Column的集合或Row的集合,Range.GetItem(1)可以返回Cell或Column或Row对象。     
  对对象的引用或传递对象,使用IDispatch类对象,有时利用Variant对IDispatch进行包装。     
  以下是一段源程序,演示如何启动Excel   2000,利用一个模板文件产生一个新文档,在该文档的”Sheet1”工作表的第一个单元中填写一段文字,设置第一列的列宽,然后调用一个模板中的宏,执行一段程序,最后打印预览该Excel文档。模板文件名称:MyTemplate.xlt。程序在Visual   C++   6.0   sp4,Windows   2000   Professional   sp-1下调试通过。     
  首先利用Visual   C++   6.0,建立一个MFC基于对话框的工程项目,共享DLL,Win32平台。工程名称ExcelTest。在主对话框中加入一个按钮,     
  ID   IDC_EXCELTEST     
  Caption   Test   Excel     
  双击该按钮,增加成员函数void   CExcelTestDlg::OnExceltest()。     
  在BOOL   CExcelTestApp::InitInstance()中,dlg.DoModal();之前增加代码:     
  if   (CoInitialize(NULL)!=0)     
  {     
  AfxMessageBox("初始化COM支持库失败!");     
  exit(1);     
  }     
  在return   FALSE;   语句前,加入:     
  CoUninitialize();     
  选择Menu->View->ClassWizade,打开ClassWizade窗口,选择Add   Class->From   a   type   library,选择D:\Program   Files\Microsoft   Office\office\Excel9.OLB(D:\Program   Files\Microsoft   Office\是本机上Microsoft   Office   2000的安装目录,可根据个人机器上的实际安装目录修改)。选择_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,加入新类,分别为_Application、Workbooks、_Workbook、Worksheets、_Worksheet、Range,头文件Excel9.h,源文件Excel9.cpp。     
  在ExcelTestDlg.cpp文件的头部,#include   "ExcelTestDlg.h"语句之下,增加   :     
  #include   "comdef.h"     
  #include   "Excel9.h"     
  在void   CExcelTestDlg::OnExceltest()   函数中增加如下代码:     
  void   CExcelTestDlg::OnExceltest()      
  {     
  _Application   ExcelApp;     
  Workbooks   wbsMyBooks;     
  _Workbook   wbMyBook;     
  Worksheets   wssMysheets;     
  _Worksheet   wsMysheet;     
  Range   rgMyRge;     
  //创建Excel   2000服务器(启动Excel)     
      
  if   (!ExcelApp.CreateDispatch("Excel.Application",NULL))     
  {     
  AfxMessageBox("创建Excel服务失败!");     
  exit(1);     
  }     
  //利用模板文件建立新文档     
  wbsMyBooks.AttachDispatch(ExcelApp.GetWorkbooks(),true);     
  wbMyBook.AttachDispatch(wbsMyBooks.Add(_variant_t("g:\\exceltest\\MyTemplate.xlt")));     
  //得到Worksheets     
  wssMysheets.AttachDispatch(wbMyBook.GetWorksheets(),true);     
  //得到sheet1     
  wsMysheet.AttachDispatch(wssMysheets.GetItem(_variant_t("sheet1")),true);     
  //得到全部Cells,此时,rgMyRge是cells的集合     
  rgMyRge.AttachDispatch(wsMysheet.GetCells(),true);     
  //设置1行1列的单元的值     
  rgMyRge.SetItem(_variant_t((long)1),_variant_t((long)1),_variant_t("This   Is   A   Excel   Test   Program!"));     
  //得到所有的列     
  rgMyRge.AttachDispatch(wsMysheet.GetColumns(),true);     
  //得到第一列     
  rgMyRge.AttachDispatch(rgMyRge.GetItem(_variant_t((long)1),vtMissing).pdispVal,true);     
  //设置列宽     
  rgMyRge.SetColumnWidth(_variant_t((long)200));     
  //调用模板中预先存放的宏     
  ExcelApp.Run(_variant_t("CopyRow"),_variant_t((long)10),vtMissing,vtMissing,     
  vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,     
  vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,     
  vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,     
  vtMissing,vtMissing,vtMissing,vtMissing,vtMissing,vtMissing);     
  //打印预览     
  wbMyBook.SetSaved(true);     
  ExcelApp.SetVisible(true);     
  wbMyBook.PrintPreview(_variant_t(false));     
  //释放对象     
  rgMyRge.ReleaseDispatch();     
  wsMysheet.ReleaseDispatch();     
  wssMysheets.ReleaseDispatch();     
  wbMyBook.ReleaseDispatch();     
  wbsMyBooks.ReleaseDispatch();     
  ExcelApp.ReleaseDispatch();     
  }     
  添加完以上程序后,可运行看结果。

[ 本帖最后由 guxingyun 于 2007-5-24 11:44 编辑 ]




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2