可不可不要这么样徘徊在目光内 / 你会察觉到我根本寂寞难耐 / 即使千多百个深夜曾在梦境内 / 我有吻过你这毕竟并没存在 / 人声车声开始消和逝 / 无声挣扎有个情感奴隶 / 是我多么的想她 / 但我偏偏只得无尽叹谓 / 其实每次见你我也着迷 / 无奈你我各有角色范围 / 就算在寂寞梦内超出好友关系 / 唯在暗里爱你暗里着迷 / 无谓要你惹上各种问题 / 共我道别吧别让空虚使我越轨 /

发布新日志

  • 测试工作改进建议

    FENHUA927 发布于 2008-06-27 12:07:26

        目前的测试工作是出于比较被动的状态,显示于:
        第一、在开发初步完成后,由测试人员进行测试,然后提出缺陷进行修改,由于测试人员业务与开发知识比较匮乏,因此在需求与系统构建的过程中,很难提出建设性的意见,体现在整个开发过程中,测试人员的作用似乎就剩开发后提交一些缺陷了,因此,开发与管理人员对测试工作的不满与不重视,有一部分原因是因为测试人员的作用没有在各方面到位,建议解决的方法是:测试人员尽量融入到开发中去,融入到开发中去,并不是说测试人员转行做开发,而是从测试的角度理解开发,首先你需要在开发人员讨论系统构建的时候要理解他们的意思,只有理解了他们的意图才能提出自己的建议,在此时提出的建议比在以后编码阶段提出的缺陷更具有意义。而要达到此类程度,你需要成为业务专家、架构师以及普通的开发人员所具备的综合素质,没有必要在各方面达到精深,但是必须在各方面达到理解并能思考这样做的好处是什么,这样的产品在开发出来后有没有比较难于解决的缺陷等等。
        第二、在做的性能测试中,我们往往是在开发人员准备好环境后,通知我们测试的时间,然后我们进行测试,开发人员进行优化,我们得出总结,软件的性能是否达到了标准,我们的总结目前只是出于几个数字与一些图的阶段,复制黏贴,有的还可以进行一些很浅显的分析。总之,利用工具测试的结果数据有很多,但是哪些真正是针对项目的系统性能是有效的数据,我们目前的理解也就只有响应时间、CPU、内存等几个了,但是以上的几个数据仅仅是对于当前测试的系统的性能的展示,而对优化系统而言,需要的结果还应该有导致性能达不到标准的原因,这个原因在测试结果中有多个方面,我们需要从这多个方面中理解分析,找出能进行优化的方面提交上建议,这样的总结才真正体现了测试的价值,而这些,在目前我们的工作中,很少达到。如果我们能够达到这样的程度,随着经验的逐渐积累,我想,当我们没有使用测试工具的时候,在我们进行功能测试的时候,稍微留意以下系统的响应时间,是不是我们在打开页面是能够明显感觉到慢,看看内存、CPU是否占用的比较高,根据经验,我们还是比较容易确定发生问题的原因的,而在此时发现的原因,往往可能是在详设时存在的隐患,因此,我们在详设阶段就应该提出类似的建议,相信那时的建议比在后期性能测试时候的建议更叫有效。
        以上是针对前一阶段测试总结的一点不成熟的想法,但是也是确是在测试工作中存在的问题,希望能够在以后的工作中逐步成熟,将测试工作进行的有效化一些。
  • 干软件测试三年了,对行业的看法(原创,欢迎拍砖)

    victorgly 发布于 2008-07-30 11:22:55

    干软件测试三年了,对行业的看法(原创,欢迎拍砖)


    昨天是2008年7月11日,我入职满三年之日。很多公司都把三年作为一个新人当作公司自己人的一个标志,就像《忠奸人》里所说,这是He's a friend of ours和He's our friend的区别。呆在一个行业里久了,即使再愚钝,也能看出这个行业的整体趋势来。现在大体聊聊这三年对这个行业的看法:
        1、软件测试热门不热门?
        在google中输入“软件测试”,它告诉你共有487万项符合要求的网站。当你看到这篇博客的时候,这个数字可能又增长了,至少,我又贡献了一篇(笑)。看起来蔚为壮观吧,满眼都是用词火辣的新闻告诉你软件测试有多热门、多高薪。
        好了,如果你有基本的新闻鉴别能力的话,你应该能看得出,这些都是软文,全部都是,无一遗漏。赤裸裸的软文。机缘巧合,我有机会接触到几个在软件测试培训机构的朋友,就是目前很热门的“BTEST”和“北大青鸟”。上述你搜到的各个网站发的这些文章,都是他们进行媒体公关的结果。不信?你看看文章的结尾,都或明或暗地提到“你丫该去找个软件测试机构培训一下了”。感觉自己上当了吧?适当问候一下欺骗你感情的媒体吧。
        软件测试工程师的确在国内很紧缺。但是,这个趋势不会持久,这十年来,类似的热门IT岗位我可以举出几十个:网络工程师、WEB程序员、JAVA程序员、嵌入式工程师,不一而足。它们现在怎么样了?全都处于过饱和状态。他们全都是明日黄花了,一朵朵都已经凋谢。软件测试工程师也不例外,它们的今天就是软件测试工程师的明天。
        那这行还能干么?能,只要你够NB。(废话,忽略之。)由于入门门槛不高,初级软件测试人员很快会处于过饱和状态,顶多3年,就会成为街边的地摊货。而且,月薪会低得可怜。但是,高级人才还是会保持紧俏,这在哪个行业都是如此。目前国内的软件测试的水平还普遍偏低,高级人才依然非常少,依然很值钱。
        什么是高级人才?说一下自己不成熟的看法。数据库、中间件、Windows、Linux、Unix都能深刻理解原理,能调整内核参数,如果只是会用那就算了。完全掌握某一门程序语言,达到开发人员的水平,可以写出一切自己想要的小工具。自动化测试、性能测试、白盒测试、安全测试,四个都比较熟悉,并至少精通其中的一个。而且,英语水平要能达到和老外正常沟通。达到这个水平,就很可以笑看云卷云舒了,你已经接近神了,凡人要忍受的裁员、生活压力等痛苦都与你无关。你只需用一颗慈悲的心去同情他们。
        那么报纸上说的,“月薪8千找不到高级软件测试人才”是什么意思?别逗人笑了!这是无知记者想当然编出来的谎话。长安城内,月薪8千顶多找个熟练的中级工程师,真正的高级工程师是不会在菜市场里贴上标签月薪8千代售的,他们只会安静地坐在写字楼里,等着猎头给他们打电话,然后面无表情地回答:“OK,deal.”
    2、关于技术和商务    
        我只是从事过技术,并没有做过商务,但是通过自己的好朋友了解了不少。总的来说,作为技术,除非是去摩根之类的投行做IT,否则在IT公司做技术员工的话,不当领导或当小领导,很牛逼的人,年薪20~25万是上限了,IBM的band8\band9大致如此。有年薪百万的,实在太少。作商务的话,同样的公司,同样程度的员工,年薪的上线应该是50~60W。接触过猎头的朋友都了解,猎头接到命令年薪50w去挖一个商务人员不奇怪,但是如果接到命令年薪50w去挖一个技术员,那雇佣方肯定脑子秀逗了。技术和商务相形见绌,作为IT技术人员,很不甘心,但是,这是事实,铁一般的血淋淋的事实。我们从来不怕落后,只怕自己不敢承认落后。
        商业是一切活动的润滑剂,这个领域是独特而有魅力的。从市场宣传到寻找定位、售前、销售,每一步都是和活生生的人打交道,他们不用彻夜加班。但并不见得就比技术轻松。做商务的好处在于,他们积累的是人脉和关系,这使他们越老越值钱,而且不用被驱动着每天熬夜看书更新自己的知识。而做技术,一个季度不学习,就会有很多新出的东西不明白了。即使你年薪20万,你仍然需要每天下班后熬夜学习新的技术。
        上面这么一对比,技术和商务高下立见。技术相对挣得少,还要每天学习,担心自己老了会失业。但是不要这么轻易就动摇,有的人是天生的程序员,和人说话会咬自己舌头,但写代码就像吸白粉,那你就每年领个20万,可以活得很滋润了,不必转行,不要嫌商务的赚钱比自己多,全聚德的烤鸭卖得好,做烤鸭的师傅肯定挣得不多,就是这个道理;有的人天生喜欢和人打交道,鬼话说得连自己都信,一群人中国人在一起开会就是要用英文,那他天生适合一年领个50万;但如果你是个中间派,不知道自己适合干什么,我也不能告诉你答案,我只能告诉你每个选择的最好结果是如上所述。
    3、关于国内企业和外企
        简单地说:外企钱多,但是年薪50万后,上头都是新加坡和香港的假鬼子了,你上不去。而且IT外企在中国没有核心研发。私企的钱比外企少好几个档次(百度例外),但是,如果你觉得自己很牛,到了犇的级别,就来私企,搞核心研发,要股份(这是关键),工资少,算上股份就比外企多了。
        如果是没牛到那个地步,该怎么选择,相信你看了上面应该已经明白了。
    4、关于创业和打工
        我现在还没有魄力创业,如果没有人脉,要创业,三思。卖馄饨的能搞几千万,但是几千万个里面只有这一个成功了。

    特此: 这是我在博客中写的,第一次发这种装逼文,我算不上技术大犇,但是我的生活圈子能保证文章资料的真实性。我只是一个普通人,不过想让生活过得好一点点。
  • 第一次软件测试面试经历

    sweetxmy 发布于 2008-07-12 23:23:34

        一个偶然的机会,原同事推荐我去他现在所在的公司面试软件测试工程师。

    对于软件测试只有皮毛了解的我,心里非常的紧张。

    1、简历的写作成了大问题

       现在的工作只有一年的经验勉强与测试相关,暂时只好加上。为了有面试的机会。

    技巧性:

      在培训中心的好处是有很多经验丰富的老师,他们曾经是久经沙场的勇士。在测试行业至少有5年以上的经验,有些老师原来也是测试经理或技术总监的职位。对于这种初级的软件测试工程师面试,你只需要将自己的想法与老师讨论。老师会有很多简历写作方法,并传授很多的面试经验。

    收获一:表扬一下自己,多做一个爱问问题的学生。至少去面试前减少了心理障碍,授课老师对每个学生的能力多少有一点了解,他们也会鼓励学生,为一个月以后的正式面试打基础。反正偶的信心是大大的增加了。

    收获二:根据老师的提议,只对自己的简历作了部分修改,既然得到面试的机会,狂喜。

    2、准备面试问答

       面试前两天应该看看培训中心第一册的书,很多概念的知识肯定会被问到。这是最基本的知识,老师上课说过面试题的都应该记住。-----面试时开发经理表扬我的理论知识非常丰富,好开心。其实第一阶段考试时勉强及格在班上只算倒数了,真不好意思拿出来说话。

       还有一点也是非常重要的,面试的公司一般都会问数据库的知识,所以也要记住数据库的一些命令知识。

       最后现在每家公司都希望找到会做自动化测试的人,至少他们觉得对自己公司开发的产品可以用它来测。所以去面试之前一定要对自动化测试工具的用途有所了解。-----再次表扬自己,虽然还没有到第三阶段,但平时会在51的论坛中泡泡,每天只有几分钟的时间,还是记住了一些有关自动化的知识。面试时开发经理问了有关自动化测试的知识,偶是巧妙对答。

    技巧性要学会日积月累,学习累了就上网看看资料。转移自己的注意力,充分运用自己的脑袋。

    3、英文翻译和写作

       通过了前两步,偶心里非常高兴。但也许太兴奋了。周四回家打开电脑,收到同事转发过来的一封邮件,要求将英文翻译成中文。当时真的有点害怕,已经是晚上9点了,数了数还好只有1千多字,但为了保证质量,我花了4个小时把它翻译成了蹩脚的中文。第二天上班时,找培训中心的老师帮忙看,老师回答的第一句话是好像是机器翻译的。当时前几天建立的所有信心瞬间全无。最后还是自己努力的做了修正。

       虽然现在在等待公司的回复,其实答案已经不是太重要了。积累了一次面试的经验。

    技巧性:找同行或培训中心的老师看你翻译后的文档,还有修改的机会。

    小结:有关计算机方面的英语应该尽快补习。从翻译的资料来看,其实是非常简单,只是多了些生词。如果你有掌握计算机英语相信1个小时就可以翻译完成。

    4、多与同事保持联系,建立关系

       我来上海的时间很短,才2年。也许是我性格比较开朗,我和同事的关系保持都很不错。

    有一个小技巧就是你要学会分享快乐,相信你也能够建立良好的人际关系。

    太晚了就说到这吧。有时间再写写第二次蹊跷的面试经历。

     

  • 奥建三和面试

    renyuchen286061 发布于 2008-07-12 18:13:54

    不知为什么今天面试总找不到感觉,听同学说 ,今天的公司就在昨天去的附近,我13:20就到了师大
    暨大后,发现与公司貌似不在那里,然后一路问业务管理的,他们也不是很清楚,嘎嘎,穷人家的孩子
    ,不管打的,只能一路狂跑,便走边跑,到了公司附近,那有两个软件园,我以为就是那一个,结果错
    了,离两点钟越来越近了,没有办法,只有先给HR(人力资源部经理)打了个电话,貌似不是HR接的,
    历尽千辛万苦,14:10终于到了公司(从来没有过的迟到).........
       今天面试的时候,第一关就是HR进行面试,她问了以下几个问题:
        1.自我介绍........(不知道为什么,今天的两次自我介绍都没有进入状态)
        2.住在哪里,广州有没有同学与亲戚,是不是与同学住在一起.......
        3.当我说都是软件测试的同学后,她又问他们都工作了吗,工资多少.........(可能为陷阱)
        4.我当我说2000以上后,她问我2000下点,会不会考虑,最低底线是多少.......(答曰:1800-
    2000)
        5.她问我家具体是湖南哪里,家人是不是都在湖南?(不知道问这有什么意思)
        6.我以前公司的气氛怎么样?(可能为陷阱)
        7.为什么要从医生转为软件测试,同学是不是都是转行过来的?
        8.来广州找过工作没,有没有消息,每次面试后总结过没,是怎么总结的?(请问大家:这个的最
    佳答案)
        9.用三分钟的时间简述我公司录用的要求.......
        10.你简历说的沟通能力与现实不符合,我反驳:我在医院经常与病人沟通,她是个大傻子,她居然
    说病人不喜欢说话,要我举例子,真的是信了她的邪.....
        11.为什么要辞职,试用期的工资是多少?(很郁闷的问题)
        12.你在哪里培训的,培训机构怎么样,感觉怎么样,还把我培训的证书拿过去确认下...........
        差不多了介绍了公司的福利:五星期8小时制,节日礼金+生日礼金+社保........
       最后给了我一个提问的机会:我问测试的规模?
       她没有具体告诉我,她只说现在是一个很薄弱的环节,也是今年抓的重点..........
       忽然之间我恍然大悟,她压根不是在招人,她是在打听测试的行情,为以后招人做准备.........
       最后要我回来等消息..........
    测试工程师  
    电子邮箱: sh-hr@yeah.net  

    发布日期: 2008-06-24 工作地点: 广州市 招聘人数: 2 工作年限: 一年以上

    外语要求: 英语 良好 学    历: 大专        

    职位描述:
    1、计算机操作熟练,曾使用过一些MIS系统;
    2、良好沟通,协助能力;
    3、学习总结能力强;
    4、热爱测试工作;
    5、有参加过专业培训,熟悉软件测试流程,软件测试理论及方法,熟练试用测试工具者优先考虑。

    高级测试工程师  
    电子邮箱: sh-hr@yeah.net  

    发布日期: 2008-06-24 工作地点: 广州市 招聘人数: 2 工作年限: 二年以上

    外语要求: 英语 良好 学    历: 大专        

    职位描述:
    岗位职责:
    1、参与测试技术文档的编写及管理;
    2、负责软件测试及软件缺陷报告;
    3、参与软件质量控制和规范开发过程等工作;
    4、负责软件性能测试及自动化回归测试的实施和推广
    岗位要求:
    1、计算机相关专业大专以上学历,2年以上软件测试经验;
    2、熟悉软件开发过程,软件测试流程,熟练制定系统的测试计划和测试用例,对功
    能测试、集成测试和系统测试有一定的经验,且熟悉常用测试方法及技巧;
    3、能熟练运用测试工具进行测试和编写测试脚本;

    软件公司是一家专业从事建设行业管理信息系统、办公自动化系统及数据采集系统开发及网络集成的高
    科技企业。
    本公司属广州天河软件园园区企业(位于天河北的天城广场),广州市高新技术企业单位,广东省软件行业
    协会会员单位,并于2001年通过了信息产业部"双软"认证及ISO9001:2000认证.主打产品在行业内率先
    通过建设部科技成果评估。软件用户遍及全省各地(200多家)及部分外省市,在全国从事同类型应用软件
    开发的公司中位居前列.并且是建设部相关信息化标准参编单位。
  • 软件项目管理杂谈

    thinker 发布于 2007-12-14 12:26:55

       在一次由软件项目管理者组成的交流会上,看到过我所写的《软件项目管理原则谈》的朋友向我发问,如何在所学的项目管理理论和实际项目实践中找到一条连接的纽带;软件项目管理的度如何把握;为什么项目协调中更多的是貌合神离;为什么自己觉得自己所管理的项目老是失败等等。这一连串的问题引起了与会的项目管理者的同感,笔者本人也曾经在项目管理中屡遭挫折,目前的项目管理中依然麻烦不断。但是,作为一名软件项目管理者来说,在实施项目管理的过程中,笔者觉得在项目管理中,我们的大多数人常常在管理思维中留下一些空白,而这些空白正是我们公正、客观地评判和成功执行软件项目管理的必要途径。

      空白1: 为效益而实施项目管理

      为什么我们要实施项目管理,是为了提高项目的效益。这里所指的项目的效益是一个综合性的指标,包括低风险、高产出等。为此我们不难得出我们在实施项目管理应该掌握的度。即:引入项目管理后所产生的效益减去项目管理的成本后必须大于未引入项目管理时的效益。由于引入项目管理后所产生的效益与项目管理的复杂度(项目管理的成本)并非线性相关的,因此项目管理的复杂度必然存在一个最优值,这就是我们应该把握的度。也许上面的说法比较抽象。一个实际行之可效的判断项目管理的度规则就是:大家认可并且能够准确地理解和实施。拿美国项目管理专家James P Lewis的话说就是 KISS原则(Keep it simple and stupid),拿物理学家爱因斯坦的话说就是:Keep it simple but not too simple.

      空白2: 考虑所处环境

      任何系统都是建立在一个具体的系统环境中的,一般情况下受上一级系统影响最为显著,这是系统论的观点。项目管理是企业管理的下属层次,因此在很大程度上项目管理的成功与否常常受企业管理的制度制约(比如说设备采购的批复等待会延误工期),这就是为什么常常会出现计划不如变化来的快的原因。因为我们在制定计划时根本就没有考虑自身和客户双方的企业管理的环境,所以我们的计划在实施过程中会受到企业管理环境因素的影响。我敢跟你打赌:在没有人事激励机制常常拖欠或故意克扣员工工资但获得CMM5认证的公司开发效率不会比一个没有实施项目管理的开发团队的效率高多少。因为恶劣的公司人事制度扼杀了开发人员的天才和积极性。因此,作为一个项目管理者,审视自身的项目所处的企业环境并做出准确的判断是非常有必要的。缺少良好的项目环境,项目管理者的心血常常白费。这往往是我们中的一些项目经理在不同的公司里项目管理表现大相径庭的原因。

      此外,正是基于企业环境这样一个观点,目前美国PMI,日本ENAA等提出了项目管理成熟度模型(OPM3和P2M),改变了传统PMBOK的缺陷(忽略外部因素和自身的灵活性)。有兴趣的项目管理者可以参看有关项目管理成熟度和企业管理方面(建议参看职业经理人方面)的资料。

      空白3: 合理评判软件项目管理

      我们总是把过多的项目失败归罪到项目经理的名头上。他们的角色常常是替罪羊而不是领导者,他们拥有的更多的是责任而绝非职权。实际上项目失败并非完全决定于项目管理,比如说信息系统过低的报价。一个项目按时在预算范围内完成了而另外一个则没有按时完成,这不意味着第一个项目管理得比较好。因为前者可能是项目时间和成本宽松的项目而后者根本就是不可能完成的项目。前者项目管理的意义在于获得较高的项目效益而后者的意义在于避免更大的项目损失。很可惜,充满了浮躁的软件企业没有诸如此类的意识,一些项目在未开始前注定就是失败的,项目经理们一上手便被扣以一责任人的镣铐。因此,项目管理有无具体效果,需要合理地进行评判,单纯以出效益为上的观点未必有失偏颇。

      空白4: 心理学的必要性

      没有一个领域像软件项目管理中人的因素更为重要,在软件领域没有实现自动化之前,一切试图取代人的主要作用的机制都是收效甚微的。人的行为是心智活动的表现。开发人员的心理活动决定了其在开发的表现。合适的压力能够勾起开发人员的成功欲望但是过大的压力却直接影响着项目参与者的身心健康。特别是后者一直以来都未能引起软件开发界的重视。很多人曾经有过不明不白的辞职经历,在没有学习《管理心理学》之前,笔者对这些人的"过激"行为有时想想都觉得奇怪。作为一个软件项目管理者,不了解和掌握管理心理学,很难针对复杂多变的人的因素采取合理的应对措施,同时自身的心理健康也未必能够得到保证。为此笔者建议有条件的软件企业,可以通过聘用心理顾问来处理员工的心理问题,以此缓和由于工作压力而导致的员工之间矛盾冲突和项目坍塌。

      空白5: 尊重常识,系统性考虑问题

      这个观点笔者在《软件项目管理原则谈》已经重申过。就像不要指望人一秒钟跑二十米一样指望项目中有过多的奇迹出现。可惜我们中的大多项目管理者在进行项目管理时依然实施"大跃进"。我们的管理者都知道自然规律不可违抗性,但是却很少有人意识到一些社会规律的不可违抗性。他们总以为唯物的主观能动性能够替代实际,产生奇迹。加班被认为是解决资源匮乏的唯一途径,通过开发人员"无上"的生产力来达成项目的成功。很少有人会意识到加班造成的疲劳会再次使工作效率降低这一事实。这是一种缺乏常识和系统性思考问题的表现。诸如此类的表现还有"唯工具论"和"唯方法论"。

      实际上,项目管理涉及各个方方面面,一味提高某一方面作用而忽略该方面对其它方面的影响,并不能提高项目管理的层次和最终产出,这是制止我们的项目管理者走偏激(极端)立场的一剂良药,希望项目管理者们能有所意识。

      空白6: 学会思考

      项目管理不是拿来主义,需要项目管理者进行认真的思考。这就是为什么我们项目管理者中不乏PMP和IPMP但是项目却未能如愿以偿的原因。理论和实践的差距极大地挫伤项目管理者的积极性。"证书无用论"所持的观点其依据也在于此。理论是一种完美的抽象,而现实是各种条件的集合。我们的项目管理者在实践上往往生搬硬套而忽略其依存条件,这就是招聘项目经理"唯经验论"的来源。一位项目管理者跟我交流的时候提到无法使用挣值(Earned Value)的概念,原因是公司人事部和财务部不愿意出示员工的收入清单。我建议他将挣值换为挣时(Earned Time),以时间替代成本。从项目进度的意义上来看这两者其实是一致的,问题马上得到了解决。可惜的是我们的项目管理者往往未学会思考具体概念的真正含义之前并匆匆上驴,提着长枪去和风车做斗争去了(注:唐吉诃德)。

      空白7: 学会计划

      现实中我们往往用补救措施代替计划,其效果便如软件缺陷的放大效应。在项目经理的招聘中,你听到的只是几个项目管理白痴问你项目出了什么问题应该怎样解决的提问,这些项目管理白痴在不断地做各种问题假设,而你必须根据假设采取各种符合这些项目管理白痴口味的回答。但是,作为项目管理的来说,项目管理的真正意义在于事先预防各种偏离项目目标的问题出现而不是在于解决问题。古话说得好"磨刀不误砍柴工"。你不能期望癌症有100%的治愈率,但是你可以通过合理的生活习惯和锻炼来防止癌症的出现。我们在进行项目管理时,首先应该考虑如何防止问题的出现,虽然它不能保证所有的问题(风险)都可以避免,但是通过计划,你将拥有更多问题(风险)应对储备,能够在问题出现时有备无患。一个只会在问题出现时考虑应对措施的项目经理只是一个失败的项目经理。其项目结果无异是把健康交给医生而不是自己。作为项目管理的定位来说,项目管理应该是"管理会计"的角色而不是"成本会计"的角色。

      最后,以某电影的台词来结束本文,人为什么犯病?简单的东西想复杂了,复杂的东西想简单了,人就会犯病"。拿这句台词来形容我们目前的项目管理状况一点也不为过。软件项目管理是一个从"自发"走向"自觉"的过程,也是一个从经验主义走向理性主义的过程。软件项目管理是一个主动的管理,而这一切,需要广大项目管理者的项目管理思维和积极实践。

  • 数据驱动在QTP的运用

    xiaonan 发布于 2006-12-12 15:44:56

       前言:

       最近看了不少朋友写的blog文章后,就越显自己的文章比较稚嫩.但我觉得这也是一种学习的方式,现在抱着一种共同学习的态度来探讨一下数据驱动在QTP中运用.很希望看我文章朋友能不吝啬的发表一下自己对这个方面的看法,那真是万分感谢啊.

       所谓数据驱动就是用一个数据文件把测试脚本驱动起来,来达到更接近用户化更智能的测试.其目的是把测试人员从维护复杂的脚本程序中解放出来,只需维护好数据文件即可,减少了很多修改脚本的麻烦.下面讲一下通过四种途径来达到数据驱动.

    1.datatable

    QTP本身程序就给我们提供了这么一个数据表,我们可以把测试数据或测试用例填入这个数据表中.

    如:设计用例

          username  passwd    

    case1  mercury    mercury 

    case2   xxxxxxx     xxxxxx

    录制脚本

    For i=1 to Datatable.GetRowCount   
    Dialog("Login").WinEdit("Agent Name:").Set DataTable("username", dtGlobalSheet)
    Dialog("Login").WinEdit("Password:").Set DataTable("passwd", dtGlobalSheet)
    Dialog("Login").WinButton("OK").Click
    datatable.GlobalSheet.SetNextRow
    Next

    本例是验证一个登录系统,通过DataTable不同的用例设计,驱动起这段脚本,达到测试的效果.当然上面的例子中还少一个很重要的步骤,那就是结果比较.如果不能进行结果比较的自动化测试不能够称为自动化测试.
    当然我们这里主要讲的是数据驱动,所以不在对上面的例子进行补充.

    2.文本文件

    我们可以把文本文件当成数据文件,通过对文本文件的读写操作,来实现数据驱动.

    例:文本文件内的内容

      mercury,mercuy

    读文件的代码

    Function writeorderno(orderno)
    Dim fso, myfile,username,passwd
    Set fso=CreateObject("scrīpting.FileSystemObject")
    Set myfile=fso.openTextFile("C:\testing.txt",1,false)
    tmp=split(myfile.readline,",")
    username=tmp(0)
    passwd=tmp(1)
    myfile.close
    End Function

    写文本文件的代码

    Function writeorderno(orderno)
    Dim fso, myfile
    Set fso=CreateObject("scrīpting.FileSystemObject")
    Set myfile=fso.openTextFile("C:\result1.txt",8,false)
    myfile.writeline orderno
    myfile.close
    End Function

    3EXCEL文件

    我们可以把EXCEL文件当成数据文件,通过对EXCEL文件的读写操作,来实现数据驱动.

    可以把EXCEL文件当作对象的方式来完成写的操作

    Dim Excel,ExcelSheet
    Set Excel=CreateObject("Excel.Application")
    Set ExcelSheet=CreateObject("Excel.Sheet")
    ExcelSheet.Application.visible=true
    ExcelSheet.ActiveSheet.Cells(1,1).value=1
    ExcelSheet.ActiveSheet.Cells(1,2).value=2
    ExcelSheet.ActiveSheet.Cells(1,3).value=3
    Excel.Save "C:\test.xls"
    Set ExcelSheet=Nothing

    用ADO的方式连接EXCEL文件来做读的操作


    Dim conn,input,filename
    filename="D:\公基本情况(tb_gsgk)-标准格式.xls" '
    Set conn= createobject("ADODB.Connection")
    conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source="&filename&";Extended Properties='Excel 8.0;hdr=yes'"
    Set input= createobject("ADODB.Recordset")
    input.Open "select  *   from [公基本情况-标准格式$] " ,conn,2,2 
    input.close
    Set input=nothing

    4.数据库

    可以利用设计数据表,把测试数据和测试用例放在数据表里,用ADO或者其他任何可以访问连接数据库的方式连接数据库,来实现数据驱动

       Dim res,cmd,sql
         Set Res=createobject("adodb.recordset")
         Set Cmd=createobject("adodb.command")
         Cmd.activeconnection="Provider=SQLOLEDB.1;Password=111111;Persist Security Info=True;User ID=sa;Initial Catalog=xhq;Data Source=192.168.191.142"  '这句话是连接数据库的数据源,要做修改
        Cmd.CommandType = 1
        sql="selec t * from 表 where name=username"
        Cmd.CommandText = sql
        Set res = Cmd.Execute()
        Set res = nothing
        Set cmd.ActiveConnection = nothing
        Set Cmd= nothing

    以上四种方法都可以帮助我们实现数据驱动,应该说数据驱动在自动化测试中运用的比较的广泛,才有必要拿出来探讨一下.

  • (转)alibaba测试难题

    dmandy01 发布于 2008-06-17 18:25:18

     

    测试技术方面:

    (一) 功能测试

    1测试环境搭建时编译抛出错误,快速判断是否系代码问题  
    2测试中抛出500错误(或log文件中error),快速判断系代码or数据or外部接口问题
    3自动化测试脚本是否细化验证点为所有可验证内容(页面所有内容显示区域、数据库、搜索引擎、cache、本地cookies等)? 检查细化,但维护量非常大
    4(高优先级) 测试数据准备工具(数据库、搜索引擎、cache等持久化或临时数据)
    5个人pc机本地测试环境差异(操作系统状态、完整性,浏览器版本、完整性),引起问题的原因是软件的添加/卸载,浏览器插件安装/删除,补丁程序,系统设置与浏览器设置等等
    6 数据准备 如:不同类型账号生成,像生成10中供新单账号, 10个中供服务中账号等等,批量生成而不需要手工完成,否则效率慢了。
    7 搜索引擎支持多个站点,每个站点又有不同的数据应用,se.conf存在众多的配置项、分词器,测试的矩阵非常庞大,如何保证尽少资源获取最好测试效果
    8 抽样检查分词器的功能有遗漏,但分词器算法和外部已有的分词器算法不同,如何提高分词效果核对效率
    10 海量数据查询结果正确性验证

    (二) 性能测试
      1 生产环境硬件模拟
                    生产环境依赖于外部昂贵的设备,在测试环境开展性能测试如何模拟?比如有专用邮件服务器,图片服务器,CACHE服务器?
            2 数据模拟
                生产环境的数据量巨大,如何剪裁合适的数据集作为性能测试基准数据?
            3 用户行为模拟
                      虽时间变化日志系统分析的数据会很快过时,如何低成本跟进访问模式
              
      4 特殊场景下性能瓶颈定位与监控等等
          比如国际站凌晨2点突然LOAD 升高,原因未明
      5  容量规划的效果如何衡量
       

    (三) 质量管理平台
    1 没有缺陷报告平台,需要详细或自定义报表时无法给出   
                    如QC 的报表、需求管理2部分功能一直没有采用。
    2 项目管理、需求管理、缺陷管理多个系统入口, 并没有统一关联。另外代码与需求之间映射关系随着业务变更也难以一一映射
    3  现有的软件测试平台更适合传统的大型软件测试,能否、如何定制更适合快速上线的WEB系统?
          
    (四) 测试管理
    1 测试机器的使用权限(Linux、Windows)管理,做到近少互相干扰
    2 如何有效度量测试工程师的绩效?
    3 (高优先级) 如何更快找到合适的测试人才?
    4 (高优先级)如何提高开发、测试双方的满意度?
    5 (高优先级)如何提高估计测试时间的准确度?
      
    (五) 测试新技术的应用与推广  

    1  如何有效开展安全与漏洞测试
    如:sql注入,cookie安全机制,安全证书、加密等. 服务器与客户端的安全漏洞检测等
    2 白盒测试工具引入及白盒技术等
    如:单元测试工具Junit, parasoft的白盒测试工具使用与引入等。
    3 自动化测试在项目中是否需要介入,何时介入?(数据准备?回归测试?)
    4  如何在自动化覆盖率和验证点密度  与自动化成本间找到一个合理的平衡点


    测试策略与方法方面
    (一) 测试用例分析与设计
      1 冗余的测试用例的精简化问题
      2 (高优先级) 底层代码的修改如何测试,回归范围如何确定,测试策略如何确定?
    如 ejb, jboss改造的性能与功能测试
      3 如何使用冒烟测试对大型软件进行快速测试,用例的选择问题
      4 如何为复杂产品/大型测试项目选取测试策略? 如
    镜像站点测试
    异地数据同步测试
    重构项目测试  
      5 Apache Modul如何测试(功能测试与性能测试)如中文站最近发布的将Image server固定域名通过modul替换成动态域名?
      
      6 (高优先级)支持多浏览器(IE6/ie7/firefox...)/多OS软件如何测试? 支持国际化语言版本的软件如何测试?如国际站网站支持英文,繁体版,马来西亚语言。

         降低成本的测试方法有哪些?
        正交表测试方法满足我们的需求么?
      7 (高优先级)如何在时间、进度压力下,最优选取测试集合?回归测试的面积多大算合理?

      8(高优先级) 跨部门、跨公司的接口测试如何开展,以提高协调效率?
         如中文站和阿里软件贸易通状态接口,国际站和后台CRM 接口,

    (二) 测试执行

    1开发的代码中缺少足够的接口来支持自动化或者黑盒测试的问题
    2 反复测试引发的测试疲劳如何应对(个人、团队)?交叉测试什么时候引入合适?如何衡量交叉测试的绩效?

    (三) 测试标准
    1 如何定义测试“完成”,比如如何定义搜索引擎测试完成?
    2 如何提升对项目是否可以release的影响力
    3 (高优先级)如何清晰度量产品的测试质量
    按测试覆盖率?按BUG遗漏数?按已经发现BUG的曲线图?哪些标准度量最合适
    4 测试人员是否需要了解代码,了解代码需要到达何种程度?
    5 如何在没有单元测试代码情况下,度量代码测试覆盖

  • 转:QTP测试报表table内容的思路

    annt7 发布于 2008-06-11 17:52:11

    转自:51Testing软件测试博客

    使用QTP对报表中的webtable内容进行正确性验证。

        基本思路是:

        一:使用getcelldata(i,j)的方法遍历webtable把表格内容存入一个数组中,一般为二维数组

        二:使用数据库连接组件ADODB连接后台数据库,使用数据结果集对象保存select查询结果,也是一个二维数组

        三:此时区分是否需要验证排列顺序,如果需要,直接对两个二维数组进行一对一遍历比较

        四:不需要验证排列顺序,或者顺序无法控制的情况下,我们需要对显示内容和查询预期内容进行比较,这时候牵涉到两个结果集的数据顺序问题,如果采用单对多遍历的情况,效率会十分低。

        这时候我们换一种思路考虑,既然是验证内容,那我们就可以把二维数组的验证转换成排序一维数组比较,实现方式是,采用join方法将二维数组的每一行转换成一个字符串(内容没有变化,只加入拼接符),两个二维数组进行相同转换,成为两个一维的字符串数组。

        然后使用快速排序法对两个一维数组进行一次排序,同样的机制下,如果原本内容相同,那么排序出的内容也应该相同。然后直接进行一维数组一对一比较。

        下面是vbs的快速排序代码,合适数字和字符串数组:

    Public Function QSort(ByRef ReArr, ByVal head, ByVal tail)

    'ReArr 是待排序数组, head和tail是该数组的最小下标和最大下标
    Dim lef, rig
    Dim pivot

    If head < tail Then
     lef=head
     rig=tail
     pivot=ReArr(lef)
     While (lef <> rig)

      While (lef < rig and ReArr(rig) >= pivot)
       rig = rig-1
      Wend
      If lef <rig Then
       ReArr(lef) = ReArr(rig)
       lef = lef+1
      End If

      While (lef < rig and ReArr(lef) <= pivot)
          lef = lef+1
      Wend
      If lef <rig Then
       ReArr(rig) = ReArr(lef)
          rig = rig-1
      End If
     
     Wend

     ReArr(lef) = pivot
     call QSort(ReArr, head, lef-1)
     call QSort(ReArr, lef+1, tail)
     
    End If
    End Function

  • 转:QTP的Action间的信息共享的4种方法

    annt7 发布于 2008-06-11 17:50:12

    转自:陈能技的博客

    通过Action参数来传递数据
     
    Action2的脚本如下:
    ' Input Parameters
    Message = Parameter("Msg")
    Msgbox Message
     
    ' Output Parameters
    If NOT Message = "" Then
           Parameter("ReturnMsg") = "The Message is " & Message
    Else
           Parameter("ReturnMsg") = "The Message is Empty!"
    End If
     
    ' RetuenValue
    ExitAction "HAHAHAHHAHA!!!!!"
    'ExitAction Parameter("ReturnMsg")
     
     
    3种调用Action的方法,Action1的脚本如下:
    ' 调用Action2,输入参数为 “ Hello!”,把输出参数值写到ReturnMessage1变量
    RunAction "Action2", oneIteration,"Hello!" ,ReturnMessage1
    Msgbox ReturnMessage1
     
    ' 调用Action2,输入参数为 “ Hello!”,通过Parameter方法读取输出参数值
    RunAction "Action2", oneIteration,"Hello!"
    ReturnMessage2= Parameter("Action2","ReturnMsg")
    Msgbox ReturnMessage2
     
    ' 如果被调用的Action使用了ExitAction来退出Action并返回ReturnValue,则可以使用下面的方式来获取Return Value的值
    ' 注意OutPut Parameters与Return Value的区别
    ReturnMessage3 = RunAction( "Action2", oneIteration ,"Hello!")
    Msgbox ReturnMessage3
     
            通过全局数据表(Global Data Table)来共享数据
     
    在Action1中设置参数值,Action1的脚本如下:
    ' 获取全局数据表
    Set Sheet = DataTable.GetSheet("Global")
    ' 查找参数列
    Set Parameter1 = Sheet.GetParameter("Column1")
    Set Parameter2 = Sheet.GetParameter("Column2")
    ' 设置参数值
    Parameter1.Value="Hello"
    Parameter2.Value="World!"
    ' 调用Action2,Action2将使用前面设置的参数值
    RunAction "Action2", oneIteration
     
    在Action2中读取参数值,Action2的脚本如下:
    ' 获取全局数据表
    Set Sheet = DataTable.GetSheet("Global")
    ' 读取参数值
    Set Parameter1 = Sheet.GetParameter("Column1")
    Set Parameter2 = Sheet.GetParameter("Column2")
    ' 使用参数值
    Msgbox Parameter1 &" " & Parameter2

  • LR高级技巧实战

    tester_ran250 发布于 2007-12-07 18:03:17

     

    1.概述
            在山东BOSS性能压力 测试 过程中,发现脚本对于整个压力测试过程的重要性,一个压力测试脚本录制和编辑修改得怎么样直接影响后面压力测试的执行。通常情况下,脚本应尽可能的精简,就像写代码一样。针对BOSS系统的特点, 个人 认为把单一业务录制成一个Action,并在脚本中添加Transaction,Find检查(可以采用URL-based scrīpt 方式录制并事先设定),Rendezvous,参数化等基本元素,然而有时我们会发现光有这些基本元素还不能满足我们的要求。比如在Controller中运行我们的脚本时,一旦压力过大或某种原因导致某一业务失败,而此时我们很想尽快地找出错误的原因。当然此时我们第一想到的是,查找 日志 ,但是有时发现查找日志很不方便,因此我们希望寻求一种更快捷的方式,希望能直接从Controller的Errors错误中找到出错的服务号码、在第几次Iteration的哪个Transaction出错。实现的方式,当然是通过简单的编程来调用错误日志里的信息,另外本文中还简单介绍了关于 LoadRunner 工具使用的一些常用注意事项、脚本处理技巧和一些常用性能参数的分析及 性能测试 中机器瓶颈的定义和查看机器瓶颈的相关命令。
            下面再具体的一一介绍。

    2.一个规范的性能测试脚本就像一段规范的程序代码一样,需要基本的说明信息:
    在下面要介绍的脚本中,我把这些信息以注释的形式放在vuser_init最前面:
    /*
    @corporation:Copyright By *** Technologies CO.,LTD. All Rights Reserved.
    @Athour:XuLinLin
    @Date:2005-09-18
    @Name:异地缴费压力测试脚本
    @Parameter:BOSSURL,LogName,PhoneNum,iteration,FanHui
    @Data:BOSSURL:BOSSURL.dat; //由于BOSS压力测试前台展现环境多,故将地址也参数化。
    LogName:LogName.dat; //登录用操作员,选择具备异地缴费权限的操作员,这里选择的是德州操作员300个。
    PhoneNum:PhoneNum.dat; //用于异地缴费的服务号码,这里选择的是烟台的正常在用的标准全球通号码3000个。
    iteration:iteration.dat; //用于压力测试出错时,打印出错所在的循环次数。
    @Descrīption:此脚本用于测试异地缴费的性能及稳定性,选用德州的操作员对烟台的标准全球通号码进行异地缴费,目标是
    通过vuser模仿真实操作员进行异地缴费,达到验证或测试系统性能和稳定性的目的。
    @Notes:脚本的录制使用的是LoadRunner8.0的VU,采用的是URL-based scrīpt方式,需要特别注意的是Recording Options(按Ctrl+F7)
    的Advanced 选项里的Surport Charset一般情况默认为不选,除非字符集合采用的是国际标准才选中UTF-8选项,否则会出现汉字乱码现象。
    */

    3.通常情况下,任何业务必须在登陆成功后才能做,所以有必要对登陆成功与否进行判断:
    下面我从脚本中取出相关部分进行简单介绍:
    vuser_init()
    {
    int status; //定义变量用于判断登陆是否成功
    web_reg_find("Text="山东移动BOSS"",
    LAST);
    …….
    …….
    web_submit_data("reguserAction.do", //登陆提交数据Action。
    "Action="http://{BOSSURL}/boss/reguserAction.do"",
    "Method="POST"",
    "RecContentType="text/html"",
    "Referer="http://{BOSSURL}/boss/index.jsp"",
    "Snapshot="t12.inf"",
    "Mode="HTTP"",
    ITEMDATA,
    "Name="logname"", "Value="{LogName}"", ENDITEM,
    "Name="password"", "Value=", ENDITEM,
    LAST);
    status = web_submit_data("reguserAction.do", // 取成功与否标志
    "Action="http://{BOSSURL}/boss/reguserAction.do"",
    "Method="POST"",
    "RecContentType="text/html"",
    "Referer="http://{BOSSURL}/boss/index.jsp"",
    "Snapshot="t12.inf"",
    "Mode="HTTP"",
    ITEMDATA,
    "Name="logname"", "Value="{LogName}"", ENDITEM,
    "Name="password"", "Value=", ENDITEM,
    LAST);

    if (status ="=" LR_FAIL) //一旦登陆失败,脚本给出提示报错信息。
    {
    lr_error_message("错误信息: %s", "不能正常登陆!");
    return -1;
    }
    }

    4.事务的定义,很简单,也很有必要,尽量是每个定义的事物符合逻辑和小。
    在下面的脚本中,在异地缴费这一业务中定义了两个Transaction:准备异地缴费数据和提交异地缴费,见如下脚本代码:
    lr_start_transaction("准备异地缴费数据");


    web_set_max_html_param_len("4096");
    ……….
    web_submit_data("chargeacc.do",
    "Action="http://{BOSSURL}/boss/charge/commonbusiness/acccharge/chargeacc.do?act=queryaccount"",
    "Method="POST"",
    "RecContentType="text/html"",
    "Referer="http://{BOSSURL}/boss/charge/commonbusiness/acccharge/acccharge.jsp?act=first"",
    "Snapshot="t74.inf"",
    "Mode="HTTP"",
    ITEMDATA,
    "Name="isconfirm"", "Value="no"", ENDITEM,
    "Name="chargetype"", "Value="telnumber"", ENDITEM,
    "Name="telnumber"", "Value="{PhoneNum}"", ENDITEM,
    "Name="nowfee"", "Value="0.0"", ENDITEM,
    "Name="factfee"", "Value=", ENDITEM,
    "Name="totalfee"", "Value="0.0"", ENDITEM,
    LAST);
    lr_end_transaction("准备异地缴费数据", LR_AUTO);

    5.增强脚本,对脚本进行简单的编程。
    增强脚本,对脚本进行简单的编程,为性能或压力测试提供方便,这也是写
    本文的宗旨,下面对此做简单的介绍:
            5.1首先,定义成功与否的判断标志或字符串。
            在此,我把判断成功与否的标志定义在异地缴费Action 最前面,具体定义如下:char fanhuiflag[30]="操作业务数据成功!";
    但是大家可能会问,字符串"操作业务数据成功!"从何处而来,可以肯定的不能凭空想象,成功标志可从两三种方式来取得:
    第一种:也是最简单的一种,直接从脚本中取得,具体操作是以View Tree 方式找到相关的界面,然后从Server Response的Snapshot的Body里去取。见下面的 图片
    注:Snapshot在录制前要将Recording Options>Advanced里的Save snapshot resources locally 选项选中。

     


            第二种方式,从脚本代码中去取,即取find函数中相关字符串,具体做法是,找到在提交事件前的web_reg_find函数,然后从中取相关字符串。
    web_reg_find("Text="---------操作业务数据成功!--------"",
    LAST);
    值得注意的是要有web_reg_find函数,可以在录制前选中Recording Options>Advanced里的Generate web_reg_find functions for page titles 选项。


            第三种方式,从本地的snapshot里去取,具体操作,首先找到提交数据事件相关脚本,找到snapshot文件的名称,然后从本地的data文件里去找这个snapshot文件,然后丛中找到我们需要的字符串。
    web_reg_find("Text="---------操作业务数据成功!--------"",
    LAST);
    …….
    web_submit_data("chargeacc.do_3",
    "Action="http://{BOSSURL}/boss/charge/commonbusiness/acccharge/chargeacc.do?act=submit&atype=commitdata"",
    "Method="POST"",
    "RecContentType="text/html"",
    "Referer="http://{BOSSURL}/boss/charge/commonbusiness/acccharge/chargeacc.do?act=querycustomer"",
    "Snapshot="t129.inf"",
    "Mode="HTTP"",
    ITEMDATA,
    "Name="isconfirm"", "Value="no"", ENDITEM,
    "Name="chargetype"", "Value="telnumber"", ENDITEM,
    "Name="telnumber"", "Value=", ENDITEM,
    "Name="nowfee"", "Value="8.8"", ENDITEM,
    "Name="factfee"", "Value="0.00"", ENDITEM,
    "Name="totalfee"", "Value="8.8"", ENDITEM,
    "Name="accountno"", "Value="{WCSParam_Diff1}"", ENDITEM,
    "Name="factpay"", "Value="8.8"", ENDITEM,
    "Name="grantpercent"", "Value=", ENDITEM,
    "Name="grantfee"", "Value="0"", ENDITEM,
    "Name="takecash"", "Value="8.8"", ENDITEM,
    "Name="zero"", "Value="0"", ENDITEM,
    "Name="paytype"", "Value="Cash"", ENDITEM,
    "Name="remark"", "Value=", ENDITEM,
    "Name="invoice"", "Value="joininvoice"", ENDITEM,
    LAST);

            5.2设置和保存判断成功与否的参数,这也是最关键的地方。
    有一点大家都很清楚,业务成功返回的字符串和失败返回的字符串是不同的,我们所要做的是将返回的字符串做为参数保存下来,然后拿这个参数和我们事先定义好的成功的标志做比较,有两种方式可以设置和保存这一参数,下面简单介绍:
    第一种方式也是最准确的方式,是以View Tree 方式找到相关的界面,然后从Server Response的Snapshot的Body里的成功的返回标志,然后对其进行Create Parameter,这样LoadRunner会自动在脚本中添加web_reg_save_param函数,具体如下:
    // [WCSPARAM WCSParam_Text2 24 操作业务数据成功!_Text2] Parameter {WCSParam_Text2} created by Correlation Studio
    web_reg_save_param("WCSParam_Text2",
    "LB="---------"",
    "RB="-"",
    "Ord="1"",
    "RelFrameId="1"",
    "Search="Body"",
    LAST);

     

            第二种方式是在提交事件前添加web_reg_save_param函数,具体操作是在提交事件前右击鼠标选择Insert Before 选项,然后在弹出的对话框中选择Services里的web_reg_save_param选项,单击OK按纽,然后在弹出的对话框中输入相关的数据。

     


            5.3 编写相关判断代码段。
            在已经定义好判断字符串和设置和保存好成功与否的标志字符串参数后,编写相关判断代码段,这也是最关键的地方,具体代码段如下:
    if (strcmp(fanhuiflag,lr_eval_string("{WCSParam_Text2}"))!="0)
    {
    lr_error_message("消息: %s,在第 %s 次循环时出错,出错号码:%s", "提交异地缴费数据失败!", lr_eval_string("{iteration}"), lr_eval_string("{PhoneNum}"));
    }
    简单解释如下:
    fanhuiflag:前面已经定义好的成功标志字符串的数组名,当然前面也可以用指针来实现,这里不做介绍。
    WCSParam_Text2:为实现设置和保存好的成功与否返回的字符串的参数;
    PhoneNum:服务号码的参数化,具体为电话号码。关于参数化,这里不做分析和解释部分。
    Iteration:为了定位具体的循环而设置的参数。
    Strcmp函数:LoadRunner自带的字符串比较函数,相等时返回0
    lr_eval_string函数:LoadRunner自带求字符串函数,函数格式为
    char * lr_eval_string (const char * instring );
    (另一种判断方式:先事先定义好int rc="1;" char *fanhuiflag="操作业务数据成功!";然后在定义事务的结尾进行判断: rc="strcmp(str_tip,lr_eval_string(""{re_str_tip}"));
    if(rc="=0)"
    {
    lr_end_transaction("异地缴费_提交", LR_PASS);
    }
    else
    {
    lr_error_message("异地缴费_提交失败,号码为:%s",lr_eval_string("{msisdn}"));
    lr_end_transaction("异地缴费_提交", LR_FAIL);
    }
    //lr_end_transaction("异地缴费_提交",LR_AUTO);)

            5.4验证我们的需求是否实现
            下面简单介绍,整个验证过程,在确保脚本正确和测试环境正常的情况下,我们先在VU里验证下是否真正实现了我们想要的功能,为了方便,我特地将判断条件该为="=而不是!=,通过查看日志来检查。

            首先,选中菜单栏里的Run-time Settings子菜单,设置里面的Log选项,选中Enable Logging 和Always send messages 和Extended log 及Parameter substitution。
    设置Run Logic 里的Number of Iterations 为2,然后运行,并查看日志。可以得到如下的日志(只取了关键部分的):
    第一次循环关键部分:
    YiDiJiaoFei.c(598): Notify: Transaction "提交异地缴费数据" ended with "Fail" status (Duration: 4.8459 Wasted Time: 0.0060).
    YiDiJiaoFei.c(605): Notify: Parameter Substitution: parameter "WCSParam_Text2" = "操作业务数据成功!"
    YiDiJiaoFei.c(607): Notify: Next row for parameter iteration = 1 [table = iteration].
    YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "iteration" = "1"
    YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "PhoneNum" = "13953555588"
    YiDiJiaoFei.c(607): Error: 消息: 提交异地缴费数据失败!,在第 1 次循环时出错,出错号码:13953555588

    第二次循环关键部分:
    YiDiJiaoFei.c(598): Notify: Transaction "提交异地缴费数据" ended with "Fail" status (Duration: 4.2347 Wasted Time: 0.0064).
    YiDiJiaoFei.c(605): Notify: Parameter Substitution: parameter "WCSParam_Text2" = "操作业务数据成功!"
    YiDiJiaoFei.c(607): Notify: Next row for parameter iteration = 2 [table = iteration].
    YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "iteration" = "2"
    YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "PhoneNum" = "13953572390"
    YiDiJiaoFei.c(607): Error: 消息: 提交异地缴费数据失败!,在第 2 次循环时出错,出错号码:13953572390

            下面验证执行时,能正确找到出错的号码信息,将脚本加入到场景后,同样设置好Run-time Settings。

            设置结果保存路径等相关信息,按Start Scenario 执行场景,等出错是单击右上角的Errors,然后选中错误信息再按Details按纽查看错误信息。

    6.怎么样使多台产生vuser的测试机均匀地对被测试的系统施加压力?
    在测试的过程中,为了尽可能减少或者避免本身的测试机成为测试过程中的瓶颈,需要使用多台测试机产生vuser对被测试系统施加压力,下面对操作步骤做简单介绍:
            在默认模式下使用controller添加多台Generators机器时,不管你怎么加,最终能真正起作用的只有一台(10.19.180.2/3/4或localhost):

    为了让10.19.180.2/3/4机器同时能真正被添加进去,我们需要做以下几步工作:
    改变场景模式,将组模式()改变为百分比模式(percentage mode),具体做法是,选择Scenario菜单下的Convert Scenario to the Percentage Mode;

    然后,在已经添加好的Load Generators机器列表中同时选择你想选择的机器;

    最后,点OK按钮就可以得到我们所要的结果了。

    当然,如有必要我们还可以把场景模式改为Vuser Group Mode,具体做法如下:
    选择Scenario菜单下的Convert Scenario to the Vuser Group Mode;

    然后在弹出的对话框中,单击Yes按钮可以得到如下结果,

    到此为止,添加多台Load Generators测试机整个过程就完成了,其实很简单,关键是你发现了没有。

    7. 怎么样在关联时取列表的最后一个值(在测试重打发票取流水号时需要)?
    在压力测试脚本的关联过程中,我们有时可能需要关联最新的值(如最新的流水号,通常情况下,最新的流水号放在列表的最下方),所以找最新的流水号就是最列表最下方,如果保存在数组里,那就是找index值最大的那个元素。下面以重打发票(注:具体流程为先缴费,然后查询缴费历史,然后从缴费历史里找到最新的流水号,然后使用此流水号进行重打发票)为例对整个过程做详细的介绍:
    首先,在缴费历史里找到需要关联的流水号并关联之,具体做法如下,
    7.1以Tree View方式打开脚本并在对应事件的Page View里找到最新的流水号

            找到我们需要关联的流水号(这里为536dxwf0200051031000000)后,需要把它给关联,(因为返回的值是事后才知道的,且对于不同的电话号码,对应的返回值不同,所以对于这样的值是需要关联的。)具体做法是打开Server Response 页面并在Body里找到需要关联的流水号,然后选中此流水号并在右键弹出的菜单中使用Create Parameter关联之。

     


    7.2单击是(Y)按钮,对应的脚本中会增加如下内容。

            单击View scrīpt 图标以scrīpt模式查看关联情况。

    7.3到此为止脚本中多出如下代码段,下面对它做一定的分析:
    web_reg_find("Text="缴费历史查询"",
    LAST);
    // [WCSPARAM WCSParam_Text1 23 536dxwf0200051031000000] Parameter {WCSParam_Text1} created by Correlation Studio
    web_reg_save_param("WCSParam_Text1",
    "LB="formnum="",
    "RB=\"",
    "Ord=8",
    "RelFrameId=1",
    "Search=Body",
    LAST);
    //后面的内容为注释部分,说明流水号536dxwf0200051031000000已经关联并保存到WCSParam_Text1参数中。
            web_reg_save_param()为LoadRunner的保存参数所用的函数,其作用是将返回流水号保存到WCSParam_Text1参数中,以便使用不同的号码进行缴费历史查询出来的流水号能随着时间的变化流水号也跟着变化,而不是录制脚本时的536dxwf0200051031000000,这样可以避免在重打发票时不会报诸如此流水号不存在等类似错误信息。然而现在的问题是怎么将此流水号对应到重打发票对应的地方。另一个问题是,不是所有的号码缴费后查询到的流水号数量都和录制脚本时查询到的流水号相同,事实上每做一笔除查询类的操作都会有一个流水号。而我们关注的是怎么取到最新的缴费的流水号,下面详细介绍相关步骤。

    5.1 修改web_reg_save_param()函数相关部分,很简单,把"Ord="8"",改为"Ord=ALL",目的是找最TOP的那个参数值。

    5.2 光保存和取参数还不够,我们需要把参数能正确传递到重打发票对应的地方,为此我采取的做法如下:
            在缴费历史事件脚本最前面定义两个变量,目的是为了将流水号以字符串的形式保存在变量里(因为LoadRunner不支持在web_submit_data()函数里直接使用变量):具体做法是:
    char WCSParam_Text1Pram[50]; //保存取到的流水号
    char WCSParam_Text1PramVal[50]; //保存以"Value="流水号""取到的流水号。


            将关联好的流水号存到变量里,在此的做法是在对应的web_submit_data()函数后添加如下代码段:
    lr_message("WCSParam_text1:%s",lr_eval_string("{WCSParam_Text1}"));
    //打印出关联的参数WCSParam_Text1的值。
    sprintf(WCSParam_Text1Pram,"{WCSParam_Text1_%s}",lr_eval_string("{WCSParam_Text1_count}"));
    //把取到流水号保存到WCSParam_Text1Pram里,具体形式为
    sprintf(WCSParam_Text1PramVal,"Value="%s"",lr_eval_string(WCSParam_Text1Pram));
    //组合流水号和”Value=”并保存到WCSParam_Text1PramVal变量中。
    lr_message("The value argument is : %s", WCSParam_Text1PramVal);
    //打印出字符串变量WCSParam_Text1PramVal的值。

     

    5.3 找到重打发票中响应的流水号,并把其中的"Value="536dxwf0200051031000000""替换成WCSParam_Text1PramVal,在这里总共有两处。

     

            到此为止,流水号的关联已经基本上处理完毕,下面我们执行脚本,来验证我们想要的是不是真的有效。(注,参数化的问题在本文中不做具体介绍)为了看到明显的效果,我们需要将日志的处理做简单设置。

            然后执行脚本,查看相关执行日志,可以得到类似下面得消息。

     

    8.使用LoadRunner一些常用的注意事项:
    Note1:VuGen仅能录制 Windows平台上的会话,但是,录制的Vuser脚本既可以在Windows 平台上运行,也可以在 UNIX 平台上运行。
    通用 Vuser 函数和特定于协议的函数,它们共同构成了 LoadRunner API,并使Vuser能够直接与服务器通信。

    Note2:用于运行Vuser脚本的C解释器仅支持ANSI C语言。它不支持 Microsoft对ANSI C的任何扩展。
    通常情况下,可以将登录到服务器的活动录制到vuser_init部分中、将客户端活动录制到Actions部分中,并将注销过程录制到vuser_end部分中。

    Note3:只能向Action部分(而不是init或end 部分)添加集合。
    Note:不要从事务内部发送消息,因为这可能使事务执行时间变长,并扭曲事务结果。

    Note4:如果使用日志运行时设置修改脚本的调试级别,则 lr_message、lr_output_message 和 lr_log_message 函数的行为将不会更改,它们将继续发送消息。

    Note5:录制 Java Vuser 脚本时, Vuser 脚本中将不生成 lr_think_time 语句。

    Note6:VuGen 新建参数,但不会自动替换任何在脚本中选定的字符串。

    Note7:不要将参数命名为 unique,因为该名已被 VuGen 使用。

    Note8:如果在常规运行时设置文件夹中将“错误处理”设置为“出现错误时仍继续”,则错误消息仍将被发送到输出窗口。

    Note9:因为生成的服务器消息很长,而且日志记录会降低系统的运行速度,所以请仅为脚本中特定的代码块激活服务器消息日志记录功能。

    Note10:启用“出现错误时仍继续”功能时,将覆盖 0 严重级别;即使发生数据库错误,也将继续执行脚本。然而,如果禁用了“出现错误时仍继续”功能,但将严重级别指定为 1,则当发生数据库错误时仍将继续执行脚本。

    Note11:下列协议不是线程安全协议:Sybase-Ctlib、Sybase-Dblib、Informix、Tuxedo 和 PeopleSoft-Tuxedo。

    Note12:对于支持树视图的协议(如“视图”菜单所示),在树视图中运行 Vuser脚本时, VuGen 将从 Vuser 脚本中的第一个图标开始运行该脚本。

    Note13:要显示运行时查看器,必须安装 Microsoft Internet Explorer 4.0 或更高版本。
    Note:Vuser 生成“结果摘要”报告时,事务时间可能会增加。Vuser 可以仅在从 VuGen 运行时才生成“结果摘要”报告。使用 Controller 运行 Web Vuser 脚本时, Vuser 不能生成报告。

    Note14:当使用 Javascrīpt 和 VBscrīpt Vuser 时,在脚本中用到的 COM 对象必须完全的兼容。这使下列情况成为了可能:一个应用程序操纵另一个应用程序中的对象,或者公开对象以便操纵它们。

    9.性能参数解析:
    WEB资源参数

            每秒点击次数:中Vuser每秒向Web服务器提交的HTTP请求数,依据点击次数来评估Vuser产生的负载量。

            吞吐量:案运行过程中服务器上每秒的吞吐量。吞吐量的度量单位是字节,表示Vuser在任何给定的某一秒上从服务器获得的数据量,依据服务器吞吐量来评估Vuser产生的负载量。

            每秒HTTP响应数:中每秒从Web服务器返回的HTTP状态代码号(表示HTTP请求的状态,例如“the request was successful”、“the page was not found”)

            每秒下载页面数:每秒钟从服务器下载的网页数,依据下载的页面数来评估Vuser产生的负载量。

            每秒重试次数:中每秒钟内服务器尝试的连接次数,在下列情况下将重试服务器连接:初始连接未经授权、要求代理服务器身份验证、服务器关闭了初始连接、初始连接无法连接到服务器或者服务器最初无法解析负载生成者的IP地址。

            连接数:每个时间点上打开的TCP/IP连接数。

            每秒SSL连接数:每秒打开的新的以及重新使用的SSL连接数。当对安全服务器打开TCP/IP连接后,浏览器将打开SSL连接,因为新建SSL连接需要消耗大量的资源,所以应该尽量少地打开新的SSL连接。

    网页细分图
            注意:由于要从客户端测定服务器时间,因此,如果发送初始HTTP请求到发送第一次缓冲这一段时间内网络性能发生变化,则网络时间可能会影响此测定。因此,所显示的服务器时间是一个估计值,可能不太精确。
    DNS解析:显示使用最近的DNS服务器将DNS名称解析为IP地址所需的时间。“DNS 查找”度量是指示DNS解析问题或DNS服务器问题的一个很好的指示器。

            连接:显示与包含指定URL的Web服务器建立初始连接所需的时间。连接度量是一个很好的网络问题指示器。此外,它还可表明服务器是否对请求作出响应。

            第一次缓冲:显示从初始HTTP请求(通常为 GET)到成功收回来自Web服务器的第一次缓冲时为止所经过的时间。第一次缓冲度量是很好的Web服务器延迟和网络滞后指示器。注意:由于缓冲区大小最大为 8K,因此第一次缓冲时间可能也就是完成元素下载所需的时间。

            SSL握手:显示建立SSL连接(包括客户端 hello、服务器hello、客户端公用密钥传输、服务器证书传输和其他部分可选阶段)所用的时间,自此点之后,客户端与服务器之间的所有通信都将被加密。SSL握手度量仅适用于HTTPS通信。

            接收:显示从服务器收到最后一个字节并完成下载之前经过的时间。“接收”度量是很好的网络质量指示器(查看用来计算接收速率的时间/ 大小比率)。

            FTP验证:显示验证客户端所用的时间。如果使用FTP,则服务器在开始处理客户端命令之前,必须验证该客户端。“FTP 验证”度量仅适用于 FTP 协议通信。

            客户端时间:显示因浏览器思考时间或其他与客户端有关的延迟而使客户机上的请求发生延迟时,所经过的平均时间。

            错误时间:显示从发出HTTP请求到返回错误消息(仅限于HTTP错误)这期间经过的平均时间。

            系统资源(UNIX资源参数):
    CPU utilization :CPU的使用时间百分比
    Disk rate :磁盘传输速率
    Paging rate :每秒钟读入物理内存或写入页面文件中的页数
    Page-in rate :每秒钟读入到物理内存中的页数
    Page-out rate :每秒钟写入页面文件和从物理内存中删除的页数
    Collision rate :每秒钟在以太网上检测到的冲突数
    Context switches rate :每秒钟在进程或线程之间的切换次数
    Average load :上一分钟同时处于“就绪”状态的平均进程数
    Swap-in rate :正在交换的进程数
    System mode CPU utilization :在系统模式下使用CPU的时间百分比
    User mode CPU utilization :在用户模式下使用CPU的时间百分比

    网络监视参数

            网络延迟时间:源计算机与目标计算机(例如,数据库服务器和Vuser负载生成器)之间的整个路径的延迟。

            网络子路径时间:从源计算机到路径上每个节点的延迟。注意:从源计算机到每个节点的延迟是同时而又独立地度量的。因此,从源计算机到其中一个节点的延迟可能大于源计算机与目标计算机之间的整个路径上的延迟。

            网络段延:路径上每个段的延迟。

            验证网络是否是瓶颈:可以合并各种图来确定网络是否是瓶颈。例如,通过使用网络延迟时间图和运行Vuser图,可以确定Vuser的数量如何影响网络延迟。网络延迟时间图指示在方案运行期间的网络延迟。

    数据库服务器

            User Calls :在每次登录、解析或执行时, Oracle 会分配资源(Call State 对象)以记录相关的用户调用数据结构。在确定活动时,用户调用与RPI调用的比指明了,因用户发往Oracle的请求类型而生成的内部工作量

            Total file opens :由实例执行的文件打开总数。每个进程需要许多文件(控制文件、日志文件、数据库文件)以便针对数据库进行工作

            Opened cursors current :当前打开的光标总数

            DB block changes :由于与一致更改的关系非常密切,此统计计算对SGA中所有块执行的、作为更新或删除操作一部分的更改总数。这些更改将生成重做日志项,如果事务被提交,将是对数据库的永久性更改。此统计是一个全部数据库作业的粗略指示,并且指出(可能在每事务级上)弄脏缓冲区的速率。

    10.AIX操作系统机器性能瓶颈定义:
    瓶颈定义
    CPU bound : vmstat : when %user+%sys greater than 80%;
    Disk I/O bound : vmstat : when %iowait greater than 40%(AIX4.3.3 or later);
    Application disk bound :vmstat : when %tm_act greater than 70%;
    Paging space low : lsps -a : when used paging space greater than 70% active;
    Paging bound : iostat vmstat : paging logical volumes %tm_act greater than 30% of the I/O(iostat) and paging activity greater than 10* the number of CPUs(vmstat);
    Thrashing : vmstat sar :rising page outs, CPU wait and run queue;

    11.系统性能分析命令:
    cpu : vmstat,iostat,topas,nmon,ps,sar,time,timex,netpmon,trace,trcrpt;
    内存:vmstat,topas,nmon,ps,svmon,lsps,filemon,trace,trcrpt;
    磁盘:iostat,topas,nmon,lvmstat,iostat -d, lvmstat, lsps,filemon,lsattr,lsdev;
    网络:netstat,topas,nmon,entstat,nfsstat,ifconfig,iptrace,ipreport,trace,trcrpt;
    监视CPU使用情况:vmstat 2 ; iostat -t 2 6;sar -P ALL 2 3;
    监视内存使用情况: vmstat 2 10;ps aux;svmon -G;svmon -Pau 10;
    监视I/O使用情况: iostat 5;sar -d 3 3;
    监视网络使用情况: netstat -i ;netstat -m;netstat -v;

    此文来源于51testing博客,转载请注明出处
    原始链接:
    http://www.51testing.com/?94273/action_viewspace_itemid_13778.html

  • 用户注册和密码修改测试点

    wanghaiping1111 发布于 2008-06-10 14:33:24

    用户注册和密码修改测试点


    一.用户注册

    只从用户名和密码角度写了几个要考虑的测试点,如果需求中明确规定了安全问题,Email,出生日期,地址,性别等等一系列的格式和字符要求,那就都要写用例测了~
    以等价类划分和边界值法来分析
    1.填写符合要求的数据注册: 用户名字和密码都为最大长度 (边界值分析,取上点)
    2.填写符合要求的数据注册 :用户名字和密码都为最小长度 (边界值分析,取上点)
    3.填写符合要求的数据注册:用户名字和密码都是非最大和最小长度的数据(边界值分析,取内点)
    4.必填项分别为空注册           
    5.用户名长度大于要求注册1位(边界值分析,取离点)
    6.用户名长度小于要求注册1位(边界值分析,取离点)
    7.密码长度大于要求注册1位(边界值分析,取离点)
    8.密码长度小于要求注册1位(边界值分析,取离点)
    9.用户名是不符合要求的字符注册(这个可以划分几个无效的等价类,一般写一两个就行了,如含有空格,#等,看需求是否允许吧~)
    10.密码是不符合要求的字符注册(这个可以划分几个无效的等价类,一般写一两个就行了)
    11.两次输入密码不一致(如果注册时候要输入两次密码,那么这个是必须的)
    12.重新注册存在的用户
    13.改变存在的用户的用户名和密码的大小写,来注册。(有的需求是区分大小写,有的不区分)
    14.看是否支持tap和enter键等;密码是否可以复制粘贴;密码是否以* 之类的加秘符号显示


    二.修改密码
    当然具体情况具体分析哈~不能一概而论~
    实际测试中可能只用到其中几条而已,比如银行卡密码的修改,就不用考虑英文和非法字符,更不用考虑那些TAP之类的快捷键.
    而有的需要根据需求具体分析了,比如连续出错多少次出现的提示,和一些软件修改密码要求一定时间内有一定的修改次数限制等等。

    1.不输入旧密码,直接改密码
    2.输入错误旧密码
    3.不输入确认新密码
    4.不输入新密码
    5.新密码和确认新密码不一致
    6.新密码中有空格
    7.新密码为空
    8.新密码为符合要求的最多字符
    9.新密码为符合要求的最少字符
    10.新密码为符合要求的非最多和最少字符
    11.新密码为最多字符-1
    12.新密码为最少字符+1
    13.新密码为最多字符+1
    14.新密码为最少字符-1
    15.新密码为非允许字符(如有的密码要求必须是英文和数字组成,那么要试汉字和符号等)
    16.看是否支持tap和enter键等;密码是否可以复制粘贴;密码是否以* 之类的加秘符号
    17.看密码是否区分大小写,新密码中英文小写,确认密码中英文大写.
    18.新密码与旧密码一样能否修改成功.


    有个朋友问我,注册的时候测试了密码长度,修改的时候为什么还要测试.
    我在这里举个我亲身经历的例子,以前我玩一个游戏,叫恋爱盒子,在游戏里我把密码改成了xuewufengtian,后来怎么也上不去了.因为资料填写不全无法找回密码.后来我在一次注册过程中发现,注册的时候密码长度最长是10位,这时我灵机一动,用了原来的用户名和xuewufengt的密码就进去了. 这表明,修改密码时候的最大长度和注册及登陆的时候密码最大长度有可能是不一致的.
  • 求职记II

    Cinderellats 发布于 2008-06-02 13:40:01

         5.30又有一家公司通知面试,这家不是我投的,但是有机会我都会去的。

        此公司离家不远,但也是打车去的,因为没有公交车。到的太早了,我没有进去,在附近晃悠了一会儿。嗯嗯~~附近的小区很不错哈,景色秀美,人少僻静。

        等到时间差不多了,我才不紧不慢的进去了。里面已经有3、4个求职者了。先给了我一张公司简介,让我了解一下。然后给了一张试卷,考的是表达能力。

        问题1:如果你和领导意见不一致,你会怎么办?

        问题2:说说你失败的一件事。

        问题3:如果录取你进入公司,你将如何开展你的工作?

        问题4:说说你的近期目标和远期目标。

        问题5:为什么离开上一家公司?目前月薪和期望月薪是多少?

        写完之后,就让我在一台电脑上做脑龄测试,刚开始做了3题,都不知道是什么意思,到了第4题才明白就是测试瞬间记忆的能力。晕~~~可惜前面已经错了2题了,到最后的结果就是:我的脑龄已经33岁了!

        测完脑龄,竟然还测试打字速度,我更晕了~~~还好我打字不算慢的。

        最后那位小姐明白我是来应聘软件方面的,又给了我一份c语言的试卷。其实我没学过c,还是硬着头皮做吧,结果也是可想而知的。

        终于到了面试,经理应该是做开发的,没有问到测试方面的技术问题。开发我又不会,所以最后的局面就是:她半天问一句,我很快回答一句。然后她又看看我的试卷,半天再问一句,我很快又回答一句。虽然好像我们都没什么话要说的,可是就这种场面还维持了很久,最后她还让我回去好好准备一下测试方面的东西,下次再通知我复试。

        我很期待复试,虽然到今天还没有通知我。

        我还是在认真地准备着。(*^__^*)

  • QuickTestProfessional基本使用示例(原创)

    junqinghuang 发布于 2008-05-26 15:17:40

    QuickTestProfessional基本使用示例(原创)

    1          设置脚本间的间隔时间

    Wait(2),单位:秒

    2          循环语句while

    i=0

    do while(i<10)

    Window("Opera").Restore

    Window("Opera").WinObject("OperaWindowClass").Click 446,232

    Window("Opera").WinObject("OperaWindowClass").Click 461,278

    i=i+1

    loop

    3         循环语句for

    For i=1 to 3

           Window("Opera").Restore

    Window("Opera").WinObject("OperaWindowClass").Click 446,232

    Window("Opera").WinObject("OperaWindowClass").Click 461,278

    Next

    4          判断语句

    Do while(i<20)

    Browser("XX项目").Page("XX项目").Frame("wap").Link("啤酒").Click

    wait(2)

    Browser("XX项目").Page("XX项目").Frame("wap_2").Link("商铺详情").Click

    wait(2)

    i=i+1

    If i=5 Then

           Exit do

    End If

    Loop

    5          With语句

    Do while(i<20)

    With Browser("XX项目")

    .Page("XX项目").Frame("wap").Link("生活家居").Click

    .Page("XX项目").Frame("wap_5").Link("出租(火爆招租中)").Click

    .Page("XX项目").Sync

    With .Page("XX项目")

    .Frame("wap_6").Image("image").Check CheckPoint("image")'检查点

    .Frame("wap_6").Link("返回XX首页").Click

    .Sync

    .Frame("wap").Check CheckPoint("生活家居")'检查点

    End with

    End with

    i=i+1

    If i=3 Then

        i=21

    End If

    Loop

    6         检查点

    Browser("XX项目").Page("XX项目").Frame("wap").Link("生活家居").Click

    Browser("XX项目").Page("XX项目").Frame("wap_5").Link("出租(火爆招租中)").Click

    Browser("XX项目").Page("XX项目").Sync

    Browser("XX项目").Page("XX项目").Frame("wap_6").Image("image").Check CheckPoint("image")'检查点

    Browser("XX项目").Page("XX项目").Frame("wap_6").Link("返回XX首页").Click

    Browser("XX项目").Page("XX项目").Sync

    Browser("XX项目").Page("XX项目").Frame("wap").Check CheckPoint("生活家居")'检查点

    7           引用函数

    Function  hjq(i)

       msgbox("hjq")

    End Function

     

    Do while(i<20)

    '开始

    Browser("XX项目").Page("XX项目").Frame("wap").Link("啤酒").Click

    wait(2)

    Browser("XX项目").Page("XX项目").Frame("wap_2").Link("商铺详情").Click

    '详情

    i=i+1

    If i=3 Then

        i=21

    End If

    Call hjq(i)

    Loop

    8           引用action

    录制action1,在step->action properties中设置该actionreuseable action

    录制action2,在inser->call to exiting action,选择action1

    OK

    9           参数化

    keyword view中设置对象的value为参数,并设置值

    With Browser("XX项目_2").Page("XX项目")

           With .Frame("wap_2")

                  .WebEdit("key").Set "1"

                  .WebButton("").Click

           End With

           .Frame("wap_3").Link("重新搜索").Click

           With .Frame("wap")

                  .WebEdit("key").Set DataTable("p_Text", dtGlobalSheet)

                  .WebButton("").Click

           End With

           .Sync

    End With

    10       Vbs随机读取一行文本内容

    '随机读取文件中的一行

    randomize 

    set fso=createobject("scrīpting.filesystemobject")  '创建文件系统对象

    set a=createobject("scrīpting.dictionary")  '类似于二维数组

    set file=fso.opentextfile("D:\hjq.txt")  '打开文件

    do while file.atendofstream<>true 

    m=m+1  'm记录文件中文本行数

    a.add m,file.readline  'file.readline读取某行记录

    loop 

    file.close  '关闭文件

    h=int(rnd*m) 

    msgbox "" & h & ":  " & a(h) ,4096,"随机内容"

    msgbox "1:  " & a(1) ,4096,"内容"

    msgbox "2:  " & a(2) ,4096,"内容"

    msgbox "3:  " & a(3) ,4096,"内容"

    11       二维数组的使用

    set a=createobject("scrīpting.dictionary")  '类似于二维数组

    a.add 0,"返回XX首页"

    a.add 1,"返回XX首页"

    a.add 2,"返回XX首页"

    a.add 3,"返回XX首页"

     

    For i=0 to 3

     

    With Browser("XX项目").Page("XX项目")

           With .Frame("wap")

                  .WebEdit("key").Set "1"

                  .WebButton("").Click

           End With

           .Frame("wap_2").Link(a(i)).Click

           .Sync

    End With

    Next

    12       从文件读取文本,并赋予参数

    set fso=createobject("scrīpting.filesystemobject")  '创建文件系统对象

    set a=createobject("scrīpting.dictionary")  '类似于二维数组

    set file=fso.opentextfile("D:\hjq.txt")  '打开文件

    wait(2)

    do while file.atendofstream<>true

    With Browser("XX项目").Page("XX项目")

           With .Frame("wap")

                  .WebEdit("key").Set  file.readline

                  .WebButton("").Click

           End With

           .Frame("wap_2").Link("返回XX首页").Click

           .Sync

    End With

    loop 

    file.close  '关闭文件

    13       读取csv文件并分割字符串

    Dim aasplit

    set fso=createobject("scrīpting.filesystemobject")  '创建文件系统对象

    set file=fso.opentextfile("D:\hjq.csv")  '打开csv文件

    wait(2)

    Do while file.atendofstream<>true

        aasplit=split(file.readline,",")',分割字符串

     

           For i=0 to UBound(aasplit)

     

                  With Browser("XX项目").Page("XX项目")

                         With .Frame("wap")

                                .WebEdit("key").Set  aasplit(i)

                                .WebButton("").Click

                         End With

                         .Frame("wap_2").Link("返回XX首页").Click

                         .Sync

                  End With

                 

           Next

     

    loop 

    file.close  '关闭文件

    14       怎样识别弹出的web窗口和对象

    1,  进入object identification

    2,  enviroment中选择web

    3,  选择某个test object class,如browser

    4,  添加mandatory properties

    5,  确定

    6,  重新录制脚本

    7,  OK

    15       Vbs写文件

    set fs =createobject("scrīpting.filesystemobject")

    if (fs.fileexists("c:\hjq.txt")) then

    set f =fs.opentextfile("c:\hjq.txt",8)

    f.write chr(13)+chr(10)

    f.write "hello"

    f.write chr(13)+chr(10)

    f.writeline "beijing"

    f.close

    else

    set f=fs.opentextfile("c:\hjq.txt",2, true)

    f.writeblanklines 2 '写入2个空行

    f.write "china"

    f.close

    end if

     

    16       基本函数

    QTP的基本使用函数:

    1, 获取对话框相应的文字: GetVisible Text

    2, 查找相应的字符串: instr (1,查找目标字符串,所查找的字符串)

    3, 随机数的获取: Randomnumber.Value() cstr(int(Rnd*10)+1)

    4, 等待函数: Wait(秒数)

    5, 获取数组下标: UBound (数组名)

    6, 拆分数组: Split(MyString, ",", -1, 1)

    7, 可执行步骤: OptionalStep

    8, 报告信息: Reporter.ReportEvent 3, "Save Step", "Out of cycle!"

    9, 判断对话框是否存在: .exist

    10,事件过滤函数:Reporter.Filter=过滤条件(0123)0代表显示所有的errorwarning,1,显示error,2,显示waining,3,任何errorwarning都不显示。

    11,循环函数:do … loop untilfor…to… then next,while.

    12,数据表格:DataTable,向外赋值,Dim aa = DataTable.value(“CellingName”,”ActionName”).

    13,获得对象属性的三种方法GetTOPropertyGetTOProperties,GetROProperty,GetTOProperty获得程序中对象当前的属性,GetTOProperties获得当前属性所有集合,GetROProperty获得的是录制时对象所获得的属性。

    14,检查点方法check和输出指定属性值output

    15,函数Descrīption,可以获得某页面同标签的属性进行操作。

    16,函数nagative可以随便跳转页面到指定的URL

    17,函数Object可以获得当前页面同属性的控件。

    18,函数Focus可以让控件获得焦点,函数Blur则是失去焦点,click单击,dbclick双击。

    19,函数setAttribute可以设置控件属性,getAttribute可以获得属性。

     

    ( 本文为junqinghuang 原创,转载请注明出处)

  • 收藏的网友文章_QTP操作实例0001

    smuuupl 发布于 2008-04-21 21:54:22

    1.datatable

            QTP本身程序就给我们提供了这么一个数据表,我们可以把测试数据或测试用例填入这个数据表中.

    如:设计用例

       username  passwd

    case1  mercury mercury

    case2 xxxxxxx xxxxxx

    录制脚本

    For i=1 to Datatable.GetRowCount
    Dialog("Login").WinEdit("Agent Name:").Set DataTable("username", dtGlobalSheet)
    Dialog("Login").WinEdit("Password:").Set DataTable("passwd", dtGlobalSheet)
    Dialog("Login").WinButton("OK").Click
    datatable.GlobalSheet.SetNextRow
    Next

            本例是验证一个登录系统,通过DataTable不同的用例设计,驱动起这段脚本,达到测试的效果.当然上面的例子中还少一个很重要的步骤,那就是结果比较.如果不能进行结果比较的自动化测试不能够称为自动化测试.
            当然我们这里主要讲的是数据驱动,所以不在对上面的例子进行补充.

    2.文本文件

            我们可以把文本文件当成数据文件,通过对文本文件的读写操作,来实现数据驱动.

    例:文本文件内的内容

      mercury,mercuy

    读文件的代码

    Function writeorderno(orderno)
    Dim fso, myfile,username,passwd
    Set fso=CreateObject("scrīpting.FileSystemObject")
    Set myfile=fso.openTextFile("C:\testing.txt",1,false)
    tmp=split(myfile.readline,",")
    username=tmp(0)
    passwd=tmp(1)
    myfile.close
    End Function

    写文本文件的代码

    Function writeorderno(orderno)
    Dim fso, myfile
    Set fso=CreateObject("scrīpting.FileSystemObject")
    Set myfile=fso.openTextFile("C:\result1.txt",8,false)
    myfile.writeline orderno
    myfile.close
    End Function

    3EXCEL文件

            我们可以把EXCEL文件当成数据文件,通过对EXCEL文件的读写操作,来实现数据驱动.

            可以把EXCEL文件当作对象的方式来完成写的操作

    Dim Excel,ExcelSheet
    Set Excel=CreateObject("Excel.Application")
    Set ExcelSheet=CreateObject("Excel.Sheet")
    ExcelSheet.Application.visible=true
    ExcelSheet.ActiveSheet.Cells(1,1).value=1
    ExcelSheet.ActiveSheet.Cells(1,2).value=2
    ExcelSheet.ActiveSheet.Cells(1,3).value=3
    Excel.Save "C:\test.xls"
    Set ExcelSheet=Nothing

    用ADO的方式连接EXCEL文件来做读的操作
    Dim conn,input,filename
    filename="D:\公基本情况(tb_gsgk)-标准格式.xls" '
    Set conn= createobject("ADODB.Connection")
    conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source="&filename&";Extended Properties='Excel 8.0;hdr=yes'"
    Set input= createobject("ADODB.Recordset")
    input.Open "select * from [公基本情况-标准格式$] " ,conn,2,2
    input.close
    Set input=nothing

    4.数据库

        可以利用设计数据表,把测试数据和测试用例放在数据表里,用ADO或者其他任何可以访问连接数据库的方式连接数据库,来实现数据驱动

    Dim res,cmd,sql
    Set Res=createobject("adodb.recordset")
    Set Cmd=createobject("adodb.command")
    Cmd.activeconnection="Provider=SQLOLEDB.1;Password=111111;Persist Security Info=True;User ID=sa;Initial Catalog=xhq;Data Source=192.168.191.142"  '这句话是连接数据库的数据源,要做修改
    Cmd.CommandType = 1
    sql="selec t * from 表 where name=username"
    Cmd.CommandText = sql
    Set res = Cmd.Execute()
    Set res = nothing
    Set cmd.ActiveConnection = nothing
    Set Cmd= nothing

    以上四种方法都可以帮助我们实现数据驱动,应该说数据驱动在自动化测试中运用的比较的广泛,才有必要拿出来探讨一下.


    5.计算一个操作的时间

    Browser("Browser").Page("Page").Image("getRates").Click
    var_StartTime = Timer
    Browser("Browser").Page("Page").Sync
    Browser("Browser").Page("Page").Check CheckPoint("Check1")
    var_EndTime = Timer
    intRespTime = round ((var_EndTime - var_StartTime), 2 )
    msgbox (intRespTime)

    6.使用print来实现批量的察看信息

    测试中我们使用QTP调试脚本的时候一般就是DEBUG或者MSGBOX察看一些信息,其实有时候也可以使用print来实现批量的察看信息但是不影响程序运行.

    a="100"
    print a



     

  • QTP 个人总结 (初级)

    Randall 发布于 2008-04-22 23:16:54

    1. QTP 识别对象原理

    QTP对每个控件类都定义了一些强制属性和辅助属性。当qtp对对象进行识别的时候,首先qtp会取出控件的所有强制属性,如果这些强制属性能够唯一标识这个控件则选强制属性来标识控件,如不能唯一标识控件,qtp则逐一取出控件类的辅助属性直到能唯一标识控件为止。

    如果使用强制属性和辅助属性还不能唯一标识控件。 则有以下两种可能:

    QTP对控件类的识别使用了智能识别(Smart Identification),qtp会忽略之前对强制属性与辅助属性的识别,这时qtp会使用smart identification 中的 basic filter properties和optional filter properties来对对象进行识别. basic filter properties就是一些控件的基础属性,例如button的Name,这个属性变了button也就变成另外一个button了。

    如果对控件类的识别没有使用Smart Identification,系统会使用Ordinal Identifier来对控件进行识别。

    2. QTP的测试流程。大多自动化测试工具都是使用录制回放这种方式:

    录制:QTP录制方式有三种,标准录制,模拟录制与低级录制。

    标准录制一般就是最常用的,录制对标准控件的一些操作,如对button的click,winEdit的Set value等等。

    模拟录制,可以录制鼠标的轨迹,主要用与绘图此类软件的录制。

    低级录制,与标准录制不同,不是Object.Operation value 而是记录屏幕坐标点上的操作。 稳定性较差。

    录制的时候,QTP会将用户的操作以VBscrīpt的形式保存在Expert View里头,录制的时候还会判断控件是否存在对象库里面,如果没有则创建对象。对象库里面的对象称为 Test Object 与程序UI上的控件对象Run Time Object 相对应。

    和TO、RO相关的几个函数有:

    GetTOProperty():取得仓库对象的某个属性的值
    GetTOProperties():取得仓库对象的所有属性的值 //返回一个对象类型,属性集为对象标识属性集
    SetTOProperty():设置仓库对象的某个属性的值
    GetROProperty():取得实际对象的某个属性的值

    录制完成需要对代码进行修改,增加代码的稳定性与可移植性。

    1. Add Comments. 代码中加必要的解释能增加代码的可读性,利于回归测试中代码的维护。

    2. 增加控制流语句。如程序的登陆,正常流程是输入验证信息,点击登陆按钮进入主界面。若用户已经登陆则系统就应该弹出一个确认框问用户是否需要删除原来的session。 这是录制的教本里面我们就应该加一个判断, 判断是否这个弹出框存在。

    3. 参数化。 QTP 参数化有一下几种方式:1)action parameter. Keyword View -> 右键ActionName ->Action Properties, Parameter tab. 可以配置action的传入参数与传出参数,参数的使用为: strInput = Parameter("input"), input为action的传入参数。 Parameter("output") = strOutput, output为action的输出参数。 2)Environment, 在脚本中使用strTemp = Environment("environmentVariable"). 3)datatable, 使用DataTable.SetCurrentRow(RowVale)  strTemp = DataTable.RowValue(Parameter, SheetID).

    4. CheckPoint.

    5. 同步点. WaitProperty(Property, value, Timeout). Object.exist(Timeout). Wait Time.

    6. QTP错误处理机制:

    QTP 有三种错误处理机制:

    1, 全局错误响应: Test setting中run设置

    全局错误响应是qtp的系统缺省错误处理,当没有使用其他错误处理方式时,系统会自动调用这里指定的方式进行错误处理。

    在整个脚本有效。 若是出错在Function Library,则错误号只存在library,不会传到Action中。

    2, VBscrīpt on Error错误处理: On Error Resume Next

    VBscrīpt的错误处理方式,三种相关方式为:

    a)On Error Resume Next: 一旦这个语句已经被处理,脚本将继续后面的程序,不理会已经出现的错误。

    b)On Error GoTo 0: 使用On Error GoTo 0语句恢复缺省的错误处理行为, 在运行这个语句后, 发生的运行期错误将导致缺省错误处理,在qtp中,缺省的出错处理就是全局错误响应。

    c)Err对象: Err对象有三个属性  Number, Source, Descrīption. Err对象在运行时错误发生的时候赋予新的值,原来的值将被丢弃。 Err对象是全局的, 不受函数调用的影响。 Err对象可以使用clear方法清空。 任何时候使用On Error Resume Next或者On Error GoTo 0都会清空Err对象。

    只对语句所在的函数或Action中该语句之后的代码生效,对于子函数,调用Action均无效。若On Error 语句存在Action中而出错在Function Library则系统会调用全局错误响应处理。若是Action中函数调用,则会返回到使用On Error 语句的环境中。

    3, 错误恢复场景: Recovery Scenario.

    触发条件有:

    a) Pop-up Window

    b) Object state

    c) Test run error.

    d) Application Crash.

    错误恢复有以下几种方式:

    a) Keyboard or mouse operation

    b) Close Application process

    c) Function Call

    d) Restart Microsoft Windows

    7. 关于虚拟对象的使用:

    虚拟对象管理器中显示的虚拟对象集合存储在您的计算机中,而不是随包含虚拟对象步骤的测试或组件存储。这意味着如果您在测试或组件步骤中使用虚拟对象,则仅当在包含正确的虚拟对象定义的计算机中运行时,该对象在运行会话过程中才能被识别。要将您的虚拟对象集合定义复制到另一个计算机,请将您的 <QuickTest 安装文件夹>\dat\VoTemplate 文件夹的内容(或该文件夹中的单个 .vot 集合文件)复制到目标计算机上的相同文件夹中

     <QuickTest 安装文件夹>\dat\VoTemplate 文件夹只有在已经定义虚拟对象的情况下才会出项

    8. 使用RegisterUserFunc注册用户定义的测试对象方法

    RegisterUserFunc TOClass, MethodName, FunctionName

    如果输入已经和指定的对象类关联的方法的名称,则用户定义的函数将覆盖现有方法。如果输入新名称,将添加到对象支持的方法列表中。

    Function MySet (obj, x)

    dim y

    y = obj.GetROProperty("value")

    Reporter.ReportEvent micDone, "previous value", y

    MySet=obj.Set(x)

    End Function

    RegisterUserFunc "WebEdit", "Set", "MySet"

    Browser("MercuryTours").Page("FindFlights").WebEdit("Country").Set "Canada"

    使用UnRegisterUserFunc TOClass, MethodName 可以取消用户注册方法

    9, QTP描述性编程:

    平行于对象库的一种编程方法. Example:

    set EditDesc = Descrīption.Create()

    EditDesc("Name").Value = "userName"

    EditDesc("Index").Value = "0"

    Browser("Welcome: Mercury").Page("Welcome: Mercury").WebEdit(EditDesc).Set "MyName"

    使用描述性编程加正值表达式对于那些测试对象经常动态变化的情况很有用, Example:

    Dim strTemp
    strTemp = "Google.*"
    Browser("百度一下,你就知道").Page("Google").WebEdit("q").Set "abc"
    Browser("百度一下,你就知道").Page("Google").WebButton("Name:="&strTemp).Click

    10, 巧用WebTable的ChildItem方法: Example

    Set ōbjTable = Browser("hao123网址之家--文学小说").Page("hao123网址之家--文学小说").WebTable("起点中文网")
    intRow = 2
    intCol = 2
    ' 通过ChildItem获取单元格中的链接对象
    Set ōbjLink = objTable.ChildItem(intRow, intCol, "Link" , 0)
    ' 单击链接
    objLink.click

  • 跟小师父学习QTP后的总结

    kxllr 发布于 2008-04-25 11:21:46

    做测试工作马上就一年了,用QTP也有几个月了,在这里感谢一下小师父教了我这么多的知识,也把我的总结跟大家分享一下,有不对的地方希望大家指出我好修改,谢谢了!!

    1、拆分语句split
    例:取得当前日期后拆分
    riqi=date()
        my=split(riqi,"-")
        riqi=my(1)&"月"&my(2)&"日"
        datatable("riqi",DtGlobalSheet)=riqi
        本地表:DataTable("a", dtLocalSheet)
    riqi= year(date)& "-" & Right("0"& month(date),2) & "-"&Right("0"&   Day(Date),2)

    2、取得表格中某行某列的值GetCellData
    例:飞机票取票价
    shuA=Browser("Welcome: Mercury Tours").Page("Book a Flight: Mercury").WebTable("New York to Zurich").GetCellData(3,3)


    3、取距某年某月某日的天数datediff
    例:计算距2008-08-08奥运天数
    datediff("d",now,"2008-8-8")


    4、描述性编程text:=
    例:取得某页面上某文字的链接
    Browser("").Page("").Link("text:=娱乐").Click
         或
         neirong="娱乐"
         Browser("").Page("").Link("text:="&neirong).Click


    5、网页中HTML编辑器的录制
    功能:验证126邮箱的发信功能正确
    操作步骤:
          a.录制脚本,动作包括整个发信的过程。
          b.修改脚本,在输入信件主题代码后加wait 10语句
           c.回放脚本,观察在邮件正文中输入的内容,回放时QTP是否写入
          d.重新修改脚本,保证回放时QTP在邮件正文中写入内容

    英文解决方案:
        Browser("网易126免费邮--你的专业电子邮局").Page("网易电子邮箱 - xueqinzhaoqing@126.co").Frame("indexFrame").WebEdit("subject").Click
        wait 1
         Setting.WebPackage( "ReplayType")=2      '配置使用浏览器事件或鼠标运行鼠标操作的'方式.1 - 使用浏览器事件运行鼠标操作,2 - 使用鼠标运行鼠标操作。
         Set ōbj=createobject("wscrīpt.shell")
         obj.sendkeys "{TAB}"
         wait 2
         obj.sendkeys "abc1111"
         wait 1
         Setting.WebPackage( "ReplayType")=1
    中文解决方案

    strCopy = "软件测试." 
    Set ōbjIE = CreateObject("InternetExplorer.Application") 
    objIE.Navigate("about:blank") 
    objIE.document.parentwindow.clipboardData.SetData "text", strCopy 
    objIE.Quit

    wait 1
    Setting.WebPackage( "ReplayType")=2
    Set ōbj=createobject("wscrīpt.shell")
    obj.sendkeys "{TAB}"
    wait 2
    obj.sendkeys "^v"
    wait 1
    Setting.WebPackage( "ReplayType")=1

    6.使用Multi Test Manager添加文件时可以直接往里拖的哦。

    7.函数:新建记事本,改名为public.vbs例:
       function ZHIRSS
    ZHIRSS="RSS行业资讯分类维护"
    end function
      使用语句executefile "d:\zhaopin\case\denglu.vbs"或设置QTP test/settings/resources/+函数目录

    8.设置动作循环:右击/actiong call properties/run on all rows

    9.设置动作允许被调用:右击/action properties/general/reusable action打勾

    10.QTP与MTM连接:Tools/option/run/allow other mercury products to run...

    11.插入已存在的动作1)insert/call to copy of action...复制可修改
                       2)insert/call to existing of action...复制不可修改

    12.QTP报告自动跳出设置:Options>Run>View results when run session ends

    13.判断表格是否存在:
    If Browser("数商3.0后台管理系统").Page("Page").Frame("main_5").WebTable("标题").Exist then
    reporter.ReportEvent 0,"pass","系统显示了所有的资讯列表!"
    else
      reporter.ReportEvent 1,"fail","系统没有显示资讯列表!"
    end if

    14.获取表格行数:Browser("数商3.0后台管理系统").Page("Page").Frame("main_5").WebTable("标题").RowCount

    15.注释脚本存在位置:qtp/dat/ActionTemplate.mst

    16取本地文件名称Function ShowFileList(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 &   "  "
       Next
       ShowFileList = s
    End Function
    wenjian=ShowFileList("D:\下载\本地下载1\")

    17.取本地文件删除:del= DeleFile("D:\下载\本地下载1\")
    Function DeleFile(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
             f1.delete
       Next
    End Function

    18.sousuo2=Browser("Browser").Page("Page_4").Check (CheckPoint("2007-11-08 14:21"))
    If (sousuo2)eqv(true) Then
        reporter.ReportEvent 0,"",""
    else
       reporter.ReportEvent 1,"",""
    End If

    19.取参数化数据的行数,只在某几行进执行某些语句
    row=datatable.GetSheet(3).getcurrentrow
    If row = 3 Or row = 4 Then

    20.单选框置灰zhihui=Browser("下载中心--新增下载文件").Page("下载中心--新增下载文件_4").WebRadioGroup("downloadType").GetROProperty("disabled")
    If  zhihui=1 Then
    End If

    29.取树结构
    Set Desc=descrīption.create
    Desc("micclass").value="WebTable"
    Set List=Browser("Browser").Page("Page").Frame("main").ChildObjects(Desc)
    yuqi=List(0).GetROProperty("innertext")
    msgbox yuqi
    yuqi=split(yuqi," ")
    msgbox yuqi(1)

    30.关闭所有IE
    SystemUtil.CloseProcessByName("iexplore.exe")

    31.创建action template.
        当希望在每一个新建action时都增加一些头部说明,比如作者、创建日期、说明等,用action template
        来实现最简单快捷。
        方法:用记事本等文本编辑器,输入如下类似的内容:
              'Company: xxxx
              'Author: xxx
              'Product: xxx
              'Date: xx
             然后将文件保存为ActionTemplate.mst,并存放到QTP安装目录下的dat目录。

    32.启动IE的语句:SystemUtil.Run "iexplore.exe", "http://www.***.com"
       关闭IE或其他程序的语句:SystemUtil.CloseProcessByName "app.exe"
         or  SystemUtil.CloseProcessByWndTitle "Some Title"

    33.获取图片的名称
    ObjectName = Browser(…).Page(…).Image("Find").GetProperty("Name")

    34.检查某个对象是否存在,如果存在弹出对话框说明对象存在。
    If Browser("Browser").Page("Page").Applet("login.html").JavaEdit("username").Exist Then
    MsgBox("The object exists.")
    End if

    35.同步点
    Browser("数商3.0制作平台").Dialog("Microsoft Internet Explorer").WaitProperty "visible", True, 120000
    设置test/test settings/object synchronizationg timeout 一致

    36.视图框显示为乱码时:调整原页面编码,在QTP/tools/change active screen

    37.添加附件:
       Browser("**").Page("**").WebFile("filePath").Click
    Browser("**").Dialog("**").WinEdit("文件名(N):").Set "D:\**.jpg"
    Browser("下载中心--新增下载文件").Dialog("选择文件").WinButton("打开(O)").Click
    添加相应的对象


    38.在图片上右击添加:tools/web event recording configuration/custom settings
    webedit/event/add/onblur,onchange,onfocus,onpropertychan,onsubmit
    webdlement/event/add/onclick,onmousedown,onmouseup/listen always

    39.数据执行保护
      方法一、右击我的电脑/高级/性能/设置/数据执行保护/为除下列选定程序之外的所有程序和服务启用DEP/添加被保护的程序。
      方法二、C:/BOOT.INT修改noexecute=alwaysoff

    40.在图片上右击添加:tools/web event recording configuration/custom settings
    webedit/event/add/onblur,onchange,onfocus,onpropertychan,onsubmit
    webdlement/event/add/onclick,onmousedown,onmouseup/listen always

    41.去掉前后空格
    If trim(mingcheng)=trim(yuqi) Then

    42.分类树问题解决
    Set Desc=descrīption.create
    Desc("micclass").value="WebTable"
    Set List=Browser("Browser").Page("Page").Frame("main").ChildObjects(Desc)
    yuqi=List(0).GetROProperty("innertext")
    msgbox yuqi
    yuqi=split(yuqi," ")
    msgbox yuqi(1)


    43.引用自定义环境变量
    Environment.LoadFromFile "D:\询价\case\环境\huiyuan.xml"

    44.环境变量有2种,一种是QTP的内置变量,一种是用户自定义的变量。内置变量是可以直接就可以用,自定义环境变量需要在菜单中选择“文件”——>“设置”——>“环境”,在变量类型中选择“用户自定义”,然后进行添加,可以对添加的变量全部导出,导出的文件为.xml格式的文档。既然可以导出,那么必然可以导入.xml文件,你可以在该对话框中的选中“从外部文件导入”,然后添加其文件路径即可。(当然这些操作都可以直接使用脚本来实现,如:Environment.LoadFromFile(“FileName”))
    例如:在桌面建立一个Var.xml,如下
    -<Environment>    //以这个开始的内部都是定义环境变量,直到以</Environment>结束
    - <Variable>                           // 变量定义起始标识
                     <Name>aa</Name>               // 变量名称
                     <Value>11</Value>               // 变量值
            </Variable>                            // 变量定义结束标识
    - <Variable>
                     <Name>bb</Name>
                     <Value>22</Value>
            </Variable>
    - <Variable>
                     <Name>cc</Name>
                     <Value>33</Value>
                  </Variable>
      </Environment>
    然后导入本测试的环境变量文件中,在专家视图里编写下面的脚本代码:
    Dim aParam3
    aParam3=Environment.Value(“aa”)          // 调用环境变量
    msgbox aParam3
    运行测试,会输出”11”

    45.在HTML编辑器中写入数据
    用低水平录制写入编辑器过程,增加编辑部器前的对象,加入click事件,再用TAB
    例如:
    Browser("广告管理").Page("广告管理").WebEdit("descrīption").Click
    Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Type mictab
    Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Type "aaa"

    46.Browser("creationtime:=1").close
       两个页面title相同无法识别时使用描述必编辑
        Browser("creationtime:=1").page(title:=****).WebEdit("name:=***").Set "***"
        或Browser("creationtime:=1").page(index:=1).WebEdit("index:=0").Set "***"

    47.场景恢复:
       当某些提示框会在不定期时有提示时,如果自动点击确定或某些按钮
       1、tools/recovery scenaril manager,制作相应的提示框和要点击的按钮,并保存
       2、test/settings/recovery,添加刚保存的.qrs

    48.输入验证码,先提示一个输入框,在输入框内输入验证码,点击[确定],把输入的验证码框
       Dim a
      a = InputBox("输入名字")

    49.对象库中对象名称不分为_2,_3...设置:tool/options/web/page/fram options/
         crate a new page test object for为different test object descrīptons
         crest a new frame test object for为different test object descrīptions

    50.验证测试输入框输入的最大允许字数功能的正确

    QTP脚本代码中编写
    Set aa=Browser("Browser").Page("Page").Frame("main").WebEdit("PayTypeName")
    if konglen(aa,20) eqv true then
    reporter.ReportEvent 0,"添加支付方式,支付方式输入框允许输入的最大字符功能正确",""
    else
    reporter.ReportEvent 1,"添加支付方式,支付方式输入框允许输入的最大字符功能错误",""
    end if

    此函数的功能为:验证测试输入框输入的最大允许字数功能的正确,函数可写在public.vbs中
    Function konglen(duixiang,guifanshu)
    duixiang.Click
    wait 1
    Setting.WebPackage( "ReplayType")=2
    Set ōbj=createobject("wscrīpt.shell")
    i=0
    ōld="a"
    xin="b"
    while old<>xin
    ōld=duixiang.GetROProperty("value")
    i=i+1
    wait 0,20
    obj.sendkeys "1"
    wait 0,20
    xin=duixiang.GetROProperty("value")
    wend
    'msgbox i
    If i-1=guifanshu Then
    konglen=true
    else
    konglen=false
    End If
         Setting.WebPackage( "ReplayType")=1
    End Function

    51.超时设置:Setting("DefaultTimeout") =1000000

    52.共享对象库:Set App = CreateObject("QuickTest.Application")
    App.Test.Settings.Resources.ObjectRepositoryPath = "path"

    53.取颜色   browser("b").page("p").Object.currentStyle“:.color
    54.显示行号设置:Tools- --> Editor Options...-->General-->Show line number,


    55.不同数据库检查点手动SQL写法
    QTP插入数据库检查点,手动指定SQL语句的写法。
    一、SQL Server格式(本地无需安装SQL Server)
    connectionstring(连接字符串):
    1.本地没有创建数据源的方式
    DRIVER=SQL Server;SERVER=数据库IP地址;UID=用户名;PWD=密码;APP=Microsoft Office 2003;WSID=本地主机名;DATABASE=数据库名

    实例:
    DRIVER=SQL Server;SERVER=10.160.11.10;UID=sa;PWD=sa;APP=Microsoft Office 2003;WSID=RJHLJUN;DATABASE=dcwork

    2.本地已创建数据源的方式
    DSN=数据源名称;UID=用户名;PWD=密码;APP=Microsoft Office 2003;WSID=数据库的主机名;DATABASE=数据库名

    实例:
    DSN=LocalServer;UID=sa;PWD=sa;APP=Microsoft Office 2003;WSID=RJDCWORKTEST;DATABASE=dcwork

    3.SQL语句实例(从数据库表HR_LANGUAGE_TYPE中,查询字段语言名称LANGUAGE_NAME,条件语言名称=中文,按语言名称升序排序结果)
    source(SQL语句):
    SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME  FROM dcwork.dbo.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE  WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文')  ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME


    二、DB2格式:(本地至少安装DB2 Run-Time Client Lite)
    connectionstring(连接字符串):
    1.本地没有创建数据源的方式
    DRIVER={IBM DB2 ODBC DRIVER};UID=用户名;PWD=密码;MODE=SHARE;DBALIAS=数据库名;

    实例:
    DRIVER={IBM DB2 ODBC DRIVER};UID=db2admin;PWD=db2admin;MODE=SHARE;DBALIAS=DCWORK;

    2.本地已创建数据源的方式
    DSN=数据源名称;UID=用户名;PWD=密码;MODE=SHARE;DBALIAS=DCWORK;

    实例:
    DSN=DWCORKDB2;UID=db2admin;PWD=db2admin;MODE=SHARE;DBALIAS=DCWORK;

    3.SQL语句实例
    source:SQL语句
    SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME  FROM DB2ADMIN.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE  WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文')  ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME


    三、Oracle格式:(本地需要安装Oracle ODBC DRIVER)
    connectionstring(连接字符串):
    1.本地没有创建数据源的方式
    DRIVER={Oracle in OraHome92};SERVER=数据库服务名;UID=用户名;PWD=密码;DBQ=数据库名;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BAM=IfAllSuccessful;MTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;

    实例:
    DRIVER={Oracle in OraHome92};SERVER=DCWORK;UID=DCWORK;PWD=DCWORK;DBQ=DCWORK;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BAM=IfAllSuccessful;MTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;



    2.本地已创建数据源的方式
    DSN=数据源名称;UID=用户名;PWD=密码;DBQ=数据库名;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=F;BAM=IfAllSuccessful;MTS=F;MDI=F;CSR=F;FWC=F;PFC=10;TLO=0;

    实例:
    DSN=dcworkoracle;UID=DCWORK;DBQ=DCWORK;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=F;BAM=IfAllSuccessful;MTS=F;MDI=F;CSR=F;FWC=F;PFC=10;TLO=0;

    3.SQL语句实例
    source:SQL语句
    SELECT HR_LANGUAGE_TYPE.LANGUAGE_NAME  FROM DCWORK.HR_LANGUAGE_TYPE HR_LANGUAGE_TYPE  WHERE (HR_LANGUAGE_TYPE.LANGUAGE_NAME='中文')  ORDER BY HR_LANGUAGE_TYPE.LANGUAGE_NAME



    四, mysql
    Set Conn = CreateObject("ADODB.Connection" )
    str="DRIVER={MySQL ODBC 3.51 Driver};SERVER=192.168.1.100;DATABASE=wp_blog;user id=zzz ; password=123456"
    Conn.open str
    Set Rs = CreateObject ("ADODB.Recordset" )
    sql = "select * from `wp_blog`.`blg_webcategory` limit 0, 5000;"
    Rs.open sql,conn,1,3
    If (not Rs.eof) then
    Rs.MoveFirst
    MsgBox Rs(0)
    MsgBox Rs(1)
    MsgBox Rs(2)
    MsgBox Rs(3)
    end if

    Rs.close
    Set Rs = Nothing
    Conn.close
    Set Conn = Nothing
    (转载于 http://bbs.51testing.com/thread-42921-1-1.html )

    五. access

    Set Conn = CreateObject("ADODB.Connection" )
    str="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:/db1.mdb"
    Conn.open str
    Set Rs = CreateObject ("ADODB.Recordset" )


    56.*.xml
    Environment.LoadFromFile "D:\新建文件夹\a.xml"
    Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").Set Environment("HuiYuanB")

    57、类似时间控件,不能手到输入的文本档
       1)手工添加对象,
       2).object.value="2008-4-12"

  • 转:软件测试面试题整理

    nicklyl 发布于 2008-05-25 20:16:11

     

    面试题目:软件测试专业网站:51Testing软件测试网W:gdo:o
    01. 为什么要在一个团队中开展软件测试工作
    u x X&Lcf'Y136894因为没有经过测试的软件很难在发布之前知道该软件的质量,就好比ISO质量认证一样,测试同样也需要质量的保证,这个时候就需要在团队中开展软件测试的工作。在测试的过程发现软件中存在的问题,及时让开发人员得知并修改问题,在即将发布时,从测试报告中得出软件的质量情况。
    CG)P:d-g:L4U13689402. 您在以往的测试工作中都曾经具体从事过哪些工作?其中最擅长哪部分工作?软件测试专业网站:51Testing软件测试网 h DQ-_ Zk
    我曾经做过web测试,后台测试,客户端软件,其中包括功能测试性能测试,用户体验测试。最擅长的是功能测试
    G'g6k TC {Z#I"A13689403. 您所熟悉的软件测试类型都有哪些?请试着分别比较这些不同04. 的测试类型的区别与联系(如功能测试、性能测试……)
    I]xk'e](q7p"et136894测试类型有:功能测试,性能测试,界面测试。
    L ]^e3G Ii136894功能测试在测试工作中占的比例最大,功能测试也叫黑盒测试。是把测试对象看作一个黑盒子。利用黑盒测试法进行动态测试时,需要测试软件产品的功能,不需测试软件产品的内部结构和处理过程。采用黑盒技术设计测试用例的方法有:等价类划分、边界值分析、错误推测、因果图和综合策略。 软件测试专业网站:51Testing软件测试网,B:Pp Sd X'b9u
    性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。软件测试专业网站:51Testing软件测试网}.Q3G@-i0{{Y F
    界面测试,界面是软件与用户交互的最直接的层,界面的好坏决定用户对软件的第一印象。而且设计良好的界面能够引导用户自己完成相应的操作,起到向导的作用。同时界面如同人的面孔,具有吸引用户的直接优势。设计合理的界面能给用户带来轻松愉悦的感受和成功的感觉,相反由于界面设计的失败,让用户有挫败感,再实用强大的功能都可能在用户的畏惧与放弃中付诸东流。
    ,QD-R H$d136894区别在于,功能测试关注产品的所有功能上,要考虑到每个细节功能,每个可能存在的功能问题。性能测试主要关注于产品整体的多用户并发下的稳定性和健壮性。界面测试更关注于用户体验上,用户使用该产品的时候是否易用,是否易懂,是否规范(快捷键之类的),是否美观(能否吸引用户的注意力),是否安全(尽量在前台避免用户无意输入无效的数据,当然考虑到体验性,不能太粗鲁的弹出警告)?做某个性能测试的时候,首先它可能是个功能点,首先要保证它的功能是没问题的,然后再考虑该功能点的性能测试
    QY Y&l |.}cn13689405.  请试着比较一下黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的区别与联系。
    D^G n*~"a2~'J(c136894黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。
    NR;|Z2S*p-WcR136894白盒测试:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成分是否以经过检查。
    C8N6]-A7Cu&{136894  软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试又叫功能测试或数据驱动测试。黑盒测试主要是为了发现以下几类错误:软件测试专业网站:51Testing软件测试网K\r!i*O m*~K+q9|
    1、是否有不正确或遗漏的功能?
    9c,NR8nn1368942、在接口上,输入是否能正确的接受?能否输出正确的结果?
    b&z[]^t h1368943、是否有数据结构错误或外部信息(例如数据文件)访问错误?
    0eXSd'`,i"z4@Z1368944、性能上是否能够满足要求?软件测试专业网站:51Testing软件测试网`"N]4g4E+G s;V5]\se
    5、是否有初始化或终止性错误?软件测试专业网站:51Testing软件测试网m:~c/WI \
      软件的白盒测试是对软件的过程性细节做细致的检查。这种方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。白盒测试主要是想对程序模块进行如下检查:
    {]J-fc%v b1368941、对程序模块的所有独立的执行路径至少测试一遍。软件测试专业网站:51Testing软件测试网9^ur+KD.n x
    2、对所有的逻辑判定,取“真”与取“假”的两种情况都能至少测一遍。软件测试专业网站:51Testing软件测试网`!j&AN)M
    3、在循环的边界和运行的界限内执行循环体。
    6A)S0`0K9WTf1368944、测试内部数据结构的有效性,等等。软件测试专业网站:51Testing软件测试网n/|)V|5r&YRn2e`6U
    单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。
    9y8u;?E5?)D136894      单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了证明这段代码的行为和我们期望的一致。
    X6r8]6a%Cb136894集成测试(也叫组装测试,联合测试)是单元测试的逻辑扩展。它的最简单的形式是:两个已经测试过的单元组合成一个组件,并且测试它们之间的接口。从这一层意义上讲,组件是指多个单元的集成聚合。在现实方案中,许多单元组合成组件,而这些组件又聚合成程序的更大部分。方法是测试片段的组合,并最终扩展进程,将您的模块与其他组的模块一起测试。最后,将构成进程的所有模块一起测试。
    o Lk&RO m136894系统测试是将经过测试的子系统装配成一个完整系统来测试。它是检验系统是否确实能提供系统方案说明书中指定功能的有效方法。(常见的联调测试)软件测试专业网站:51Testing软件测试网 {!l2J#j C#gdI Y
           系统测试的目的是对最终软件系统进行全面的测试,确保最终软件系统满足产品需求并且遵循系统设计。软件测试专业网站:51Testing软件测试网&avk} \5{ a%J7f
    验收测试是部署软件之前的最后一个测试操作。验收测试的目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。软件测试专业网站:51Testing软件测试网l&K+F6Tb,C pX
    验收测试是向未来的用户表明系统能够像预定要求那样工作。经集成测试后,已经按照设计把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步验证软件的有效性,这就是验收测试的任务,即软件的功能和性能如同用户所合理期待的那样。
    %TL.lX"KI{13689406. 测试计划工作的目的是什么?测试计划工作的内容都包括什么?其中哪些是最重要的?
    +d&|,oZ,H+OO`"m136894软件测试计划是指导测试过程的纲领性文件,包含了产品概述、测试策略、测试方法、测试区域、测试配置、测试周期、测试资源、测试交流、风险分析等内容。借助软件测试计划,参与测试的项目成员,尤其是测试管理人员,可以明确测试任务和测试方法,保持测试实施过程的顺畅沟通,跟踪和控制测试进度,应对测试过程中的各种变更。软件测试专业网站:51Testing软件测试网 J:v/{7a Y.Ul
    测试计划和测试详细规格、测试用例之间是战略和战术的关系,测试计划主要从宏观上规划测试活动的范围、方法和资源配置,而测试详细规格、测试用例是完成测试任务的具体战术。所以其中最重要的是测试测试策略和测试方法(最好是能先评审)软件测试专业网站:51Testing软件测试网s;C*zD pj9S }cE
    07. 您认为做好测试计划工作的关键是什么?软件测试专业网站:51Testing软件测试网f(a _!Mt}1^)J
    1. 明确测试的目标,增强测试计划的实用性软件测试专业网站:51Testing软件测试网#C"nv N ] L
    编写软件测试计划得重要目的就是使测试过程能够发现更多的软件缺陷,因此软件测试计划的价值取决于它对帮助管理测试项目,并且找出软件潜在的缺陷。因此,软件测试计划中的测试范围必须高度覆盖功能需求,测试方法必须切实可行,测试工具并且具有较高的实用性,便于使用,生成的测试结果直观、准确
    N+z%wB!h9q;?tY1368942.坚持“5W”规则,明确内容与过程
    &Z({/~l7K[136894“5W”规则指的是“What(做什么)”、“Why(为什么做)”、“When(何时做)”、“Where(在哪里)”、“How(如何做)”。利用“5W”规则创建软件测试计划,可以帮助测试团队理解测试的目的(Why),明确测试的范围和内容(What),确定测试的开始和结束日期(When),指出测试的方法和工具(How),给出测试文档和软件的存放位置(Where)。软件测试专业网站:51Testing软件测试网2\A1?+T$\8A6\'iLCZd
    3.采用评审和更新机制,保证测试计划满足实际需求
    :ln([#?q3I136894测试计划写作完成后,如果没有经过评审,直接发送给测试团队,测试计划内容的可能不准确或遗漏测试内容,或者软件需求变更引起测试范围的增减,而测试计划的内容没有及时更新,误导测试执行人员。
    qSX:r}+}.wz*u1368944. 分别创建测试计划与测试详细规格、测试用例
    :]*{-I x mLO136894应把详细的测试技术指标包含到独立创建的测试详细规格文档,把用于指导测试小组执行测试过程的测试用例放到独立创建的测试用例文档或测试用例管理数据库中。测试计划和测试详细规格、测试用例之间是战略和战术的关系,测试计划主要从宏观上规划测试活动的范围、方法和资源配置,而测试详细规格、测试用例是完成测试任务的具体战术。 软件测试专业网站:51Testing软件测试网3xF ?+e%@.o~%Q~yW
    08. 您所熟悉的测试用例设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。软件测试专业网站:51Testing软件测试网0P)^|-RS$C^
    1.等价类划分
    ,V n#f(oPM136894划分等价类: 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据.取得较好的测试结果.等价类划分可有两种不同的情况:有效等价类和无效等价类.
    t8H;B`9W4S1368942.边界值分析法软件测试专业网站:51Testing软件测试网c'dM C _)y
      边界值分析方法是对等价类划分方法的补充。测试工作经验告诉我,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部.因此针对各种边界情况设计测试用例,可以查出更多的错误.软件测试专业网站:51Testing软件测试网8j R!NC+[
      使用边界值分析方法设计测试用例,首先应确定边界情况.通常输入和输出等价类的边界,就是应着重测试的边界情况.应当选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据.软件测试专业网站:51Testing软件测试网;K|,|yHI)SB"l
    3.错误推测法软件测试专业网站:51Testing软件测试网L!L:Z QR V9V
      基于经验和直觉推测程序中所有可能存在的各种错误, 从而有针对性的设计测试用例的方法.软件测试专业网站:51Testing软件测试网z I{BuE
      错误推测方法的基本思想: 列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据他们选择测试用例. 例如, 在单元测试时曾列出的许多在模块中常见的错误. 以前产品测试中曾经发现的错误等, 这些就是经验的总结. 还有, 输入数据和输出数据为0的情况. 输入表格为空格或输入表格只有一行. 这些都是容易发生错误的情况. 可选择这些情况下的例子作为测试用例.软件测试专业网站:51Testing软件测试网:PZj3b;s/H*W/MS
    4.因果图方法
    ;z:F@Vm%V"[N136894  前面介绍的等价类划分方法和边界值分析方法,都是着重考虑输入条件,但未考虑输入条件之间的联系, 相互组合等. 考虑输入条件之间的相互组合,可能会产生一些新的情况. 但要检查输入条件的组合不是一件容易的事情, 即使把所有输入条件划分成等价类,他们之间的组合情况也相当多. 因此必须考虑采用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来考虑设计测试用例. 这就需要利用因果图(逻辑模型). 因果图方法最终生成的就是判定表. 它适合于检查程序输入条件的各种组合情况. 软件测试专业网站:51Testing软件测试网(@5hV(_&R+bK[ ]
    08.您认为做好测试用例设计工作的关键是什么?
    h5M:~)~w/k.K$f136894白盒测试用例设计的关键是以较少的用例覆盖尽可能多的内部程序逻辑结果软件测试专业网站:51Testing软件测试网Pv S0U r-}&q%wU
    黑盒法用例设计的关键同样也是以较少的用例覆盖模块输出和输入接口。不可能做到完全测试,以最少的用例在合理的时间内发现最多的问题软件测试专业网站:51Testing软件测试网kMg]Y#n
    09. 请以您以往的实际工作为例,10. 详细的描述一次测试用例设计的完整的过程。软件测试专业网站:51Testing软件测试网8|X1d&D;e ^DU
    就说最近的这次网站功能的测试吧
    8~.B1{,gM3]+Pl136894首先:得到相关文档(需求文档和设计文档),理解需求和设计设计思想后,想好测试策略(测试计划简单点就OK了),考虑到测试环境,测试用例,测试时间等问题。
    t$C N-Hq,\g*i136894第二步:设计测试用例,测试策略是:把网站部分的功能点测试完,然后在进行系统测试(另外个模块呢有另一个测试人员负责,可以进行联调测试),网站模块的测试基本是功能测试和界面测试(用户并发的可能性很小,所以不考虑):这次的网站的输入数据呢是使用数据库中的某张表记录,如果表中某一数据记录中新加进来的(还没有被处理的,有个标志位),网站启动后会立刻去刷那张表,得到多条数据,然后在进行处理。处理过程中,会经历3个步骤,网站才算完成了它的任务。有3个步骤呢,就可以分别对这3个步骤进行测试用例的设计,尽量覆盖到各种输入情况(包括数据库中的数据,用户的输入等),得出了差不多50个用例。界面测试,也就是用户看的到的地方,包括发送的邮件和用户填写资料的页面展示。软件测试专业网站:51Testing软件测试网h8Y7ihz0X)~%v
    第三步:搭建测试环境(为什么这个时候考虑测试环境呢?因为我对网站环境已经很熟了,只有有机器能空于下来做该功能测试就可以做了),因为网站本身的环境搭建和其他的系统有点不同,它需要的测试环境比较麻烦,需要web服务器(Apache,tomcat),不过这次需求呢,网站部分只用到了tomcat,所以只要有tomcat即可
    UeI:[4r3wb cZ)r136894第四步:执行测试
    YzM;j~~LE13689411. 您以往是否曾经从事过性能测试工作?如果有,12. 请尽可能的详细描述您以往的性能测试工作的完整过程。
    i N/KZY ?!{136894是的,曾经做过网站方面的性能测试,虽然做的时间并不久(2个月吧),当时呢,是有位网站性能测试经验非常丰富的前辈带着我一起做。软件测试专业网站:51Testing软件测试网;e(G5^ @ KM9M|
    性能测试类型包括负载测试,强度测试,容量测试等软件测试专业网站:51Testing软件测试网7@],P&[6~LFJ
          负载测试:负载测试是一种性能测试指数据在超负荷环境中运行,程序是否能够承担。软件测试专业网站:51Testing软件测试网t8b0@{1Z W Y%[
          强度测试: 强度测试是一种性能测试,他在系统资源特别低的情况下软件系统运行情况。软件测试专业网站:51Testing软件测试网"C}0` z+bxr0L&^;{5c
          容量测试:确定系统可处理同时在线的最大用户数   软件测试专业网站:51Testing软件测试网'^'o&h(Yb]
    在网站流量逐渐加大的情况下,开始考虑做性能测试了,首先要写好性能测试计划,根据运营数据得出流量最大的页面(如果是第一次的话,一般是首页,下载页,个人帐户页流量最大,而且以某种百分比),软件测试专业网站:51Testing软件测试网:}uG9P?9s;wx\%F L
    Web服务器指标指标:软件测试专业网站:51Testing软件测试网I,Hio2Ffjmf
    * Avg Rps: 平均每秒钟响应次数=总请求时间 / 秒数;
    ]2I;}F2b{136894* Successful Rounds:成功的请求;
    (I8s0hN|136894* Failed Rounds :失败的请求; 软件测试专业网站:51Testing软件测试网]9Qj8E {"mvI5_ A
    * Successful Hits :成功的点击次数; 软件测试专业网站:51Testing软件测试网U*^h!ew v,@~
    * Failed Hits :失败的点击次数; 软件测试专业网站:51Testing软件测试网1D/Q~ i(pi#u5T
    * Hits Per Second :每秒点击次数;
    F(B h`/D/cOU136894* Successful Hits Per Second :每秒成功的点击次数; 软件测试专业网站:51Testing软件测试网&Z:F2wZ4]+i0QR;^
    * Failed Hits Per Second :每秒失败的点击次数; 软件测试专业网站:51Testing软件测试网~8T2A"ZL
    * Attempted Connections :尝试链接数;

    13. 您在从事性能测试工作时,14. 是否使用过一些测试工具?如果有,15. 请试述该工具的工作原理,16. 并以一个具体的工作中的例子描述该工具是如何在实际工作中应用的。软件测试专业网站:51Testing软件测试网pm[&x6M
    17. 您认为性能测试工作的目的是什么?做好性能测试工作的关键是什么?
    :d7Q)TFL H4{$m13689418. 在您以往的工作中,19. 一条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?
    V @ b0v(\ K a'K13689420. 您以往所从事的软件测试工作中,21. 是否使用了一些工具来进行软件缺陷(Bug)的管理?如果有,22. 请结合该工具描述软件缺陷(Bug)跟踪管理的流程。
    &N'VW9xz-s"E13689423. 您认为在测试人员同24. 开发人员的沟通过程中,25. 如何提高沟通的效率和改善沟通的效果?维持测试人员同26. 开发团队中其他成员良好的人际关系的关键是什么?
    uF+?"iv-Pj5W6u13689427. 在您以往的测试工作中,28. 最让您感到不29. 满意或者不30. 堪回首的事情是什么?您是如何来对待这些事情的?
    7|OL;vl,Y4Bd13689431. 在即将完成这次笔试前,32. 您是否愿意谈一些自己在以往的学习和工作中获得的工作经验和心得体会?(可以包括软件测试、过程改进、软件开发或者与此无关的其他方面)软件测试专业网站:51Testing软件测试网(L4HlGga+Psv6f
    33.     你对测试最大的兴趣在哪里?为什么?
    '}6]Q0d'j-a?h136894最大的兴趣就是测试有难度,有挑战性!做测试越久越能感觉到做好测试有多难。曾经在无忧测试网上看到一篇文章,是关于如何做好一名测试工程师。一共罗列了11,12点,有部分是和人的性格有关,有部分需要后天的努力。但除了性格有关的1,2点我没有把握,其他点我都很有信心做好它。软件测试专业网站:51Testing软件测试网(H'Q G}8bc&qn!t
    刚开始进入测试行业时,对测试的认识是从无忧测试网上了解到的一些资料,当时是冲着做测试需要很多技能才能做的好,虽然入门容易,但做好很难,比开发更难,虽然当时我很想做开发(学校专业课我基本上不缺席,因为我喜欢我的专业),但看到测试比开发更难更有挑战性,想做好测试的意志就更坚定了。
    h8@-H3?g.s];O0O136894不到一年半的测试工作中,当时的感动和热情没有减退一点(即使环境问题以及自身经验,技术的不足,做测试的你一定也能理解)。
    :q*g(P^-li5nIZp136894我觉得做测试整个过程中有2点让我觉得很有难度(对我来说,有难度的东西我就非常感兴趣),第一是测试用例的设计,因为测试的精华就在测试用例的设计上了,要在版本出来之前,把用例写好,用什么测试方法写?(也就是测试计划或测试策略),如果你刚测试一个新任务时,你得花一定的时间去消化业务需求和技术基础,业务需求很好理解(多和产品经理和开发人员沟通就能达到目的),而技术基础可就没那么简单了,这需要你自觉的学习能力,比如说网站吧,最基本的技术知识你要知道网站内部是怎么运作的的,后台是怎么响应用户请求的?测试环境如何搭建?这些都需要最早的学好。至少在开始测试之前能做好基本的准备,可能会遇到什么难题?需求细节是不是没有确定好?这些问题都能在设计用例的时候发现。软件测试专业网站:51Testing软件测试网|+z+["?"Z3l?d]F
    第二是发现BUG的时候了,这应该是测试人员最基本的任务了,一般按测试用例开始测试就能发现大部分的bug,还有一部分bug需要测试的过程中更了解所测版本的情况获得更多信息,补充测试用例,测试出bug。还有如何发现bug?这就需要在测试用例有效的情况下,通过细心和耐心去发现bug了,每个用例都有可能发现bug,每个地方都有可能出错,所以测试过程中思维要清晰(测试过程数据流及结果都得看仔细了,bug都在里面发现的)。如何描述bug也很有讲究,bug在什么情况下会产生,如果条件变化一点点,就不会有这个bug,以哪些最少的操作步骤就能重现这个bug,这个bug产生的规律是什么?如果你够厉害的话,可以帮开发人员初步定位问题。
    v4W`*kd+U~etb*D13689434. 你的测试职业发展是什么?
    FK8J&Ui_136894测试经验越多,测试能力越高。所以我的职业发展是需要时间累积的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年累积测试经验,按如何做好测试工程师的11,12点要求自己,不断的更新自己改正自己,做好测试任务。
    6vW5['sb13689435. 你自认为测试的优势在哪里?
    J-XJ})v J4t%qmX136894优势在于我对测试坚定不移的信心和热情,虽然经验还不够,但测试需要的基本技能我有信心在工作中得以发挥。软件测试专业网站:51Testing软件测试网!NX]-h.o;HE:B@0{
    36. 你以前工作时的测试流程是什么?
    6O @|'sBt*f-n'v6d136894公司对测试流程没有规定如何做,但每个测试人员都有自己的一套测试流程。我说下我1年来不断改正(自己总结,吸取同行的方法)后的流程吧。需求评审(有开发人员,产品经理,测试人员,项目经理)->需求确定(出一份确定的需求文档)->开发设计文档(开发人员在开始写代码前就能输出设计文档)->想好测试策略,写出测试用例->发给开发人员和测试经理看看(非正式的评审用例)->接到测试版本->执行测试用例(中间可能会补充用例)->提交bug(有些bug需要开发人员的确定(严重级别的,或突然发现的在测试用例范围之外的,难以重现的),有些可以直接录制进TD)->开发人员修改(可以在测试过程中快速的修改)->回归测试(可能又会发现新问题,再按流程开始跑)。
    s;j[Y){.uuJ"{13689437. 当开发人员说不38. 是BUG时,39. 你如何应付?软件测试专业网站:51Testing软件测试网1O7~j z3k
    开发人员说不是bug,有2种情况,一是需求没有确定,所以我可以这么做,这个时候可以找来产品经理进行确认,需不需要改动,3方商量确定好后再看要不要改。二是这种情况不可能发生,所以不需要修改,这个时候,我可以先尽可能的说出是BUG的依据是什么?如果被用户发现或出了问题,会有什么不良结果?程序员可能会给你很多理由,你可以对他的解释进行反驳。如果还是不行,那我可以给这个问题提出来,跟开发经理和测试经理进行确认,如果要修改就改,如果不要修改就不改。其实有些真的不是bug,我也只是建议的方式写进TD中,如果开发人员不修改也没有大问题。如果确定是bug的话,一定要坚持自己的立场,让问题得到最后的确认。
    H^q.BS[`p13689423.你为什么想离开目前的职务?
    iC_8Nq8eHh? v136894因为公司运作情况并不理想,公司需要调整部门体系,公司考虑到缩减部门人员,所以大批量的裁员(有6,7个),这是我的第一份工作,对公司也有较深的感情,因为在这里我找到了职业理想(就是测试),所以公司需要精简人员,我自愿退出。虽然很舍不得,但我将会有新的发挥能力的舞台。
    8R io!L4v136894  24:你对我们公司了解有多少?

      25:你找工作时,最重要的考虑因素为何?软件测试专业网站:51Testing软件测试网/O,] LW7G'})t
    工作的性质和内容是否能让我发挥所长,并不断成长。
    sK#v"s v"V AJ ua13689426:为什么我们应该录取你?
    VJQc fKB"d:[*J136894您可以由我过去的工作表现所呈现的客观数据,明显地看出我全力以赴的工作态度。软件测试专业网站:51Testing软件测试网1~jn)l7nvU|
      27:请谈谈你个人的最大特色。软件测试专业网站:51Testing软件测试网lW@.wHe _
    我的坚持度很高,事情没有做到一个令人满意的结果,绝不罢手。软件测试专业网站:51Testing软件测试网#X8h9rV ~P4N`Ms
    28.白箱测试和黑箱测试是什么?什么是回归测试?
    5E9H)d+[G/Ejb136894    29。单元测试、集成测试、系统测试的侧重点是什么?软件测试专业网站:51Testing软件测试网B] I0O0su P5i D ~
        30。设计用例的方法、依据有那些?软件测试专业网站:51Testing软件测试网-j7W D)FgU7j^1b6w
        31。一个测试工程师应具备那些素质和技能?
    u/gT#Bl4k'J136894    32.集成测试通常都有那些策略?
    YTGa0wqw&F m0E136894    33.你用过的测试工具的主要功能、性能及其他?软件测试专业网站:51Testing软件测试网y:Y4a-@t s
        34.一个缺陷测试报告的组成
    { [Qx tD%@]4bz1_136894    35.基于WEB信息管理系统测试时应考虑的因素有哪些?
    m(j!F-_s#L/Q0Y^13689436.软件测试项目从什么时候开始,?为什么?
    #@ \s4w-O7K.I h136894     37.需求测试注意事项有哪些?软件测试专业网站:51Testing软件测试网(^1Ib!@(?7D
         38.简述一下缺陷的生命周期
    +eS7]u|~#X1S136894     39.测试分析测试用例注意(事项)?软件测试专业网站:51Testing软件测试网1?^b X9[#V l]
    你在你所在的公司是怎么开展测试工作的?是如何组织的?软件测试专业网站:51Testing软件测试网U7R,M UBv-e
    你认为理想的测试流程是什么样子?
    3V5C.\#]*R {136894你是怎样工作的?软件测试专业网站:51Testing软件测试网*vH(B"n2ORP
    软件测试活动的生命周期是什么?软件测试专业网站:51Testing软件测试网 X)d'lqN'i X!KT
    请画出软件测试活动的流程图?
    Wb'^*y7yvh136894针对缺陷采取怎样管理措施?软件测试专业网站:51Testing软件测试网]1u6AJ II5?
    什么是测试评估?测试评估的范围是什么?软件测试专业网站:51Testing软件测试网R-ad2a}6q V&Y^
    如果能够执行完美的黑盒测试,还需要进行白盒测试吗?为什么?软件测试专业网站:51Testing软件测试网3i9Uk'J l#W
    测试结束的标准是什么?软件测试专业网站:51Testing软件测试网/R/B/q'c3fy'vsn)u(T
    软件验收测试除了alpha,beta测试以外,还有哪一种?
    3?h;A^9uCa;uVy136894做测试多久了?软件测试专业网站:51Testing软件测试网 F+}-T6q)Y]X
    以前做过哪些项目?
    $J(f*ALq4bk136894你们以前测试的流程是怎样的?软件测试专业网站:51Testing软件测试网0}sq1?*X7Y y
    <答:测试计划-测试用例设计-测试执行-测试分析报告>软件测试专业网站:51Testing软件测试网7Ie s9oo[O
    用过哪些测试工具?
    *@u7Ht-Tmbjo136894为什么选择测试这行?软件测试专业网站:51Testing软件测试网3k:d'v@s2a[X
    <答:它是一个新兴的行业,有发展潜力,而且很锻炼人,需要掌握更多的技能,比做开发要更难>软件测试专业网站:51Testing软件测试网 w_~Lt
    为什么值得他们公司雇用?软件测试专业网站:51Testing软件测试网 G3@3L TM7n
    如果我雇用你,你能给部门带来什么贡献?软件测试专业网站:51Testing软件测试网B{g[Du'j7S9J
    如何从工作中看出你是个自动自觉的人软件测试专业网站:51Testing软件测试网"l~k:B1\eL"|J$|
    你的工作通常能在时限内完成吗.(我想问一下就是她问这个问题的动机是什么)
    ']GCp,_)u/M136894通常你对于别人批评你会有什么样的反应软件测试专业网站:51Testing软件测试网8Iq%|#R iJ0y d)p
    如果明知这样做不对,你还会依主管的指过去做吗软件测试专业网站:51Testing软件测试网Yq~7i[p C
    如果你接到一个客户抱怨的电话,你确知无法解决他的问题,你会怎么处理软件测试专业网站:51Testing软件测试网e^;Sobhtn `Up
    你觉得什么样的人最难相处
    *C6fF\ p K[8I136894为什么值得他们公司雇用?
    [e0aBlZ3k136894      帮助公司提高软件质量和测试部门的技术水平软件测试专业网站:51Testing软件测试网/P9c{'{smh
    如果我雇用你,你能给部门带来什么贡献?
    OtC`L |;_"baN{136894      分享我的测试经验和测试技能,提高测试部门技术水平软件测试专业网站:51Testing软件测试网bp1x"x5r:Q4{ T"Sp
    如何从工作中看出你是个自动自觉的人 软件测试专业网站:51Testing软件测试网Tr hY9E l
         自动自觉范围太广
    I7f6` ky136894      1. 工作成果软件测试专业网站:51Testing软件测试网"~S/Xx9~
          2. 工作质量  
    ,\bzPg H136894你的工作通常能在时限内完成吗.(我想问一下就是她问这个问题的动机是什么)软件测试专业网站:51Testing软件测试网2Q,[f1?.V
          在有足够的资源和合理的工作量的情况下,完全可以按时完成,并能比一般人做的更好软件测试专业网站:51Testing软件测试网DHA b!P(E&] r O
    通常你对于别人批评你会有什么样的反应
    6i1}`*iQ136894  有错即改,无措勉之软件测试专业网站:51Testing软件测试网-m`)Y iH5X
    如果明知这样做不对,你还会依主管的指过去做吗软件测试专业网站:51Testing软件测试网2S rAk*EJ~
         在公司内部下级是否有申诉渠道?软件测试专业网站:51Testing软件测试网&ft5F M,C uQb1V
    如果你接到一个客户抱怨的电话,你确知无法解决他的问题,你会怎么处理软件测试专业网站:51Testing软件测试网5e!qd6g%u z
        为什么抱怨?是怎么样的问题?软件测试专业网站:51Testing软件测试网 Qd#GsB5[
         如果是客服问题,提交客服部门解决
    "l wx:I#\136894    如果是质量问题,分析原因,下一版本改进软件测试专业网站:51Testing软件测试网P FBD${9N&I'zK
    你觉得什么样的人最难相处 软件测试专业网站:51Testing软件测试网8Ee-wq"L2_T"{
         自以为是的人软件测试专业网站:51Testing软件测试网&\6C6M+a,K$qR9t3Nati(k
    什么叫单元测试?
    (b2xq'X6O136894请就软件测试人员应该具备什么样的基本素质说说你的看法。软件测试专业网站:51Testing软件测试网,tHX^7rpu.Y!U
    请就如何在开发中进行软件质量控制说说你的看法
    O9V@:`~B)C f0U&l136894 简述软件测试的意义,以及软件测试的分类

    1、功能测试,性能测试,界面测试,安全测试(可以简单点,比如只涉及到COOKIES里的内容),压力测试(商业性质的网站) 等等,B/S软件也要根据其具体功能采用不同的测试策略。
    sjY"B:sd!Y)A n6N1368942、态度、责任心、自信、敏锐的观察力、良好的发散思维软件测试专业网站:51Testing软件测试网.sz6N^*U${[] D%U5K
    3、先设计后开发模式,加强单元测试,加强代码走查,有一套完整的白盒测试方法。关键是加强开发人员的质量意识,增进程序员向工程师水平发展。软件测试专业网站:51Testing软件测试网 D7L3|jz z6KR
    4、意义嘛,就自己想吧。软件测试的分类,这个很多人都按各种方法去分。无明确答案给你。

    对测试的理解——基本的测试知识,对测试是否认可? 75。软件测试专业网站:51Testing软件测试网[o3G}vo6N
       3、谈一谈过去自己的工作——了解经历、提供进一步提问的素材,表达能力  
    F+dSGCGmB5pB4E136894测试技能 软件测试专业网站:51Testing软件测试网)GD ?7e b*Tbws
    测试设计的方法并举例说明——测试技术的使用 软件测试专业网站:51Testing软件测试网;R]S"dl t+I
    测试工具——熟悉程度,能否与当前工作匹配?
    )A xJ b,E?-\136894如何做计划?如何跟踪计划?——日常工作能力 软件测试专业网站:51Testing软件测试网.p P9snU6|8}0KUaz
    如果开发人员提供的版本不满足测试的条件,如何做?——与开发人员协作的能力
    #fw4N ? O136894熟悉unix系统、oracle数据库吗?——是否具备系统知识 软件测试专业网站:51Testing软件测试网[F:XJ_ s4@Yt
    做过开发吗?写过哪些代码?——开发技能
    mf&M g3Ch6oi136894阅读英语文章,给出理解说明?——部分英语能力 软件测试专业网站:51Testing软件测试网[;VV+|g
    文档的意义——是否善于思考?(最简单的概念,不同层次的理解)
    W0I(}$W&|[p1Mdu136894假如进入我们公司,对我们哪些方面会有帮助?——讲讲自己的特长
    I Ud ? DQ)I5n3vS.o136894随便找一件物品,让其测试——测试的实际操作能力软件测试专业网站:51Testing软件测试网A-DT#ea^ MX
    软件测试的方法有?软件测试专业网站:51Testing软件测试网uH3o V)H np(oW
    软件测试的过程?软件测试专业网站:51Testing软件测试网Q\ y*R&` g
    有一个新的软件,假如你是测试工程师,该如何做?软件测试专业网站:51Testing软件测试网o,qb?M UAJ
    软件测试分哪两种方法?分别适合什么情况? 软件测试专业网站:51Testing软件测试网3] fn6J w]{i-B C
    2。一套完整的测试应该由哪些阶段组成?分别阐述一下各个阶段。 软件测试专业网站:51Testing软件测试网S8Rp"jh)X!Si`6N
    3。软件测试的类型有那些?分别比较这些不同的测试类型的区别与联系。 软件测试专业网站:51Testing软件测试网+B;]6@ ~CX
    4。测试用例通常包括那些内容?着重阐述编制测试用例的具体做法 软件测试专业网站:51Testing软件测试网1cHXJ M
    5。在分别测试winform的C/S结构与测试WEB结构的软件是,应该采取什么样的方法分别测试?他们存在什么样的区别与联系? 软件测试专业网站:51Testing软件测试网Q}R;t1\E
    6。在测试winform的C/S结构软件时,发现这个软件的运行速度很慢,您会认为是什么原因?您会采取哪些方法去检查这个原因?
    .\eCyC_ S1368947。描述使用bugzilla缺陷管理工具对软件缺陷(BUG)跟踪的管理的流程 软件测试专业网站:51Testing软件测试网2Y#PEi @.F:W
    你在五年内的个人目标和职业目标分别是什么?
    Q#b.fWL136894  分析这个问题是用来了解你的计划能力的,通过这个问题,面试人同时还可以知道你的目标是否符合企业对你的安排。软件测试专业网站:51Testing软件测试网na\.}r&gb4K
      错误回答我想在将来的某个时候考虑这个问题。如今企业的领导者更换频繁,我认为做太多的个人计划是荒谬可笑的,不是吗?
    (y Om&zU'S;j136894  评论这种回答属于令人反感的一类。首先,当有人想了解你的目标时,"将来的某个时候"这种通俗说法并不奏效。其次,认为企业很脆弱,领导者更换频繁,这种说法毫无疑问会令人反感,而且也是不合理的。最后,认为做计划可笑,看不起这个问题,而且反问面试人,这些都注定了这样的求职者最终会失败。软件测试专业网站:51Testing软件测试网4m(I.Oq BJ*u3^ pB3Im
      正确回答从现在起的五年之内,我希望能够在一个很好的职位上待几年,而且最好有一次晋升,然后就期待着下一步。不管是向上提升,还是在企业内横向调动,对我个人来说,我希望找到一家企业——一家愿意做相互投入的企业——待上一段时间。软件测试专业网站:51Testing软件测试网"D1kfjSnbz&I/BL3^%W
      评论这个问题没有回答得过分具体(那样可能会产生漏洞),而且它表明你有雄心,并且思考过在企业中的成长方式。通过表达横向调动和向上提升的愿望,表明你是一个有灵活性的人。
    C%]M IE136894 问题23 你怎样做出自己的职业选择?软件测试专业网站:51Testing软件测试网)A9\+g6q)Y)?D0E
      分析 面试人提出这个问题是为了了解求职者的动机,看看他(她)应聘这份工作是否有什么历史渊源,是否有职业规划,是不是仅仅在漫无目的地申请很多工作。软件测试专业网站:51Testing软件测试网 d:S&]!I,~` z
      错误回答 我一直都想在企业界工作。自孩提时代起,我就梦想自己至少也要成为大企业的副总裁。
    5\MVP2Pt(`136894  评论 除了难以令人相信之外,这种回答还存在一个问题:它表明求职者会对副总裁以下的职位不感兴趣。
    &?F5Y^y!SJ)[136894  正确回答 在上大学四年级前的那个夏天,我决定集中精力在某一领域谋求发展。尽管我是学商业的,但是我不知道自己最终会从事哪一行业的工作。我花了一定的时间考虑自己的目标,想清楚了自己擅长做的事情以及想从工作中得到的东西,最后我得出了一个坚定的结论,那就是这个行业是最适合我的。软件测试专业网站:51Testing软件测试网L'b@!B&G5N*Su
      评论 这种回答表明,求职者认真地做过一些计划,缩小了自己的关注点,而且也认准了前进的方向。这种回答还表明,求职者理解个人职业规划的重要性,并且有能力做出认真的个人决策。
    -z5g*y|E#}1368941. 你都用什么测试方法
    C'i]QpO!F1368942.怎么编写案例
    Ct+b2v7c1368943.怎么才能够全面的测试到每一个点
    Q5i#} b#yT1368941. 你都用什么测试方法软件测试专业网站:51Testing软件测试网B.@O[S,c
    针对不同的产品或者系统或者模块,有不同的测试方法。总体而言有白盒测试和黑盒测试。
    s.j"i7Wm#Hb1368942.怎么编写案例软件测试专业网站:51Testing软件测试网@,]}5Nw [;e{
    案例的编写与测试阶段的定义有很大的关系。系统测试和unit测试的案例可能不同。总体而言测试案例根据系统的需求而定。
    u:B z!|%h1368943.怎么才能够全面的测试到每一个点
    qa @'g3^4x*L|136894测试的全面性主要需要在设计测试计划的时候考虑,从测试策略,产品需求等等多个角度考虑从而定义全部的测试点。
    q8cY6LX!]W1368941、谈谈软件测试技术,以及如何提高软件测试专业网站:51Testing软件测试网7~:[M6Yn2u
    2、谈谈软件测试职业发展,以及个人的打算
    nQL,O!B+o1368943、谈谈软件测试在企业的地位,也可以结合软件生命周期来谈软件测试专业网站:51Testing软件测试网9A? Hm7z U6i
    有可能清晰的思路比确切的答案更重要软件测试专业网站:51Testing软件测试网F bEfv3v-j%B
    在这里,主要说下笔试和面试的问题,希望大家共同参考。软件测试专业网站:51Testing软件测试网g$y7l6X-Gq
        1,一般公司里实际的软件测试流程是什么样的?你们公司又是怎样的?
    pm6j j iR Z136894    2,软件工程师要具有那些素质?
    4E5Xz)H@y&?~:Y136894    3,你会哪些测试工具?怎么操作?软件测试专业网站:51Testing软件测试网.B3Oj]0dQ8Q
        4,你能不能说下你的3到5年的职业计划(规划)软件测试专业网站:51Testing软件测试网G(MeA}?J{
        5,你觉得你来应聘有那些优势?软件测试专业网站:51Testing软件测试网3`{9N-a+{p0|{7gC
    其余的还好说,但就第4个问题,我感到不好说哦!希望大家给个意见软件测试专业网站:51Testing软件测试网-ug6p)nJ
    第一关:首先要自我介绍,自己的性格怎么样,目前的工作经历积累了一些什么经验取得了些什么值得一说的成果。然后要说说对软件测试怎么看?还有对于软件测试有什么自己的想法。为什么会想到要做这行(因为我的简历上的工作经历没有关于测试方面的)。哦,还有期望薪资。
    ~utD5kH136894第二关:认为软件测试人员所要具备的基本素质,如果遇到问题会怎样处理,如果得不到研发人员的配合(就是研发说这个不是问题)你又会怎么处理?然后就是一些基本概念,比如软件测试的流程有哪些?如果我上任了,首先会怎么开始自己的工作计划。
    b | f4D w2f-W136894(前两关通过了后面这个就好过多了)软件测试专业网站:51Testing软件测试网}U2H GCyXw
    第三关:像我介绍了一下公司的情况,告诉我主要针对什么内容的测试,会不会使用数据库。告诉我大概要做哪些内容,详细的可以上岗以后慢慢熟悉。
    Y+KJ-r9X/k(hR0S136894大概就这么多了,这对没有经过这一关的不知道有没有帮助,仅供参考吧
    %])Yr7?#`c"NC136894我觉得就像李波说的,关键是要给对方留下好印象:)

    面试官最后会问你有什么问题要问吗。作为应聘者的你一般不要说没问题问,这会给面试官留下你不太重视这份工作的坏印象。所以如果你想得到这份工作的话应该抓住这最后的表现自己的机会:
    al'h0Dq1P{)Y136894你可以问:
    8?0R*lub4j$d4fN.y1368941.        贵公司近期和远期的发展目标是什么?软件测试专业网站:51Testing软件测试网sX`2h@uRt9t0m9]
    2.        贵公司的主要竞争对手有哪些?
    "P Fo*^[r1368943.        贵公司有多少开发人员有多少测试人员?
    ;u.S3C SVFvV1368944.        贵公司又进一步扩充测试人员的计划吗?
    k3_%D7j-N;qEb#hC1368945.        如果我有幸能进入贵公司的话,我有怎么样的发展?软件测试专业网站:51Testing软件测试网E8W[ j}u8QH
    6.        测试人员的沟通能力很重要,贵公司有规范的沟通渠道吗?软件测试专业网站:51Testing软件测试网eiT:{ i o0G$izp
    7.        请介绍一下贵公司的福利情况。
    0L G@:h$qQ&Xs1368948.        请问我什么时候能知道结果?

  • 一个优秀的测试用例,应该包含的信息

    千里 发布于 2008-04-22 09:38:28

        1) 软件或项目的名称
        2) 软件或项目的版本(内部版本号)
        3) 功能模块名
        4) 测试用例的简单描述,即该用例执行的目的或方法
        5) 测试用例的参考信息(便于跟踪和参考)
        6) 本测试用例与其他测试用例间的依赖关系
        7) 本用例的前置条件,即执行本用例必须要满足的条件,如对数据库的访问权限
        8) 用例的编号(ID),如可以是软件名称简写-功能块简写-NO.。
        9) 步骤号、操作步骤描述、测试数据描述
        10)预期结果(这是最重要的)和实际结果(如果有BUG管理工具,这条可以省略)
        11)开发人员(必须有)和测试人员(可有可无)
        12)测试执行日期
  • 一次另我吐血的面试

    eve_lincoin 发布于 2008-05-24 10:01:09

    前些天,找工作,然后在各大网站上投着履历,终于有了公司让我去面试.

    上网一查,呵呵,十分对口,一个招b2b的软件测试.对于b2b,我已经有过2个很大的项目经验了.对于这个,很自信,觉得基本没啥问题的.做了功课,浏览了它们的网站.几乎所有的b2b网站的整体设计风格都和阿里爸爸类似,突然有种这个工作非我莫属的感觉.

    去了公司面试,给了我一张全英语的卷子,考的都是qtp的内容.说实话,英语能力实在是抱歉,而且还加着很多专业术语,读懂比较困难.几乎是白卷交回的.

    然后就来了个女的,来面试我.问我很多有关于项目之类的事情,也算是了解详细吧,我也很努力的去回答我所知道的,觉得也没什么技术问题是我所回答不出来的,最后他提出qtp的使用问题.对于我来说,qtp不是没有使用过,但是我仅仅停留在初级阶段(会录制,回放,改脚本,设检查点,改个参数什么的),但是我觉得测试最主要的是思路和想法,工具并非是瓶颈,我向他表示如果工作需要,我可以学习的嘛.毕竟我觉得我是学编程的,好歹还拿到个软件开发高级工程师,想想学习vbs不是什么太难的问题,起码比没学过编程的人快吧.那女的也认可了,然后让我等着.

    我等啊等,终于又把我带到了一个人那里面试,我看着门口的牌子,写着总监的字样,心里想着,这工作应该是差不多了.

    那男的说我卷子做的不好,(这是明摆着的事情)我也向他表示,英语的确是不咋地,但是现在正在进修,对qtp认识也不多,但是我可以努力去学.我心里想着,如果他们对这个要求很高,要招自动化测试工程师,那我肯定是不行的了,只好在继续投履历了.

    后来,又问我是否可以加班的问题.相信在it行业,加班已经不是什么新鲜话题.每个公司在项目上线前都会有一段时间是很忙,需要经常加班的.我觉得没什么问题.不过那男的又说了一堆我离这里(面试的地方)什么路很远之类的话.

    那男的后来说的话很难听,听到我以前在9城和慧聪做过,表示十分惊讶,问我辞职的理由,我回答是外包,项目做好了,自然就走人了,(竟然还向他解释了,外包的含义),不知道他咋想的,居然说,以我这个英语能力,怎么可能去测试全英语的网站.我说很简单啊,有原型啊,对照原型看英语是否和原型一致,出错提示在需求文档上有写,对照着看就行了,英语不会精通到每个单词都认识,但是大概表述的意思,总能搞懂的.

    他后来突然告诉我,他们没有需求和原型.我突然质疑到,那你们的开发是依据什么来开发的呢,难道是凭个人的想象吗?突然对这公司没了想法,我可不想在那种需求不明,互相扯皮的公司干.

    他顿了会,和我说,根据你的能力,我肯定你在以前公司是在混日子,或者是担当了不重要的角色,(我听了差点没气炸了,他凭什么这么说,仅仅是因为我不精通qtp,还是因为我英语不好,他要英语好的,直接招个翻译不就完了)我很平静的和他说,我以前是做外包的,客户公司觉得你不好,早让你走人了,没必要付了钱,不让你干活,白养你的.

    然后唧唧歪歪的和我谈工资问题,呵呵,明摆着是打压我的工资嘛,到头就肯出2k,那点工资,他还是找个实习生在那里点吧,估计别说多少年经验了,估计在上海只要是有过项目经验的人,都不肯到那里去干的.

    这次面试的感觉,就是郁闷,郁闷,再郁闷........

    找工作痛苦啊

  • QTP中一些基础代码结构累积

    kakamissyou 发布于 2008-05-22 17:06:43

    QTP中一些基础代码结构累积

    Fly000的博客转过来的。

     1 生产随机数列
    第一种方法-----------------------------------
    randomize'更新反回的数据
    funcation rand(k,n)
    n=int((k-1)*rnd+1)
    rand=n
    end funcation
    第二种方法
    n=randomnumber.value(1,255)
    2 当运行到表中的某一行,自动导出表中的所有数据
    row=datatable.getcurrentrow
    if row="5" then
    datatable.export("d:\data.xml")
    end if
    3 webedit("txtpass").setsecure"sdsdf...."
    如果参数化密码,可以直接在数据表中写入未加密的密码,它会自动识别,即不用把setsecure改为set
    4 如果弹出对话框就获取上面提示信息并与表中的信息对比,不统一证明弹出的提示出错,主要用来验证
     if browser("web_name".dialog("dialog_name").exist(1) then'如果不出现=false
    error_message=browser("web_name".dialog("diaglog_name".static("用户密码错误!").getRoproperty("text")
       if error_message<>(datatable.value("error_info"))then
    msgbox(error_message)
    end if
    browser("web_name").dialog("diaglog_name").close
    end if
    这里我总结了两点技巧:
     一是:对于dialog中,虽然提示信息对象名称是"用户密码错误",但如果信息对象名称是“该用户不存在”,不用更改会自动识别,我想主要是录制第一遍时,“用户密码错误”只是让运行时能找到这个控制,而不管它是什么内容,因为在对象仓库中,text不是决定该对象的属性
    二是:如果对于提示信息比较长的,可以用mid(error_message,n,m)取一部份特征提示信息进行验证,这样我想可以节省处理时间,又可以避免长度以及空格等字符的处理
    5 在运行时,向某一个单元格赋值: datatable.value("kai",dtlocalsheet)="nanjing"
    datatable.value("num")只在global形式下的一种省略形式;完整形式
    是datatable.value("num",dtlocalsheet)
    -----取得某一具体行的值:
    datatable.setcurrentrow(n);
    msgbox(datatable.getsheet("global").getparameter("kai").Rawvalue)
    或者kk=datatable.Rawvalue("kai","action1")
    -----在run-time期间,添加一个action和参数
    kk=datatable.addsheet("name").addparameter("kai","ddd").name'/value
    6 with dialog("name")'可以省好多代码,看着也简洁
    content=.wintreeview
    end with
    7 wintreeview.select(item)(根是0,列表第一个也是0)
    wintreeview.getcontent
    wintreeview.getitem(整行)+";"+
    winlistview.getitem(行中的第一个字符段)
    wincheckbox("").set"off"'/on
    8 数据库检查点:
    sub getdata
    set con=createobject("adodb.connection")
    con.open("descrīption=mod;driver=sqlserver;server=hp\sqlserver;uid=sa;"&_
    "pwd=11111;APP=qtp;WSID=hp;database=MOD31" '用sqlserver方式
    Con.open "DRIVER = {Microsoft Access Driver (*.mdb)};DBQ=D:\Testdb.mdb" '用access方式
    set record=createobject("adodb.recordset")
    sql="select * from m3_program" '选择具体满足一条件的:sql="select* from m3_program where "
    record.open sql,con
    if(not record.eof) then
    record.movenext
    msgbox("p_name")
    end if
    record.close
    set record=nothing
    con.close
    set con=nothing
    end sub
    '如果没有查到内容,在结果中不会报错,也不会弹出窗口
    9 vbcr----chr(13)回车符
    vblf----chr(10)换行符
    vbcrlf----chr(13)+chr(10)结合
    10 从step run has two ways(一是在key-driven页面,另一个是在代码页面,前者走完项目,后者只是本acton第一行
    11 对于时间,日期等的格式检查(一种是正则表达式,另一种是输出对比,如果
     不好对比,用mid截取一部分对比)
    12对于一些列表框或树结构,如果发生结点名称发生变化,此时如果报没有彼配的对象,此时可以把更改后面的名称如_2"
    13;对于动态变化的对象,要分清是对像还是属性;对于属性可以用gettoproperty("ddd");得到;而对于由于动态无法识别对
    像可以用描述性脚本:
     如:Set ōbject= Descrīption.Create()
    Object("regexpwndclass").Value="HtmlButton"
    Object("regexpwndtitle").Value="登陆"
    browser("ss").page("a").button(Object).click
    14:对于属性是变化的,有时可以把该属性从识别对象里删除
    15:从系统的文件中获取信息及删除文件
    get_file_infor("c:\she.mpg")
    function get_file_infor(url)
    dim fso,f
    set fso=createobject("scrīpting.filesystemobject")
    set f=fso.getfile(url)
    msgbox(f.datecreated)
    f.name:f.size:f.type
    fso.deletefile(url)'/////删除文件
    end function
    --------获取文件夹里所有文件信息
    get_folder_infor("c:\kai")
    function get_folder_infor(folder)
    dim fso,f,f1,n
    set fso=createobject("scrīpting,filesystemobject")
    set f=fso.getfolder(folder)
    set fc=f.files
    for each f1 in fc
    select case f1.name
    case"kai.mpg","she.mpg","dd.mp3"
    end select
    next
    end function

    16,四舍五入可以在后面+0.5,进行自动解决
    17,y=-------waitproperty("visible",true,10000)
    18,on error resume next
    on error goto o
    19 window("").wintreeview("systreeview32").TYpe micctrldown+"p"+micctrlup
    20,定义数组 name=array(1,2,"aa","bb");name(0)=1
    21进行日期YYYY-MM-DD的格式检查 :
    Function RegExpTest(patrn, strng)
    Dim regEx, Match, Matches ' Create variable.
    Set regEx = New RegExp ' Create a regular expression.
    regEx.Pattern = patrn ' Set pattern.
    regEx.IgnoreCase = True ' Set case insensitivity.
    regEx.Global = True ' Set global applicability.
    Set Matches = regEx.Execute(strng) ' Execute search.
    For Each Match in Matches ' Iterate Matches collection.
    RetStr = RetStr & "Match found at position "
    RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
    RetStr = RetStr & Match.Value & "'." & vbCRLF
    Next
    RegExpTest = RetStr
    End Function
    date_pattern="^((((19|20)(([02468][048])|([13579][26]))-02-29))|((20[0-9][0-9])|(19[0-9][0-9]))-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((01,3-9])|(1[0-2]))-(29|30)))))$"
    result_message=RegExpTest(date_pattern, inputbox("请你输入要检查的时间:"))
    Select case result_message
    Case ""
    msgbox("你输入的日期格式与标准不匹配")
    case else MsgBox(result_message)

    现在碰到一个情况:我QTP的参数化是通过读取DataTable(就是那个execel表)里面的数据来实现的,每一次跑一遍脚本,就要修改数据表里面很多列的数据(我测试的那个程序不能输入重复的数据),我想能不能通过程序,来控制那个数据表里面的每一列的数据,再开始跑脚本之前实现动态对数据的增加修改,比如说:我第一次跑脚本用的是原来已经在数据表里面设定好的数据,第二次跑的之前,先把数据表里面的每一列数据+b   列如:原来某一列第一行的值为aa,我第二次跑脚本之前让它变成aab,可以采用下面的方法:

    建议把第二次跑的数据保存在datatable中的另外一列
    var1=datatable("col1",Globalsheet)
    datatable("col2",globalsheet)=var1&"b"

    var2=datatable("col2",globalsheet)
    msgbox var2

    datatable.Export ("d:/test.xls")
    也可以把值保存到环境变量中。

    ---------
    1.GetCellData函数

      作用:获取单元格的值

      例:  rowCount = Browser("xxx ").Page("xxx ").Frame("xxx").WebTable("xxx").RowCount
    For counter = 1 To rowCount
      text = Browser("xxx").Page("xxx").Frame("xxx").WebTable("xxx").GetCellData(counter,1)
      If (text = "xxx") Then
        counter = counter - 1
        selectNO = "#" & counter
        Browser("xxx").Page("xxx").Frame("xxx").WebRadioGroup("xxx").Select selectNO
        Exit For
      End If
    Next

    2.把值插入datatable里

      例:   datatable.setcurrentrow(i)
            datatable.value("name","Global")="name"
            datatable.value("passwd","Global")="passwd"

    3.用代码来启动浏览器

      Browser1 = "IE"
      StartURL = "www.51testing.com"
      IF Browser1 = "IE" THEN
         set IE = CreateObject("InternetExplorer.Application")
         IE.Visible = true
         IE.Navigate StartURL
      END IF
     

    4.ExecuteFile函数

      作用:ExecuteFile 可以直接执行vbs文件,而不需要将其导入resource中
           ExecuteFile FileName
      说明:where FileName is the absolute or relative path of your VBscrīpt file.

      例:ExecuteFile("F:\test.vbs")

    5.Strcomp函数

      作用:比较文本

      例:dim strtext1,strtext2,str ,str1,comp1
         strtext1 = "xxx"
         strtext2 = "xxx"
         str = VbWindow("xxx").VbWindow("xxx").VbLabe1("xxx").GetTOProperty("text")
         str1= VbWindow("xxx").VbWindow("xxx").VbLabel("xxx").GetTOProperty("text")
         comp1=strcomp(strtext1,str,0)
         If  comp=0 Then
              msgbox “这两个串相等”
         else
           msgbox str
         End If

    6.CaptureBitmap 

      作用:捕获屏幕

    7. GetROProperty

      作用:取对象属性值

      例:VbWindow("xxx").VbWindow("xxx").VbWindow("xxx").ActiveX("xxx").GetROProperty("TextMatrix(1,0)") 

    8.ExitAction - 退出当前操作,无论其循环属性如何。
      ExitActionIteration - 退出操作的当前循环。
      ExitRun - 退出测试,无论其循环属性如何。
      ExitGlobalIteration - 退出当前全局循环。


    9.如何使用Excel对象处理数据?
      Dim xl
      打开excel文件
      Function OpenExcelFile(strFilePath)
      Set xl = CreateObject("Excel.Application")
      xl.Workbooks.Open strFilePath
      End Function
      获得指定单元格数据
      Function GetCellData(strSheet,rwIndex,colIndex)
      GetCellData = xl.WorkSheets(strSheet).Cells(rwIndex,colIndex)
      End Function
      填充单元格数据
      Function PutCellData(strSheet,rwIndex,colIndex,varData)
      xl.WorkSheets(strSheet).Cells(rwIndex,colIndex) = varData
      End Function
      保存并推出
      Function SaveAndQuit()
      xl.Activeworkbook.save
      xl.Quit
      Set xl = nothing
      End Function


    10.连接sql数据库

      例:Dim res,cmd,sql
         Set Res=createobject("adodb.recordset")
         Set Cmd=createobject("adodb.command")
         Cmd.activeconnection="Provider=SQLOLEDB.1;Password=111111;Persist Security Info=True;User ID=sa;Initial Catalog=xhq;Data Source=192.168.191.142"  '这句话是连接数据库的数据源,要做修改
        Cmd.CommandType = 1
        sql="selec t * from 表 where name=username"
        Cmd.CommandText = sql
        Set res = Cmd.Execute()
        Set res = nothing
        Set cmd.ActiveConnection = nothing
        Set Cmd= nothing

271/212>
Open Toolbar