性能测试工作室:http://www.cnblogs.com/preftest 个人博客: http://hi.baidu.com/higkoo

发布新日志

  • 程序员的经典回复~~

    2007-01-10 13:17:49

    单击此图片 查看详细内容The Top 20 replies by programmers when their programs do not work 花开 

    程序员的程序不工作时他们最常说的20个回复调皮 :

     

     

    20. "That's weird..."                                      真是奇怪!

    19. "It's never done that before."                         那是以前从来没有过的。

    18. "It worked yesterday."                                 昨天还可以工作呢。

    17. "How is that possible?"                                怎么可能呢?

    16. "It must be a hardware problem."                       肯定是硬件有问题。

    15. "What did you type in wrong to get it to crash?"       你输错了什么使系统崩溃了?

    14. "There is something funky in your data."               你的数据有些古怪。

    13. "I haven't touched that module in weeks!"              我几个星期都没有动过那个模块了!

    12. "You must have the wrong version."                     你肯定是拿错了版本!

    11. "It's just some unlucky coincidence."                  这只是一些不幸的巧合罢了。

    10. "I can't test everything!"                             我不可能测试所有的东西!

    9. "THIS can't be the source of THAT."                     这不可能是那个的来源!

    8. "It works, but it hasn't been tested."                  它可以工作,但是还没有测试过。

    7. "Somebody must have changed my code."                   肯定是有人改了我的代码。

    6. "Did you check for a virus on your system?"             你对你的系统做了病毒检查吗?

    5. "Even though it doesn't work, how does it feel?         即使它不工作,它感觉如何呢?

    4. "You can't use that version on your system."            你不能在你的系统上使用那个版本。

    3. "Why do you want to do it that way?"                    你为什么要那么做?

    2. "Where were you when the program blew up?"              当程序崩溃时你在哪?

     

    And the Number One reply by programmers when their programs don't work:

    而程序员的头号回答就是:

     

    1.       "It works on my machine."                          它在我电脑上可以工作!

    Or

    1.       I thought I fixed that.                            我早就改了!

     

    测试与开发的交互是经常的,必不可少的 微笑 。

    在你的工作中,遇到了哪些呢 ? 是否还有更值得回味的? 握手 

    摘自:
    http://www.infoarchgroup.com/DontWork.html
    http://www.thenetworkadministrator.com/top20.htm

  • 随着Windows的成长

    2007-01-10 13:14:44

    前阵子,身边朋友电脑的机器都中毒,严重者都被迫重装了系统,损失了不少资源和时间。我的PC机也中招了,最终也用重装告终…… 委屈 
          关于PC机(Personal Computer)大家应该都不陌生,现在有些小孩很小就开始接触它了。计算机已经融入了各行各业,俗话说“走会英语走遍天下”,我虽然不敢说“学会计算机走遍天下”,但不会计算机那真的即将变为稀有了。 强 
          回忆一下,我第一次接触电脑应该是在初中毕业的时候。初三毕业后,学校组织了一次电脑培训。现在能记得的就是学习了一些简单WPS功能和MS-DOS怎么用,然后就是打字了。 调皮 其实当时都不知WPS是干什么和的,对那黑屏DOS的字符真是一点都不明白是干什么用的。
          读高中了,学校封闭式管理。只记得当时调皮的学生就翻院墙出去玩红警、星际,当时最红的还是“街霸”。学校也有开电脑课,不过大部分同学都出去打球了。电脑课的内容现在已经不记得了,只知道有学过打字。高中毕业了,等待通知书的那两个月是漫长的。听别人说学计算机出去很有用,也听说会打“五笔”的人很厉害。找朋友借了一本《计算机基础》,里面还专门有介绍打字的,而且封面后就贴了一张打印的“五笔”字根。当时还是没有学会传说中的“五笔”,因为根本就没有上过机,字根倒是背得挺熟的。
           握手 读大学了,大学生活是丰富多彩的。第一次去网吧好像是老同学聚会,晚上没地方去,就去网吧过了一夜。同学给了我一个QQ号,教我上Q进网站。那晚我就聊了一晚上。后来由于不会改QQ密码,不久号码就被盗了……
          然后反恐精英/CS就流行了! 电视 有过清早八点去网吧抢机子,下课一窝蜂的全赶去网吧,自由分组配合。当时有些同志真的很疯狂,白天和默认都是颠倒的、有些人网费比生活费还多、也出现饭可不吃网不可不上的人物……另一方面也说明了电脑的迷人之处。我们专业和计算机没怎么占边,不过也有计算机课,能记得的内容就是打字和C语言了。为了应付考试,我们大家都去网吧聊Q,美其名曰“练打字”。我的普通话不是很标准,打拼音常字打不出来,汗!第一个暑假我就呆在家里,借了个学习机接在电视机上,一个星期学会了五笔。开会后再去上网聊天,刚开始还没拼音打得快,逼着自己用了一段时间就习惯了。 酷 之后打字速度速增,考试时好像是八十多字/分钟拿了优秀。C语言说当时真的没学得怎么懂,有很多同学报计算机二级考试选择了QB。听老师说C语言出去有用,推荐了一本书给我,最后还幸运的通过了考试。
          工作了,A公司的事务和我的专业不对口但沾点边,还没毕业就被请过来实习了,之后就干了两年转入IT业。 大笑 还记得当时我面试的时候我还把“计算机二级”拿出来说(因为班上能pass的人就几个),还记得当时面试官好像并没有把我所谓的二级放在眼里 ^_^!  A公司是生产医疗仪器和配套软件的生产型企业。为了证明自己的产品,常被派出去做实验、安装和培训。
          没有开过电脑机箱的我,在客户面前,不管是电脑硬件还是软件的问题,都会让我很难堪。所以,我必需学电脑!后来被公司安排到软件部学习,当时得到最多的答复是“退出,再进……”、“重启、重启……”。现在还记得那个有我身后的同事,从来不会过来看我的情况,直接从后面张望过来就开始让我重启。因为我不是软件部的,可能有点被排外了吧,给我配的电脑也很差劲,速度慢还不说,显示接触不好,经常黑屏或开不了机。也就是那台“破”电脑,让我开始自己拆电脑主机,慢慢对硬件有所了解。对于软件的学习还是从数据的备份和还原学起的, 害羞 是一个非常曲折的过程。
          我的计算机水平相对同部门同事面言是最好的,所以当时一些电脑和软件方面的事情都丢给我处理。刚开始心里经常很虚、没有底,日子久了那些问题都已见怪不怪了,慢慢也都能独立处理了。同客户、程序员交流多了之后,我发现客户和程序员的思想简直就相反的,协调很困难。 发火 你如果不能完全了解客户的想法,当你向程序员解释客户的想法和需要时,他会提出很多问题问倒你。后来公司给我配了台电脑,有事没事我都自己弄我的电脑。因为电脑配置不好,速度很慢,我经常上网找软件优化我的系统,想方设法让我的电脑快起来。
          当时用得最多的就是“windows优化大师”,经常清理垃圾文件。 太阳 上网找文章,修改注册表。最初装98,后来居然连2003也装上去了。最多是一次装了三个操作系统,把硬盘都快塞满了。看了WinXP的界面后,我就不想再用Win98了;而且我发现只能先装Win2000再装WinXP否则以前的系统就不见了;装了Win2003,居然认不到我的U盘;注册表不能随便改,否则问题可能很严重;中了病毒,会让你的系统出现很神奇的问题;以前很讨厌的DOS命令,系统坏了的时候还很能派上用场…… 对电脑的逐步了解中,我也因此产生了浓厚的兴趣。我要想办法提高自己,当时不会编程,觉得程序员能很程序是件很奇妙的事情。后来自己在外面找了个培训点培训,不久就换了工作…… 微笑 
          来到B公司我是位Tester,我又发现光会电脑还不行,还必须懂网络;把自己的电脑优化得再好,对自己的工作也没有实质性的作用;光会备份系统还不行,怎么让你的损失降到最低才是关键;会操纵系统也没有太大的作用,面对厉害的病毒你一样束手无策;会拆接、维护硬盘,硬盘坏了怎么办?什么都会那么一点,什么都不精。平常可以玩弄一下,真正派上用场的时候,那三脚猫功夫确实不实用。其实这些都是对我的一种打击, 流泪 之前什么都好奇什么都想学,什么都不精通。现在我觉得,人的大脑是有限的,能学的就学懂,明白原理就行了,用的时候可以再学。“Linux的核心代码只有一万条代码”,听说就是一个人写的,原因是一个人的大脑最多能记住一万条代码,一个完整的代码相对组合代码而言要健壮。写此篇文章是我的一段回忆,同时也是告戒自己。 呕吐 
          收笔前还想把我对PC机的理解和一些常见问题列出来。
    电脑硬件:
           重伤 电脑硬件五花八门,如果你想自己组装一台电脑,去网上一搜,品牌会有很多。而且都是不断在更新的,所以我在此就不具体说了。硬件配置要和你的需求和当时的主流走。性价比高的可选择组装机,有Money的朋友或不怎么懂电脑硬件的朋友就选择品牌机吧,服务到家。
          电脑配件的真伪识别,我也不知道多少,一般需要就去网上搜。其实自己组装也不难,机箱和电源一般都一起装好了。
          自己选块主板和对应CPU/风扇,自己或让别人把你装上去就行了,不过就是用螺丝固定。 海盗 有些CPU的风扇不是很好装卸,此时请详看说明书 *_* 。
          新内存要看一下两边是否有插痕迹,放好机器再装,正确安装后两边的卡口都会对应得很好的。内存的故障无非就是线路烧毁和接触问题,看好内存的“金手指”,如果装反即立刻被烧毁。不过装反是装不进去的,我有见过别人因为因为装反而烧坏内存的,所以这里还是摆出来。 花谢 
          硬盘的安装,硬盘线上有一端有红色的标记,他的方向一般对着电源。有的主板上会在旁边有个“1”的标记(因主板而异)。要接多个硬盘,硬盘的表面一般都有说明,对应设置就可以了。如果是磁盘阵列,请上网搜索吧……
           咖啡 显卡、声卡、网卡等就直接对号入座就可以了,很简单的,和其它一起省略……
    装好硬件后,就要开始装系统了:
          品牌机根据你的配置,有些可能已经装好了操作系统。其它需要安装的或需要重装的,也很简单。只是有时需要设置一下BIOS,BIOS设置保存了你机器上的硬件信息和设置。需要设置的也就是启动顺序(光驱、软驱、硬盘、网络等等),往往默认首启动是CD-ROM,否则就需要手动更改此处,然后放入系统光盘重启即可根据提示开始安装。 电话 进入CMOS的方式因主板而异,爱华一般都是按DEL键进入,戴尔是F2。有些主板直接提供了启动菜单的入口,可以直接进入后进行选择。进入系统的安装程序后,根据提示安装即可,详细过程略。
          如果你已安装了2003,想再安装XP。可以用光盘启动安装后,再用2003的安装光盘进行恢复就可以了。或用2003系统盘引导到控制台恢复模式,然后用fixboot、fixmbr命令修复即可。或直接从光盘上或其它机器上拷一个2003系统下的Ntldr、Ntdetect.com来覆盖你本机上的,同时修改C盘下的boot.ini文件。 番茄 
          装好系统一定要安装一个能更新病毒库的杀毒软件。即使你上网再小心,你也不能保证你身边的机器不中毒,局域网内的病毒传播也很容易的。杀毒软件往往也不可能是万能的。有些病毒清不掉的,需要手动辅助操作。杀毒软件往往可以杀掉大部分病毒,杀不掉的如果手工也删不掉。 西瓜 修改msconfig、结束任务管理器中未知的进程、进安全模式。有些病毒是直接加载到系统进程的子线程中,这时你需要用杀毒软件查出病毒的文件名,然后在regedit中查找对应的项进行修改,或掉到其它机器上直接删除病毒文件,最后的办法就是备份数据、重新系统了……
          各种病毒的特征与发病机制都不同,不可同论也不可述全。病毒往往是借助系统漏洞来攻击你的,所以经常要updata你的机器。操作系统启动过程:硬件自检——查找引导区——加载系统启动文件——加载用户信息——登录系统。 猪头 
    系统启动前会先回去Ntldr、Ntdetect.com等文件,然后就是一些系统服务,然后就在一些关键进程中执行一些windows脚本,然后加载系统服务和用户服务(可能也有病毒的服务),最后加载用户信息,用户信息中也包括用户的启动项(这里可能也有病毒)。总之,需要看病毒的症状再下手。
          系统速度的优化,往往都是着手修改services.msc、gpedit.msc、regedit、系统设置中的一些信息。减少一些不必要的开支、减少一些停顿的时间。最终速度想要有质的变化,还是需要硬件的支持。  微笑 

    所有上面问题的解决方法,其实都说明了一个问题,有问题都可以去网上搜,学会独立,自己去找问题、解决问题。会渔了,就不怕没鱼吃了…… 握手 

  • 用记事本写一个关机小程序

    2007-01-10 13:07:18

    昨天整个QTP调用外面DLL的代码,头都大了。基本摸清楚了个大概,下一步去探索Win32_API。

          正事没办好,倒弄出了一个歪点子。

          QTP用的VBS脚本,昨天有同事机器关不了机,点关机执行的即是注销操作。刚好用VBS有一开放的脚本是关于 关机的。大家可以照下面的办法自己做一个关机程序。

    打开记事本,输入或直接复制:
    cscrīpt shutDown.vbs
    保存为 shut.bat (注意修改后缀名)。

    在打开记事本,输入或直接复制:
    Mychoice = inputbox ( "请按提示输入:" &  chr(13) & "普通关机请输入 1 "& chr(13) & "重新启动请输入 2 "& chr(13) & "强制注销请输入 3 "& chr(13) & "强行关机请输入 4 "& chr(13) & "强制重启请输入 5 " , "选择操作" , "5"  ) '此句不换行
    If Mychoice=1 Then
     DownFlag=8
     elseif Mychoice=2 then
     DownFlag=2
     elseif Mychoice=3 then
     DownFlag=4 
     elseif Mychoice=4 then
     DownFlag=12
     elseif Mychoice=5 then
     DownFlag=6
     else
     msgbox "未执行任何操作!",64+0,"提示"
    End If
    set win32_OS=getobject("winmgmts:{(Shutdown)}//./root/cimv2").execQuery("select * from win32_operatingsystem where primary=true") '此句不换行
    for each OS in win32_OS
    OS.win32shutdown(DownFlag)
    next
    set win32_OS=nothing
    保存为 shutDown.vbs (注意修改后缀名)。

    双击shut.bat即提示关机操作,直接双击shutDown.vbs也可得到同样的结果(IE6支持)。

    很简单,不会编程的同志们也可以自己玩玩乐乐了

  • 我的第一个 动态连接库

    2007-01-10 13:06:24

    迫于非常想用QTP调用DLL的想法,我尝试编写DLL文件。摇啊摇 谄媚 

    昨晚在网上看了个文章摘录之此: 握手 

    使用动态链接库 
           下面这个例子示范如何创建和使用用户定义的类以及如何创建动态链接库.利用文本编辑器创建两个文件.第一个是Apple.cs,内容如下:
    public class Apple {     
        private string variety = "";
       
        public Apple( string appleVariety ) {
            this.variety = appleVariety;
        }
       
        public void outputVariety( ) {
            System.Console.WriteLine( variety );
        }    


           第二个文件是Example2.cs,内容如下:
    class Example2 {
       
        static void Main( ) {
            Apple mac = new Apple( "Macintosh " );
            Apple gra = new Apple( "Granny Smith" );
            Apple cor = new Apple( "Cortland" );
            mac.outputVariety( );
            gra.outputVariety( );
            cor.outputVariety( );
        }


           首先,我们定义了一个新的用户定义类,名字为Apple.虽然Apple类并不一定要放到独立的文件中,但把每个类都放到自己独立的文件中是一个好的面向对象编程习惯,有助于简化组织和管理.我们为Apple类的声明加上了public修饰符(public class Apple),这样其他类就可以创建Apple类的实例.

     下面我们来编译和运行这个例子.首先我们要把Apple类编译成动态链接库,命令如下:
                                    csc /target:library Apple.cs
    /target:library表示不要创建执行文件,而是创建一个.dll文件(即动态链接库).所以,上面的命令将生成一个Apple.dll文件. 
           接下来我们编译Example2.cs,编译命令如下所示:
                                     csc /reference:Apple.dll Example2.cs 
           现在我们得到了执行文件Example2.exe.执行这个文件可以在控制台上看到如下输出:
    Macintosh
    Granny Smith
    Cortland
                     这个对程序员来说肯定再简单不过了……  犯困 

    QTP里调用DLL的格式为:
    Extern.Declare(RetType, MethodName, LibName, Alias [, ArgType(s)])

    参数

    类型

    描述

    RetType
    字符串型
    该方法的返回值的数据类型。有关可用的数据类型,请参阅声明数据类型
    MethodName
    字符串型
    任何有效的过程名。
    LibName
    字符串型
    包含已声明过程的 DLL 或代码资源的名称。
    Alias
    字符串型
    DLL 或代码资源中过程的名称。
    注意: DLL 入口点区分大小写。
    注意: 如果 Alias 为空字符串,则将使用 MethodName 作为 Alias。
    ArgType(s)
    字符串型
    表示在调用过程时传递至该过程的参数的数据类型的数据类型列表。有关可用的数据类型,请参阅声明数据类型
    注意:对于输出参数,请使用 micByRef 标志。

    然后我编写了mydll.cs源码如下:
    public class mydll {
         
        public void output( string getwords ) {
            System.Console.WriteLine( getwords  );
     System.Console.WriteLine("Press any key to continue...");
     System.Console.ReadLine();
        }    
    } //用 “csc /target:library mydll.cs”生成了mydll.dll文件

    然后在同目录下编写formydll.cs源码如下:
    class formydll {
       
        static void Main( ) {
           mydll a = new mydll();
     a.output("this is my name");
        }
    } /*用“csc /reference:mydll.dll formydll.cs”生成formydll.exe成功*/

    在命令行直接输入 formydll 回车后 输出 this is my name

    接下来我就要尝试用QTP调用的滋味了。 大笑 

  • 对即至生活的探索

    2007-01-10 13:05:22

    昂然回首,自己已经走过了人生的前二十多年。

    对于未来,现在还是一片渺茫。

       对于自己的过去,还是相当肯定的。虽然现在还没有什么成绩,但从每一步过程来看,至少没有很明显的错误。

       自读大学起,生活就开始充实,有挑战。

       回忆在校时期在外打工的一些往事,可以确定自己是有进步的。谈到现在从事的软件测试,从一个医学生转到IT行,在某些人眼里会觉得很吃惊。不过自我感觉还是挺喜欢这个行业的,无论是喜好还是理性的选择。


       当初读大学就是为了工作,初步给自己定的方向就是教师、医生,稀里糊涂就坠入了医学领域。虽然不是很喜欢化学,课程里化学都快过半了,头疼的同时还是接受了。在学校里所学的医学知识,即使没有运用到工作中,对自己生活还是有些帮助的,至少哪里有点贵恙可以大概估计一下问题原因。在学校里学了一点点C语言,和以前好胜考过的二级考试反而是对我工作更有点帮助。
       

        凭靠我所学的专业(医学检验),我进了我毕业的第一家公司A。A公司是搞医疗的,生产检验设备和对应的软件。当时形势上市场部服务科,其实做起来什么事情都有。由于需要安装硬件设备和软件,就少不了电脑了。继之就必须懂点电脑故障的修复方法。硬件、软件的故障,要学会发现找到问题和原因,然后反应上去进行修改,就开始有点类似现在的测试了。


    两年后,由于给自己的重新定位。我做出了人生第一次跳槽,也就是现在的B公司。B公司比A公司在正规

    ,软件方面更专业。借助A公司的一点想法和经验,我来到了B公司。
    我非常庆幸我能进B公司,因为B公司环境好,也符合跳槽的初忠。时间飞逝,又快一年了。现在我的,和刚开始做测试我已经完全不同了。当初我的思想是纯用户角度的思想,现在的我已经能融入测试行业中来了。而且凭借自己一点小聪明,也学习了一些自己想学习的东东。学习当然是不可少的,如果没有了进步,对自己可能是一种打击和否定。


    现在的我,似乎正停滞着。看看路边开车的那么多,外面都兴起了购房节了,可是我呢?有什么?


    再跳槽吗?我想我也不想……
    路是人走出来的,我的路在哪里呢?

  • QTP调用系统user32.dll —— FindWindow

    2007-01-10 13:02:37

    用QTP调用自己写的DLL失败,不顺利。 委屈 电死你
    现在来调用 Windows 自带的,代码如下:
    Extern.Declare micHwnd, "FindWindow", "user32.dll", "FindWindowA", micString, micString //声明 FindWindow 方法

    Extern.Declare micLong, "SetWindowText", "user32.dll", "SetWindowTextA", micHwnd, MicString '声明 SetWindowText 方法

    hwnd = Extern.FindWindow( "notepad","无标题 - 记事本") '获取记事本窗口的 HWND

    if hwnd = 0 then

    MsgBox "找不到指定窗口"

    else

    msgbox   hwnd

    res = Extern.SetWindowText(hwnd, "Set Title") '在此也可看出SetWindowText的用法了 大笑 '更改记事本窗口的标题

    end if

    FindWindow函数用于查找窗体  调皮 
    函数原型
    HWND FindWindow(
    LPCTSTR lpClassName, // pointer to class name
    LPCTSTR lpWindowName // pointer to window name
    );
    lpWindowName是要查找窗体的标题,即这里的“无标题 - 记事本”。
    如果找到窗体,函数返回该窗体的句柄;如果找不到,函数返回空值或者零 。

    句柄和窗口标题,若只知其中之一,""要用vbNullString表示 灯泡 

  • 修改QTP测试结果的输出方式

    2007-01-10 13:01:04

    不将测试结果记录到日志的语句。
    对于已知是错误的验证点,在测试报告中能否记录通过,或者根本不记录:

    Reporter.Filter = NewMode
    The mode can be one of the following values:

    Mode  '模式
    Descrīption '描述

    0 or rfEnableAll  
    Default. All reported events are displayed in the Test Results.  


    1 or rfEnableErrorsAndWarnings  
    Only event with a warning or fail status are displayed in the Test Results.  


    2 or rfEnableErrorsOnly  
    Only events with a fail status are displayed in the Test Results. 


    3 or rfDisableAll  
    No events are displayed in the Test Results.

    启用日积月累,不断收集……

  • TD的学习与总结

    2007-01-10 12:54:47

    写了两篇关于测试方面的日志,今天我来回忆一下TD的历程。

        TD(TestDirector)是一个功能强大的测试管理系统,此系统涵盖了整个测试流程。相对一些其它的一些缺陷管理工具而言,TD容易操作、易学易上手。

        由于最早学习的就是TD,到现在已经有一段时间了,前两篇文章(自动化QTP)居然把这个给淡忘了,惭愧万分  花谢 。

    下面开始介绍一下TD吧:
        安装与我就不细说了,上网下载安装手册“下一步”就OK了。如果可以的话,安装程序里也有英文的帮助说明。配置此篇暂略过…… 调皮 

    TD主要分为四个功能版块:
        1、需求 Requirements
        2、测试计划 Test Plan
        3、测试实验室 Test Lab
        4、缺陷 Defects

        TD上需求是定义测试内容与详细的需求,理论上是由测试组完成的。但综合公司的具体环境,有些时候可能需要开发来完成。
        测试计划可以由需求直接转化(tools —> Convert to tests),也可根据需求文档自定义测试计划。
        测试实验室里,你可以创建执行流程。这里记录了所有你执行过的测试与结果。
        缺陷管理栏,记录了测试过程中发现的所有问题,与开发的交互多在于此。

        其实TD的操作并不难,没有代码,不会有太多文字,也全部都是很常用的控件组合。只要你熟悉这个测试流程,使用TD没有问题! 握手 
        整体流程可概括为:创建项目,明确需求;根据需求生成测试计划;按照计划设计并执行测试;发现问题记录问题。
    但实际应用中可能会遇到一系统的阻力了。
        例如你公司开发整个流程是否正规,是否有文档可依。你是否有权力或有能力参与需求的设计与修改。之所以我所谓的“需求有些情况由开发定义”。TD的功能就在那里,该怎么做合适,我想没有定论,需要根据企业实际情况来定了。 胶囊 
        对于测试而言,我觉得能设计出一个合理有效的测试用例是最很需要的。这个需要你动脑筋,需要对你产品的功能及业务非常熟悉,否则写用例也是纸上谈兵。用例的设计格式,可以参考TD安装生成的默认测试演示库,那里就是设计整个“订飞机票”网站的测试流程,很有学习价值。 赞 
        在测试实验室里,你可以像开发设计业务流程一样,设计出一个测试步骤一步步的执行(Execution Flow)。在执行网格里你可以看到测试的历史记录与结果,我们需要在这里查看测试的进度和BUG的分部。
        缺陷管理里,就是测试和开交流的天堂了。我个人觉得很好用!你可以通过对列的筛选,很快到找到你要需要的信息并进行分析。在测试执行时可以自动添加缺陷,里面还自动记录一些测试信息。在以后的回归测试中,R&D Comments里记录了开发和测试的交互过程,也可以查看历史记录(history)。分析结果并输出……
        有一个很隐蔽的功能,在右上角的 tools -> Document Generator 。你可以选择TD里任何你想要的信息,然后设置格式输出到WORD,下班后拿回宿舍分析。 微笑 
        菜单里的Analysis也是比较常用的工具,可以帮助你分析结果并输出报告。
         星星 在Add-Ins Page里有很多插件,可以根据需要下载安装。有office插件、TD浏览器等等……
        不同版本的TD,功能核心都是一样的,只是外观有些变化,增加了一些小功能。至于现在出现的QC我也有幸尝试过,界面色调完全改了,多了文字处理功能、强化了图像分析功能。这些我想用过TD的朋友们肯定很容易上手的啦。
        讲到最后,连最重要的用例设计都没详细讲到。因为每家公司的产品和面对客户都不尽相同,其实没有一个固定的说法。我只浅谈一下我的感想吧: 电视 
        1、设计用例之前,你必要非常熟悉产品。用产品的每个功能模块与关联要很清楚。
        2、更多的去了解客户的需要,有机会多和客服勾通。如果能和客户面对面最好了,客户对产品的要求往往和开发者会有一定的差距。了解业务流你会设计更实际的用例,发现更有意义的BUG。
        3、多和组内同事讨论,“三人行必有我师”。即使你再强,你也会有想不到的地方,一个人的力量是有限的。
        4、用例的描述,要简要、清晰。因为你设计的用例可能被别人执行、新员工的参考和学习。
        5、每个步骤,尽可能多的想到他的关联,但不要冗余(容易理解不容易做)。
        6、一个完整的用例应涉及所有的功能与业务需求(需要很周全的考虑)。
    暂时想到的就这么多吧,欢迎广大的测试朋友们前来补充。
        所以,要设计出一个精炼而有效的测试用例,是不容易的。也是我们每个测试人员力求的! 花开 
    TD对于管理而言,相对于对工作进行了量化的标准。在TD上,你可以看到某个人什么时候在做什么事情、当前测试进度到哪了、某个版本缺陷的分布等等等等。对公司而言,产品库的建立是公司的一个资本。IT的工作量的一直是很难衡量的一个问题,TD在此对企业的管理者也提供了一些帮助。

        由于某些需要,可能我们需要尝试一些其它的管理工具。我个人也尝试过Rational、开源、其它的。Rational的那一套,我在自动化里有谈到。内容太多了,关于他的CQ,仅仅是缺陷管理,没有TD强大。但Rational是一套解决方案,CQ只是其中一个模块,拿起来和TD比有些不合适。Rational的资料在网上可利用的就更少了,我一直没有研究出什么成绩来,在此就不多说了 难过 。网上还有很多缺陷管理工具,开源的bugzilla就有很多人推荐。但安装都很麻烦,不易维护,功能不也多,我也没有多研究了。还有试过TestTrack..... 这些功能都很少,仅相当于TD中的Defects。还是推荐用TD吧,其它小工具也有他存在的理由,适合一定的需求环境,需要大家可以搜一下。 咖啡 

        这些可都是白手起家,“搜”出来的喔 :-0    微笑 

  • 浅淡测试自动化

    2007-01-10 12:49:37

    做软件测试的朋友,对自动化测试和测试工具一定不会陌生吧。 微笑 

        在此我也谈谈对测试自动化的看法和经历吧。关于测试自动化的文章,网上有很多,大家可以去baidu、google搜索一下,会有很多文章值得我们参考和学习。

        刚刚接触测试,对测试里的一切都是非常有新鲜感的,而且也非常愿意去学习所有自己想知道的东西。慢慢地,我渐渐地了解了测试,融入到软件测试这个行业中来。从最初的学习软件使用、了解业务流程,到开始设计用例、执行测试……

        当一切开始不是你想象的那么神奇之后,你就会去尝试探索一些新东西,不断的充实自己。往往对于测试同胞来讲,除了理论知识,就是测试工具了。因为人们往往会用你所熟悉的测试工具来衡量你的技能。

        我经常会抽出时间学习自动化工具,虽然它会占用到我的个人时间,但学习的过程是快乐的。刚开始,我也听说了网上所谓的优缺点,然而不去尝试往往不会真正的去理解它。我的实践也证实了这一点。

        最初我安装了很多自动化工具,如WinRunner(WR)、LoadRunner(LR)、QuickTestPro.(QTP)、QALoad、Robot…… 好多,安装完成的那一刻仿佛自己已经学会了很多东西一样。然后有些没有试用版、不注册不能使用的,安装上去试试两下就再也没有用了。 最多尝试的就是WR、LR、QTP了,由于WR脚本类似C语言,最初我就选择了它。 得意 

        使用WR时,当时才刚介入测试不久,也没有写过程序,对全英文界面、大量的代码,有点不从适应。虽然逐句去看,大概能看懂意思,但当时由于没有养成看帮助的习惯,学着学着就没兴趣了。
       对于LR,由于一气之下装了全部组件,弄了好久才把他的一些组件摸清楚。在网上下载了一些中文的说明和演示步骤,按照说明,我是一步步的学啊学,看啊看。照着说明一步步来确实没有问题,但是没有人告诉你为什么要这样操作?这一步操作和下一步操作有何关联?照流程走下来,也得到说明书上的结果,但结果里面又会有很多为什么。如:这个图示从哪里可以得来?如何去验证?    再者,抛开说明书,想来点“自定义”,那么问题就更多了……  疑惑 
       然后就是QTP了,QTP对于我这个没有写过程序的,比较容易接受。简单的操作可以完全不接触代码,也是对着说明一步步来操作“嗯,通过,下一步……”。由于当时公司产品都还没熟悉完,了解了皮毛想拿来用,简直说明了我当时的天真~~~

       公司任务慢慢多了,时间越来越少了,该尝试的也尝试过了。慢慢的,那些自动化工具就这样被搁浅了。其实回想起来还有个原因:这些工具没有得到公司的支持、没有完善的资料、没有权威人可以讨教。

       日子久了,项目总有该完成的一天吧。都快一年了,自来公司后近一年内都在测试同一个项目,压抑了很久了。从再开始的“错误堆”到“使劲找BUG”,这个过程我想每位有做过测试的都必须经历的。

       我终于解放了,项目成功部署了、再次成功部署。留下的维护工作量就不那么大了,因为有客户帮我们做测试了  握手  。空闲时间,我又捡起了阔别已久测试工具。从上次的尝试到现在,我已经重新了几次系统了,它们也从我的机器上消失了。前不久还在外面报了个程序设计的培训,会了一点编码。

       我又带着迷惑开始学习测试工具了,这些我就装了QTP,因为网上说他是WR的升级。这一装,我收获还不少。刚结束完编程的学习,对代码还算能接受。刚好学习的是VB,而QTP也刚好是用VB脚本,学以活用。干脆一不做二不休,我决定要把QTP学会。

       学习还是从说明书开始 犯困 ,可能是我急于求成吧,我学会一点东西就想拿到实践中来。刚好当时已经结束了一个项目,有C/S结构的也有B/S结构的。多就拿了一个WEB系统开刀了 胜利 。还真不巧,我还把一些功能真正的用到了公司的产品上。当然,中间有很多曲折的故事,在此我就不细说了,再另作文章详述。

    自动化过程中,我就领悟到:
          1、自动化并不是很自动,需要花精力才能让他自动。
          2、自动化工具不是万能的,他也有自己的缺陷。
          3、并不是什么功能都可以自动化的,不要为了自动化而去做自动化。
          4、自动化永远不可能取代人工的位置。
          5、自动化脚本的维护有时是很致命的,需要有一定的经验才能做好。
          6、我们需要适度的应用自动化,某些时候他确实可以减轻我们的负担,
             代替我们做一些很机械的事情。
          7、某些测试必须用工具,如性能测试、负载压力测试etc.。

    暂时就想到这些吧 *^_^*

    总结一下自动化中常见的困难吧:
         1、对测试工具和自动化没有一个正确的认识和定位。
         2、企业没有进行相关的培训,没有真正开展测试自动化。
         3、没有一个好的技术主管或有经验的同事。
         4、测试工具自身的一些缺陷,包括文档的引导。
         5、没有一个学习自动好的环境和氛围。

        在我的学习过程中,文档往往都是在网上找的;出现问题没有人可问,一般都上Q找一些群发表问题、进论坛发贴子;学习的时间是自己抽出来的,利用上班时间不会得到领导的支持。

        发表这篇文件,是对过去经历的一次回忆,当自己低落的时候看看可能也有助于找回自我。

        一定也有一些朋友有过一些和我很类似的经历。也会有些朋友正在其中…… 大笑 

  • QTP的学习历程

    2007-01-10 12:42:59

    上一篇我针对自动化写了一篇文章,现在就QTP(MI公司的QuickTestPro.)谈谈我的感想。

         对于我来说,学习QTP是一个漫长而有艰苦的过程 重伤 。首先我不是计算机及相关专业毕业的(医学相关)。跳入测试部时,我正在接受程序员的培训课程。由于自己认为需要,于是开始学习QTP。

        刚开始使用QTP,就一直对着说明书,不停的“订飞机票”(订飞机票是说明书里的一个例子)。学会了一个步骤就拿到公司产品上玩玩,回忆起来还是挺有趣的。

       当我用一些简单的功能开始录制脚本时,发现保存ActiveXScreen的话,生成的脚本很中空间(因为程序会保存每个不同的录制页面),多录一些硬盘空间就满了,而且回放过程会很慢。 郁闷 但如果不保存活动页(ActiveXScreen),对脚本的再改造/维护起来就相对困难一些。

       于是我开始去了解“关键字”视图里的内容,尝试了解代码。慢慢的,我了解到“关键字”视图显示了整个操作步骤,第个组件相对于程序里一个元素。同时还记录了录制过程对该元素的操作和结果。

        然后我又开始在论坛在找些资料看看,从有点所谓的高级应用中,我发现脚本的维护并不一定要有“活动页”。实际是QTP所有对象的识别,都存在脚本的一个对象库里了。QTP经常出现无法识别对象的问题,可以从这里着头修改。 灯泡 
       为了减少QTP脚本占用空间大、录制慢的问题。我查阅了一些资料,可以在设置中进行修改,让脚本中不保存活动控件(ActiveX)或仅保存出错时的录制页面。干脆,我就从此录制页面了。所有的调试都从“关键字”视图和“专家”视图中进行修改。而且关于对象库,QTP也有个选项,可以设置加载页面上所有的对象,我修改成只保存页面上录制过程使用的对象。 咖啡 这样,脚本的容量问题就解决了,录制后的脚本会比以前小很多,来了个彻底的瘦身。关于录制速度的问题,和保存“活动页”、动态脚本也有一定的关系,另外可以减小启动的加载项(如:去掉VB插件、.net插件,不需要的就不加进来)。这样的脚本上传到TestDirector上,或从TestDirector上调用就不会太慢了。

       然而真正的问题,棘手的问题就不是上面所述的那么简单了。不过都是有办法解决了的,嘿嘿……
       以下是我经常遇到的问题:
           一、无法识别控件。
           二、错误回放过程未知弹出窗口。
           三、加载.net插件后和TD的关联问题。
           四、动态加载元素的识别问题。
           五、调用外部dll的问题。
           六、随机验证码的问题。

    问题一,解决办法有三种:
       1、更改QTP自身对某控件的识别方式,在 tools——Object Identification 中。在这里列出了所有QTP能识别的控件,以及控件的识别方式。你可以给他添加X、Y坐标进行识别。或更明显的,列表中的信息,不按名称识别,而是按ID识别。这个修改可以解决一些问题,具体的赶紧动手试试吧……
       2、使用虚拟物件,来定义一个控件,在 tools——Virtual Object 中。在这里可以自定义一个控件。例如在ASP的程序中,程序出错,在客户端的表现形式大部分是一样的,你可以把整个错误页面当成一个控件来识别(感觉不错)。如果加一个判断,出错后你想做什么就由你自己定了。
       3、使用低级录制或鼠标录制。用 Test——LowLevelRecording/AnlogRecording 吧,用它录制就不需要什么设置了,他会记录你的程序控件相对屏幕的位置。用LowLevelRecording还有代码可改,用AnlogRecording动作就被封装了(维护性极差)。两者因实际环境更取其长吧……

    问题二的解决过程:
    关于弹出提示的问题,我当时需要情况是这样的。一个信息录入系统,由于数据量很大,查询需要一段时间。QTP回放时动作比较快,点了保存,程序还没反应过来它就进行了下一步操作。这时的操作就和录制时不一样了,程序给出一个提示,但这个提示是录制过程没有的。弹出框是一般都是POP形势(至上)的,导致QTP无法继续回放,结果就是回放失败。 调皮 
    解决办法有两个:
            1、进行判断,当出现这个提示时,点是/否/取消按钮。
            2、通过 Tools——Recorvery Scenario Manager 设置默认操作。
        我最初就是用的第一种方法。写一个函数判断是否出现这个提示,如果出现就点“取消”然后wait(2)。    每个可能出现弹出框的动作后都调用一次这个函数。虽然可以解决这个问题,但回放的效率就低了,而且需要你预知提示框的信息。
        当我知道了第二种方法,显然更科学^_^。它可以对所有预知甚至不知的提示进行指定的操作。
        实际上,当程序出现了未预知的提示时,可能就是程序的BUG,所以使用上述办法解决工具问题时,也要考虑是否会掩盖程序的缺陷。

    问题三的解决办法:
          用好QTP后,会不自觉的和TD关联起来。但从TD直接启动QTP时,程序只会加载QTP自带的插件,如果你安装了其它插件(如.net、java、etc.),默认是不加载的。这会导致上传的脚本无法正确执行。解决办法很简单,去 Test——Setting里进行Modify 吧。从本地打开的脚本,这里不能进行Modify的。所以办法很简单,但如果不知道的话就很难了。当初为这个问题我可是废了八牛三虎之力呢……

    问题四的解决过程:
         当我开始改代码时,定义一个动作,然后可以生成N个动作。假设N个动作产生了N个结果,你要对这结果进行处理时,你会发现这N个结果都不能被识别:

    网页上有个表格,是往数据库里加数据的。
    两个表格显示在同一个页面上,左边为父表,右边为子表。
    点击左表,右表显示其子项目。 
    结构如下: 闹钟 
    A
    ├─1
    ├─2
    ├─3
    └─4
    B
    ├─1
    ├─2
    ├─3
    └─4
                        ……
    思想很清晰:
    添加一个父项A、选中此父项A、对其添加子项1、2、3、4
    添加一个父项B、选中此父项B、对其添加子项1、2、3、4  ……

    代码也很简单:
    dim M          '定义父项数
    dim N          '定义每个父项包含的子项数

    For i=1 to M
          Call 添加父项( i )       
          选中父项( i )              '问题就出在这里 流泪 
       For j=1 to bwfl step 1
           Call 添加子项( j )
        Next       
    Next

    现在问题出来了,思路应该没有问题(除非这方法真的行不通),循环也是顺着思想来的。

    问题是,无法实现选中的父项(最多识别到一个)。
    由于此循环可以在录制过程进行,如果不改变变量名称,循环可且只可以成功运行一次。问题是这个名称都是从DataTable里获取的。
    因为,在运行过程中生成的项目没有加到对象库中,无法被识别。

       这个问题最后是从思想上解决的。答案是我做的是功能测试,为什么不先加父项,检查父项的功能是否正常,然后再去测子项的功能。不去改变名字,因为那没有必要。核心答案“功能测试、测试功能”。即对测试工具首先需要有正确的认识。
       当然,这个问题可以用代码去实现,但那需要有一定的编程功底且耗时,可维护性不一定好。有需要的朋友可以去试一下,然后把你的经验也共享一下。  *^_^*

    问题五,是对QTP很大的一个扩充。 强 
        对于QTP调用外部DLL的功能,由于我的编程功底不够,没有相关人士配合我,我只能望之垂涎了!
        如果能调用外部DLL的话,QTP的功能就可以变得很强大。自己写的程序,自己编一些过程用QTP进行测试,我想“后果很严重” 偷笑 。真想有一次给我尝试的机会……

    问题六,解决办法有4个:
        1、测试的时候,让程序员把这块限制去掉,免去验证这关。
        2、让程序员提供一个万能验证码,测试可以绕过这一关。
        3、请程序员提供识别的方法,从获取的图片读出验证数据,再传给QTP。
        4、进行位图检查,将验证码分段进行图像验证。

        实际上,验证码的目的就是防止用程序灌水或机器录入信息。所以有点为难我们测试了。
    方法1,如果程序已在发布并有客户使用,危险性是可想而知的。方法2虽然可以解决验证这一关,但跳过了输入码与验证码一致性问题。方法3就需要程序员配合了,可能就需要调用DLL了。方法4却将图像分段,把获取的图像和已经的图像进行比对,比对通过取对应的值;这个在数字验证会好做一点,因为最多就四个图像的比对。
        关于网上的汉字验证码,那块的测试我就不知道他们是怎么做的了。真想了解一下! 红心 
     
        以上就是我对过去QTP学习过程的一个总结。供天下各界朋友参观、发言、讨论,也是对我过去的一个写照,可能N年后,自己看到会很有感觉呢 谄媚 。
        现在又有项目来了,我学习的时间慢慢也少了。新项目里融合了C++程序,QTP对C++的识别似乎很不理想,也许是需要插件支持吧。过程中我尝试了Rational的Robot,Robot对C++的识别很好,但Rational一套组件内容太多,对汉字的支持似乎也不是很好。用了一段时间我就把它从硬盘中给清掉了…… 花谢 
        QTP的学习就在此停住了,不能应用到项目中,单纯看着说明书的学习,我好像不太在行。 微笑 也许是真的需要活学活用,边学边用吧。或者我不够书呆子吧……
503/3<123
Open Toolbar