-
QTP中进入指定文件夹查找文件
2008-09-25 17:56:15
Function ShowFolderList(folderspec)
Dim fso, f, f1, fc, s
Set fso = CreateObject("scrīpting.FileSystemObject")
Set f = fso.GetFolder(folderspec)
Set fc = f.Files
For Each f1 in fc
s = s & f1.name
s = s & "<BR>"
Next
ShowFolderList = s
End FunctionDim FolderList,FileName
Dim ListTotal
FolderList= ShowFolderList("D:\新建文件夹\新建文件夹")
FileName=Split(FolderList,"<BR>")
For ListTotal=LBound(FileName) TO UBound(FileName)-1
MsgBox(FileName(ListTotal))Next
本来想跟上一篇QTP学习放一起的...主要是进入指定的文件夹中查找文件,可以输出文件夹中的文件名...
文件名的命名规则:
在Windows200X中的文件命名规则是前缀名+后缀名,中间加一个点。前缀名可以任意命名,而后缀名则表示了文件的格式类型。Windows就是通过文件的后缀名来识别文件的
(1)在文件或文件夹的名字中,最多可使用256个字符。
(2)组成文件名或文件夹的字符可以是英文字母、数字及¥@&+()、下划线、空格、汉字等。但不能使用下列9个字符:?\ * | “ < > : / 在Windows200X中的文件命名规则是前缀名+后缀名,中间加一个点。前缀名可以任意命名,而后缀名则表示了文件的格式类型。Windows就是通过文件的后缀名来识别文件的
(1)在文件或文件夹的名字中,最多可使用256个字符。
(2)组成文件名或文件夹的字符可以是英文字母、数字及¥@&+()、下划线、空格、汉字等。但不能使用下列9个字符:?\ * | “ < > : /如果不用考虑模块化什么的,可以在FUNCTION的FOR中直接将文件名输出,也不用后面的来拆分字符串...更不用考虑要用什么字符串做为中间的拆分标志..
Dim FolderList,FileName
Dim ListTotal
Dim counter
FolderList= ShowFolderList("D:\新建文件夹\新建文件夹")
FileName=Split(FolderList,"<BR>")
For ListTotal=LBound(FileName) TO UBound(FileName)-1
' MsgBox(FileName(ListTotal))
If(StrComp("calc.txt",FileName(ListTotal))<>True) Then
counter=1
End If
NextIf (counter<>1) Then
MsgBox("Can't find calc.txt")
else
MsgBox("can find")
End If
查找文件夹中是否有文件名为calc.txt的文件.. -
如何将控件禁用
2008-08-08 20:14:37
1.CEdit 类,像文本编辑框,让该文本框初始化后(有个值),那个值不能被修改...把编辑框属性设置为只读...
CEdit* pEdt1 = (CEdit*) GetDlgItem(IDC_EDIT_DATE);
pEdt1->SetReadOnly();2.Combo Box.组合列表框,默认为droplist,并且有默认值,不想让别人能选,所以只读方式不行..
CEdit* pEdt11 = (CEdit*) GetDlgItem(IDC_COMBO_PORT);
pEdt11->EnableWindow(FALSE);3.Button,为PUSH BUTTON,禁用
定义一个该控件的变量,然后..m_printer.EnableWindow(FALSE);(前变为变量名)..
4.Menu
CMenu* pMenu = this->GetSystemMenu(FALSE);
pMenu->EnableMenuItem(0,MF_BYCOMMAND|MF_DISABLED|MF_GRAYED); -
MFC的几个小知识
2008-08-07 19:40:07
1.
GetDlgItem(IDC_EDIT1)->EnableWindow(false);
1)GetDlgItem(IDC_EDIT1)得到IDC_EDIT1控件指针。
2)EnableWindow(false) 不可用。
2.
RadioButton的属性要选上group,否则不会在CLASSWINZARD自动生成Control ID,才加添加变量.
-
MFC对话框
2008-08-06 20:32:26
今天的工作是新建用户,用弹出对话框来获得新用户的信息...
1.菜单弹出的新建用户对话框和菜单所在的对话框,要把新建的用户信息在之前的对话框中显示出来.因为显示是由对话框中的CListBox控件的AddString方法来完成的(单一的增加),所以在新建用户的对话框中必须要获取指向菜单对话框的指针来完成显示..而这个要通过句柄来完成....要想在一个类中调用一个对话框,就要获得该对话框的句柄,
HWND hWnd;
hWnd=::FindWindow(NULL,_T("User"));
//lpszClassName:窗口类名,lpszWindowName:窗口标题。两个要一个就可以了,当然两个更准确
if (hWnd==false)
MessageBox("error");
Dialog_User* pWnd= (Dialog_User*)FromHandle(hWnd);
pWnd->m_listbox_user.AddString(m_user_name);要包含该调用对话框的头文件...
2.如何把CString类型的数据转换为char[20],因为我在定义数据结构时把用户名和密码都用char[20]来定义的(很不方便,但是我对C比较熟,数据结构容易出错,就选最拿手的)
char *username,*password;
int i;
username=m_user_name.GetBuffer(m_user_name.GetLength());
password=m_user_password.GetBuffer(m_user_password.GetLength());
for(i=0;i<19;i++)
{ if(i<strlen(username))
userinfo.user_name[i]=*(username+i);
else
userinfo.user_name[i]=' ';
}
userinfo.user_name[19]='\0';
for(i=0;i<19;i++)
{ if(i<strlen(password))
userinfo.user_password[i]=*(password+i);
else
userinfo.user_password[i]=' ';
}
userinfo.user_password[19]='\0';但是从对话框控件中获得的都是CString类型...
GetDlgItem(IDC_EDIT_USER_NAME)->GetWindowText(m_user_name);
GetDlgItem(IDC_EDIT_PASSWORD)->GetWindowText(m_user_password);
GetDlgItem(IDC_EDIT_REPEAT_PASSWORD)->GetWindowText(m_repeat_password);现在先用这个笨点的办法把东西实现再说,等以后有时间学下MFC的数据结构和文件操作,再把程序优化下...
-
CLIstBox
2008-08-05 19:29:01
整个程序是基于对话框和控件的,要在一个对话框的菜单弹出对话框响应中显示用户名的列表
本来对话框如果显示的话是很简单的,在OnInitDialog()方法中调用一个CListBox的实例调用AddString("user");就可以显示user,但是弹出对话框的话好像没有这个函数,要通过MFC ClassWizard来添加函数 WM_INITDIALOG,然后在这个函数里调用AddString方法来显示文本内容...
BOOL Dialog_User::OnInitDialog()
{
CListBox *listBox;
listBox = (CListBox*)GetDlgItem(IDC_LISTBOX_USER);
//GetDlgItem(IDC_LISTBOX_USER);
//m_listbox_user.AddString("Jane");
struct user
{
char user_name[20];
char user_password[20];
}userinfo[MAXOFUSER];
FILE *fp;
int i;
CString userTemp;
if((fp=fopen("usrinfo.cfg","rb"))==NULL)
{
MessageBox("cannot open user information file","Error",MB_OKCANCEL | MB_ICONWARNING);
return 0;
}
for(i=0;i<=MAXOFUSER;i++)
{
fread(&userinfo[i],sizeof(struct user),1,fp);
if(feof(fp))
{
fclose(fp);
break;
}
userTemp.Format("%s",userinfo[i].user_name);
listBox->AddString(userTemp);
}
//listBox->AddString("Tom");
CDialog::OnInitDialog();
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
} -
郁闷的周末
2008-08-04 19:43:53
买了个新电脑,系统是VISTA HOME BASIC,我抱着先试用下的心态,在上面装了VC6.0,QTP9.0,LR8.2,
VC没让我装完就提示不兼容,QTP和LR还蛮给我面子,装的过程中都表现不错,等我搭完JAVA的环境,在录脚本的时候发现QTP报错(浏览器不能启动,URL不对),边报错还边自动帮我把网页打开了,就是啥都不能识别,跟个傻子一样...今天上班来论坛一看,还有人跟我情况一样,也有解决的办法,心里松了一口气..
不过那个LR就没那么幸运了,一直弹出一个什么Action为0的提示框,打开录制网站后也检测不到EVENT,我还没找到问题和原因和解决方法,可能是软件的兼容问题,晚上回去先解决QTP再说,一个一个来...
-
技术积累.
2008-08-04 19:32:03
我发现自己蛮强的(小臭美下),什么东西不管我以前是否接触过,只要给我点时间,我都有信心去把它做好..
本来我是做测试的,但无奈测试部就我一个,势单力薄,很多和测试相关的东西实施起来都不顺利,还时不时要接受开发老大下发给我的编程任务(不过我的心态也还好,就当学习,充实自己).上次让我帮他把一个VC的串口升级工具美化一下,加上动态背景...这次是把一个序列号打印程序加些功能,像用户登录,用户的权限管理,新建用户,删除用户,修改密码这些功能...其实我对VC一点都不熟,每次是用到哪就去学,能用C写就尽量用C去写,反正在VC里也执行..
void Dialog_login::OnOK()
{
// TODO: Add extra validation here
#if 1
char iniFilePath[256];
GetModuleFileName(NULL,iniFilePath,sizeof(iniFilePath));
for(int i=strlen(iniFilePath)-1;i>=0;i--)
{
if(iniFilePath[i]=='\\')
{
strcpy(iniFilePath+i+1,"Syscfg.ini");//dialog_login.m_user_name
//将用户名和密码定义为结构体
/*char User_Name[20];
char User_Password[20];*/
struct user
{
char user_name[20];
char user_password[20];
}userinfo[3]={{"user","user"},{"usr","password"},{"Admin","1234"}};
FILE *fp;
int i;
if((fp=fopen("usrinfo.cfg","wb"))==NULL)
{
MessageBox("cannot open user information file","Error",MB_OKCANCEL | MB_ICONWARNING);
return;
}
for(i=0;i<3;i++)
{
if(fwrite(&userinfo[i],sizeof(struct user),1,fp)!=1)
MessageBox("file write error","Error",MB_OKCANCEL | MB_ICONWARNING);
} // 调试用
fclose(fp);
GetDlgItem(IDC_EDIT_USER_NAME)->GetWindowText(m_user_name);
GetDlgItem(IDC_EDIT_PASSWORD)->GetWindowText(m_user_password);
//用户信息从文件中读出来再和m_user_name,m_user_password比较
if((fp=fopen("usrinfo.cfg","rb"))==NULL)
{
MessageBox("cannot open user information file","Error",MB_OKCANCEL | MB_ICONWARNING);
return;
}
for(i=0;i<3;i++)
{
fread(&userinfo[i],sizeof(struct user),1,fp);
if(!memcmp(m_user_name,userinfo[i].user_name,strlen(m_user_name))&&
!memcmp(m_user_password,userinfo[i].user_password,strlen(m_user_password)))
{
break;
}
if(feof(fp))
{
/*CString s ;
s.Format("%d",i );
AfxMessageBox(s); */fclose(fp);
MessageBox("Password or User name Error!","Error",MB_OKCANCEL | MB_ICONWARNING);
return;
}
}
fclose(fp);
/*GetPrivateProfileString("User", "User_Name", "Admin",User_Name,sizeof(User_Name), iniFilePath);
GetPrivateProfileString("User", "User_Password", "1234",User_Password,sizeof(User_Password), iniFilePath);*///CString m_user_name;
//CString dialog_login
//dialog_login.IDD_DIALOG_LOGIN
//CEdit* pEditFileName = (CEdit*)GetDlgItem( IDC_EDIT_PASSWORD );//pEditFileName->SetWindowText( "1234");
//SetDlgItemText(IDC_EDIT_USER_NAME,dialog_login.m_user_name);
/* GetDlgItem(IDC_EDIT_PASSWORD)->GetWindowText(m_user_password);if(strcmp(m_user_password,User_Password))
{
MessageBox("Password or User name Error!","Error",MB_OKCANCEL | MB_ICONWARNING);
return;
}
else
{
break;主要是想实现一个从文件中读用户名和密码,然后并进行比较,用户输入的是否正确...}*/
}
}
#endifCDialog::OnOK();
}框架是那个开发老大已经搭好的,我主要写一些实现..今天就写了一个,主要是想实现一个从文件中读用户名和密码,然后进行比较,用户的信息是否正确...紫色部分的代码是我写的,其实做为测试人员,我自己看了自己写的代码都觉得太不健壮了...不过对自己来说还是学到点东西...
1.fclose(fp);这句话,我的整个程序就因为这句话而一直导致辞功能不能实现..先对文件中草药写数据后如果不关闭文件指针,文件指针会一直指向EOF,所以进入下边的循环时就一直在第一层出不去,其实当时我通过AfxMessageBox(s); 这个调试信息知道程序是在文件操作上出了问题,刚开始还一直怀疑程序的逻辑
2.如何在VC在查看变量的值,以前我调试时只会看VC中加打印语句,今天也是上网搜了才有结果...以后可以常用..CString s ;
s.Format("%d",i );
AfxMessageBox(s);3.对数据的存储,有想过用二维数组,有想过用链表,还有我认为最方便的结构体...不过这个数据量小,如果数据量大,只能用数据库了,数据的关联存储和查找(不大熟)...
还有一点担心,接下来还有几天苦战,不知道这种数据结构能不能行,其实结构体和链表我用纯C做过类似的程序...但是要在VC的可视化界面下显示,还是有点没底...因为太想做好了....
-
要努力了.
2008-07-24 19:12:54
一晃就是半年多,觉得现在的工作越来越偏离自己的方向了.
我的目标是学习性能测试,做网络和数据库的相关测试...在机顶盒这个行业一呆就是一年多,真不知道要怎么跳到别的行业去测试,基础知识相比一年前没有长进反倒有退步,越想越觉得不爽
索性拿自己的全部家当报了个测试培训班,花了这么多银子,再不好好努力就真的说不过去了.白天上班,晚上学习,生活很单一但还觉得充实,青春不是用来浪费的,有了目标就要坚定的走下去...
-
测试一年
2008-06-23 19:59:50
去年的这个时候我还是个即将离校的学生,转眼间一年就要过去了.
这一年发生了很多,有拿到第一份薪水时的喜悦,虽然很少,但是真的很开心,因为自己总算能挣钱了,这么多年的书也算没白读.也有从一个学生到一个职业人的转变,学生很随便,做事没有太多的顾虑,更谈不上有压力,可是工作不一样,意味着一种责任,尤其是测试工作.这一年还经历了工作的变动,从内地跑到了沿海,来到了我一直都很向往的城市.来这边三个多月,时间过得飞快,有时候感觉是时间在推着自己前进,我自己很享受这份充实.我一直是个很要强的人,过不惯安逸的生活.来这边的第一份工作薪水还算可以,有时候我也搞不明白自己怎么想的,这么辛苦的工作,住的还是那种又小又黑又湿农民房,我也想过要换.可是现在的我只能把钱用来做自己最重要的事,工作,为了谋求一份更好的发展.
我现在做机顶盒测试,公司是外资的,老板还挺看重测试,可是整个部门做测试的就我一个,所以什么事都得自己来.来这里工作三个多月,测试方面的,机顶盒硬件方面的,我都接触到不少,也学到不少,最重要的一点就是自己独立做事的能力强了.可是公司的规模和测试的情况也很让我担忧,自己的方向有两根主线,白盒测试或是性能测试,但是现在的公司没让测试人员接触代码,性能测试在机顶盒中我也想过,但是不是前端,所以现有的自动化工具都不能用,只能自己写测试工具,这对我来说又是一个很大的挑战,我目前已经在思索着要对遥控器按键进行自动化测试,但是对按键的组合数目只能达到三个,希望能和同行多交流.
-
初学QTP总结.
2008-06-23 19:33:45
以前挖的坑,现在填.把这一段时间学习QTP的心得写下来...1.QTP的工作原理:先扫描脚本中的对象名,然后去对象库中找同名对象(TO),再接着用对象库中的同名对象的属性与运行期间的对象属性(RO)进行比对,如果一致就进行相应的操作.2.WSH-----wscrīpt.shellSet wsh=CreateObject("Wscrīpt.Shell")wsh.Exec+在命令行中可正确执行的命令行参数wsh.SendKeys来发送按键.Wscrīpt.sleep +时间(单位毫秒)实例:曾经碰到过这么一个笔试题,用WSH实现进入某个指定目录下查找是否存在某个文件(如:XXX.TXT)进入指定目录似乎是用SpecialFolders这个对象,不过一直操作不成功...提示WSH不支持该对象...用fso的getFolder属性可以获得指定路径的Folder类,该类可以直接访问subFolder,Files属性,得到下一级的子文件夹类,该文件夹中的文件属性(文件集合类),然后通过该文件集合类可以直接访问name属性就可得到文件名.....调试成功了.嘿嘿.其实WSH的功能还是很强大的,不过我接触到的还不是很多.3.QTP的几种录制方式基于对象模拟录制低水平录制4。QTP的enviroment这个方法可以获得QTP脚本的一些属性只用过目录,用来设置相对路径。5。对象仓库:如果修改了对象的属性,在相应的脚本代码中要替换。参数化的实现原理:该Action中,如果参数化的输入有N组,则该ACTION重复执行N次。。具体是访问.xls文件,用DO WHILE ---LOOP实现的。。检查点的实现原理:正确的预期结果做为输入,检查实际结果是否与预期结果是否一致。。6。数据驱动数据的来源有很多种形式,可以是FSO,ADO,EXCEL,XML,还有随机数据。。数据驱动的框架雏形一般为三层:配置层,驱动层,执行层。。配置层主要依据将测试用例设计驱动层将用例解析。。。执行层是根据被软件的功能来设计的。QTP要是想发现问题主要取决于测试用例的设计。。。只是在学习的时候用过QTP自带的例子做过简单的实践,所以实际操作的经验不是很多,有很多东西还是凭自己的感觉写的,也不知道正确与否。 -
itracker 配置
2008-06-23 19:33:37
1.下载JDK-1_5_0_15,Jboss-3.2.7,itracker-2.4.2这三个软件2.配置JAVA和JBOSS的环境变量JAVA_HOME:JDK安装目录JBOSS_HOME:JBOSS安装目录PATH:JAVA_HOME\lib;JBOSS_HOME\libCLASSPATH:JAVA_HOME\lib\tools.jar;JAVA_HOME\lib\dt.jar3.配置JBOSS服务器和HQL数据库,以及将itracker跑起来(步骤可在网上找)1.打开C:\JBoss\JBoss-3.2.7\server\default\deploy\hsqldb-ds.xml,将联接URL设为
<connection-url>jdbc:hsqldb:hsql://localhost:1701</connection-url>
注意,这里一共有三种<connection-url>,在3.2.7中,默认是
<connection-url>jdbc:hsqldb:${jboss.server.data.dir}/hypersonic/localDB</connection-url> ,不用考虑,将其注释掉。
2.大约在这个文件的最底,有这样的一段:
<depends>jboss:service=Hypersonic,database=defaultDB</depends>
直接改为<depends>jboss:service=Hypersonic</depends>,接着,下面一段是我们需要的,不能被注释掉:
<mbean code="org.jboss.jdbc.HypersonicDatabase" name="jboss:service=Hypersonic">
<attribute name="Port">1701</attribute>
<attribute name="Silent">true</attribute>
<attribute name="Database">default</attribute>
<attribute name="Trace">false</attribute>
<attribute name="No_system_exit">true</attribute>
</mbean>
因为我们使用基本于TCP连接的connection-url,下面一段
<mbean code="org.jboss.jdbc.HypersonicDatabase" name="jboss:service=Hypersonic">
<attribute name="Database">localDB</attribute>
<attribute name="InProcessMode">true</attribute>
</mbean> 需要被注释掉,否则无法成功发布。
3.将这个文件存盘,并复制一份,相同目录下命名为C:\JBoss\JBoss-3.2.1\server\default\deploy\it-hsqldb-ds.xml。现在开始编辑这个新复制的文件。打开后,将
<jndi-name>DefaultDS</jndi-name>改为:
<jndi-name>ITrackerDS</jndi-name>
注意到,在这个文件中我们需要注释掉这段,不再使用:
<mbean code="org.jboss.jdbc.HypersonicDatabase" name="jboss:service=Hypersonic">
<attribute name="Port">1701</attribute>
<attribute name="Silent">true</attribute>
<attribute name="Database">default</attribute>
<attribute name="Trace">false</attribute>
<attribute name="No_system_exit">true</attribute>
</mbean>
4.打开C:\JBoss\JBoss-3.2.7\server\default\conf\standardjbosscmp-jdbc.xml这个文件,并将
<datasource>java:/DefaultDS</datasource>修改为
<datasource>java:/ITrackerDS</datasource>,以匹配我们刚才的修改。
5.注意,如果你在使用Jboss 3.2.1,那么在布署的时候,可能会有一个bug。修改方法是,打开
C:\JBoss\JBoss-3.2.1\server\default\conf\jboss-service.xml,将
<attribute name="RecursiveSearch">False</attribute> 改为
<attribute name="RecursiveSearch">True</attribute>。
这个问题在JBoss-3.2.7中不存在,默认为True。
6.现在开始启动JBoss。在命令行下进入C:\JBoss\JBoss-3.2.7\bin,键入run.bat。保持这个控制台窗口打开,(你关了它就结束了JBOSS)观察。
这个时候,需要注意一下看控制台的输出提示,如果出现了异常,那么表示刚才的配置文件修改有问题。JBOSS不能成功的启动。回头检查一下刚才的修改是否正确,特别是在hsqldb-ds.xml下<mbean>...</mbean>不要存在有两个;在it-hsqldb-ds.xml下一个都不能有。如果害怕因为改错而备份了这个文件,则切记不能将备份的文件放在这个目录下面,最好是放远点,桌面、D盘,etc,都行。OK,检查了重启。成功的启动过程中,不会有任何异常出现。
7.这一步走好以后,打开你浏览器,键入http://localhost:8080/jmx-console,此时,应该可以看到欢迎画面,表示JBOSS启动成功。在下面找到service=Hypersonic链接。单击进入下一个页面,在靠近页面底的地方,找到startDatabaseManager链接,单击后,会弹出一个应用程序窗口。
在此应用程序窗口上单击File->Connect,选择HSQL Database Engine Server类型,使用jdbc:hsqldb:hsql://localhost:1701这个URL登录,角色为sa,默认没有密码。进去以后,选择File->Open scrīpt选项,打开位于C:\ITracker\sql\hsql\install\的脚本create_itracker_core.sql文件,执行之,并选择Option->Commit进行确认提交。也可以将create_itracker_core.sql文件拷贝到SQL区执行,效果相同。
关于这一步,还可以在命令行下,使用java -cp C:\JBoss\JBoss-3.2.1\server\default\lib\hsqldb.jar org.hsqldb.util.scrīptTool -database default -url jdbc:hsqldb:hsql://localhost:1701: -log true -scrīpt C:\ITracker\sql\hsql\install\create_itracker_core.sql这个进行。不过这也许并不那么容易成功。
8.OK,进入布署的最后一步。把C:\ITracker\dist\itracker.ear文件,拷贝到C:\JBoss\JBoss-3.2.1\server\default\deploy下。拷贝完后,打开刚才启动JBOSS的控制台窗口,可以看到iTracker的发布过程。
到现在,iTracker已经完全发布好,在浏览器键入http://localhost:8080/itracker/index.jsp就可以看到登录页面了。使用admin/admin登录,以开始操作。有两个小点要注意:需要在JBOSS的HQL下运行itracker中自带的数据库脚本,而这个自带脚本行数过大,一般是执行不能通过的,我用的就是将数据库脚本截为三段来在HQL中运行.还有一个问题就是JBOSS的访问页面http://localhost:8080/jmx-console一直打不开,而改为http://127.0.0.1:8080/jmx-console就可以顺利打开,具体的原因我也还没查出来,在网上搜了下大致辞的可能原因如下:没使用代理的时候没区别,上网使用了代理的话,就会有区别
解决办法: ie->工具->internet选项->连接->局域网设置->高级在"例外(对于下列开头的地址不使用代理服务器)"中输入:http://localhost;http://127.0.0.1
如果还不一致则看看 c:\windows\system32\drivers\etc\hosts 文件最底下是否加了 127.0.0.1 localhost 的映射,不过这里一般不会出问题不过这个工具除了开源,还真的是用起不方便,很多功能都没有.