努力 创新 求实

发布新日志

  • 转载:微软测试有感

    2008-07-15 22:14:55

     

    最近和微软一哥们聊微软的测试,很有感触,记下来,和大家共同分享。

    全文如下:

    开头语:

    作测试很久了,一直为一些问题所困扰,也一直对微软有一种顶礼膜拜的向往,终于有一天,近距离的接触了微软的测试,感觉不是以前想象中那么遥不可及,却又难以企及。于是把个人觉得微软值得借鉴的地方整理了一下,希望能对大家有所帮助。

     

    1.  测试流程

    首先说说测试流程,微软的测试流程也没什么新的东西,和大多数的测试流程一样。

    大致是先进行测试准备,然后是Testcase的编写,然后是白盒测试(不一定每个项目都有),然后是功能测试阶段,然后是验收测试,最终release

    如果看流程的话,和一般公司大同小异,没什么新花样。但是我觉得值得借鉴的是两点。

    第一,   微软的流程执行的非常认真。

    这点非常值得提倡,我们都知道,测试的最终质量决定于测试流程和测试人员素质,要想测试质量有保证,要么是流程很完善,要么你流程不行,但是个人能力超强。如果有一个很好的流程,就算执行的人稍微差点,最终的质量也不会差到哪里去。所以流程是很重要的。

    但是,看国内的公司欠缺的就是这个,要么是没有流程,要么流程是个花架子,没认真执行过。我想微软的测试人都是超级牛人,但是人家还是老老实实的忠实按照流程来走,我觉得这点非常好。(在IBM 也是这样,笔者以前在IBM作项目的时候,发现他们的文档写的特认真,流程特认真),所以说忠实的执行一个好的流程是成功的一大半。

    第二,   在整个流程中,微软非常强调测试尽早介入。微软在这方面是一致提倡的,按照我们国内IT业的恶习,一般都是软件主体差不多成型了,拉几个测试人员过来点点,其实这是非常不好的。微软的测试人员在项目一开始就和开发人员同步介入,在需求阶段就开始介入,进行需求评审。在开发人员开始编码的时候,测试人员就开始编写Test case,并开发一些测试工具,或者写一些配套的测试代码(不要奇怪,微软的测试人员都能写很好的代码)。微软的理念就是:预防bug比解决bug好,所以非常提倡测试尽早介入,把一部分bug消灭在需求阶段。

    2.  自动化流程

    说到自动化,大家可能以为我是说微软的自动化测试工具多牛,其实微软内部用到的自动化测试工具倒是不多,就算有也都是内部开发的,非常实用的,他们不会去用MI的工具。

            说微软的自动化程度高,主要是体现在流程方面,譬如说整个自动

        构建流程,在开发人       员代码check in之后,系统自动发邮件,邮

        件内容就是一个change list,包括代码更新list以及一个编译者添加的comment,其内容是该版本功能的变化或者修改掉的bug ID。整个测试过程中能用自动化的地方都尽可能采用自动化,尽可能减少人为失误,并且可

        以使人和机器并行工作。个人觉得,这点很值得我们国内的测试公司借鉴,能自动化的流程都自动化,减少一些不必要的沟通。

     

    3.  质量控制机制

    说到质量控制是个大问题,需要整个团队和流程提高素质。那么微软的质量控制可以借鉴的是什么呢?是他们的机制。在微软的测试流程当中,在开发的早期,项目中所有的问题都是Dev leaderPM商量说了算(当然也要参考需求方的意见),但是到后期,具体就是功能测试之后,项目的主动权都在测试这边,某个bug的要不要解决,或者项目进度控制都是测试leader说了算。这和国内的大多数软件公司是不一样的,在微软,测试人员要对最终的软件质量负责任,但是也有相应的权利来约束开发人员。当然,他们也肯定有一些bug是产生争议的,这个时候的仲裁机制就是PM,这个不是我们传统的PMProject manager),而是一种具有微软特色的PM(全称是Program manager)。这样,测试人员在对一些争议bug的处理上有相当的话语权。

     

    4.  测试用例及管理

    微软的测试用例倒没什么特别的,不过看过他们用例之后,还是觉得写的详细,认真,但是又不冗长拖沓,这个需要很高深的水平。另外,微软的测试用例管理用的是微软自己开发的用例管理工具。

    另外值得说明的是,微软的每个用例都进行了分级,并且功能所在的模块都标的很清楚。

     

    5.  效率

    在效率方面,微软的测试效率非常高!高的让人惊叹,我问一个在微软工作的哥们,“你们那边测试的最大特点是什么”,他说“最大特点是快!”,就是效率很高,具体就是在测试后期过程中测试和开发之间的反馈非常快,开发修改一定量的bug,提交一个新的版本。测试人员往往能在很快的时间内把测试结果反馈出来,一般是在1天之内就能把用例快速run一遍,这样就能减少某些后期才发现bug导致的项目delay。在国内很多项目的通病是,开发解决问题带进一个新问题,测试人员整个遍历一遍用例之后才能发现,这样来回反复就消耗了大量的时间。

    但微软是如何才能实现快速反馈呢?

    第一,   测试人员对程序的了解,微软的测试人员对程序内部结构都非常熟悉,修改某一个地方,可能引起什么问题,哪些用例需要重新测试,测试人员非常清楚,能快速的执行最可能出错的地方。如果某些模块不熟悉,那么他们会和开发人员在一起沟通这次修改可能引起的问题。

    第二,   工具!还是工具,在微软的测试中,测试人员用各种工具帮助测试,提高测试效率是占到很大的比重。

    第三,   时间意识。微软的测试人员有强烈的时间意识。

     

    6.  测试工具

    测试工具能很大程度上提高测试效率,这个作为测试人员都很清楚。当然测试工具在微软的测试中也应用非常广泛,但是请注意,微软并不是像我们国内的公司一样使用的都是LRQTP这类的录制回放工具,反而这种工具倒是用的不多,就跟微软不屑CMM一样,可能是不想屈尊自己IT老大的身份吧。

    但是微软的测试工具最大的特点是实用。他们用的测试工具都是确实能提高效率,确实能办事情的工具,都不是类似WRQTP的很大很系统的工具,而是比较小的,很灵活,实用的小工具(譬如:FiddlerDriphttpwatchIE DevToolBarPaintNotNetprocexp etc.)。甚至有一些测试工具是测试人员在开发人员协助下根据项目需要临时开发的,不过大多数工具都是微软内部已经共享出来的,在微软内部各种各样的小工具特别多。

    总体给我的感觉是,不是为了用测试工具而用,而是根据实际的需要,确实能提高效率而用到,在用的过程中确实也很大的提高了效率。

     

    7.  测试人员的专业素质

    微软测试给我印象最深刻的还有他们测试人员的专业水准,在测试过程中,测试人员在一些技术上并不逊色于开发人员,在一些bug的处理上,能提出很多合理的很有建设性的建议。

     

    8.  微软的白盒测试

    微软的白盒测试怎么执行呢?让我略微有点吃惊的是,微软的一半测试人员基本不做白盒测试,除非有些不能做黑盒的模块,另外也不是所有的产品都作白盒测试。

    微软的白盒测试一般还是由专门的白盒测试人员来做,但是开发人员要对测试人员的白盒测试代码进行Review,另外微软对开发人员的代码,效率也都有一套详细的考核机制,所以开发人员对自己的代码也是非常负责任的,都进行很认真的进行测试。

     

    9.  意识(时间,质量)

    另外微软的测试还有很好的一点就是意识,时间和质量的意识都是非常强。在控制时间成本上,意识非常强,这点非常值得我们国内同仁学习,另外,风险管理的机制和意识都是非常好。在微软,项目组的每个成员都被明确告知,如果这个项目每delay一天,就会损失多少个million的美元,所以整个项目组都有比较好的时间意识。

    另外,在微软,项目组人员的质量意识都是比较强的。怎么样更好服务用户,让用户体验更好,怎么样更好的改进,这种意识比较强。

     

    10. 微软的培训

    在微软内部,员工外训的机会比较少,大多都是内部互训,各人培训自己的强项,有比较好的互相分享的习惯。另外微软的内部有非常丰富的各种培训文档。以后我会上传上去和大家分享。

     

    11 测试数据记录

    微软的测试数据记录是非常全的,也都是系统自动的,每天都是由系统自动统计当天的bug情况,然后发送一个report到每个项目组成员的邮箱里。最后到测试总结的时候,这些测试数据将变得非常有用。

    编后感:在深入了解微软的测试之前,对微软这个IT业界巨无霸的测试感觉是顶礼膜拜,高不可攀,总觉得可能很神秘,用很牛的技术或者很高深的手段。深入了解之后,发现微软的测试也是和我们做一样的事情,只不过人家做的更认真,更细,更实用,更有效率。再回过头来看时,微软的测试给我留下印象最多的是,流程,效率,意识,工具,素质!也就是这几项,成为我们国内IT企业亟需跨越的。


  • LoadRunner CPC认证考试复习试题

    2008-04-18 12:04:05

    LoadRunner CPC认证考试复习试题


    x.w*v W!Lv156874LoadRunner CPC认证考试复习试题(2006年12月版本),部分答案将在以后公布. CPC考试在2006年12月之前是实验室上机考试,主要分为问答题,选择题和编程题,考试结果一个月之后揭晓,批卷在Mercury的亚太总部新加坡进行的.这里是部分的选择题. 另外,2007年据说将实行新的题型,改为跟SP考试同样的类型,所以题目难度可能有所降低.

    1. How many default Widows: Apache counters are added?

    a) 10 : 5

    b) 11 : 9

    c) 6 : 10

    d) 9 : 4

    e) 5 : 2

    f) None of above

    2. Can the list of default Windows monitors be changed?

    a) No-this list is determined by Microsoft Corporation

    b) Yes-modify the scenario .Irs file

    c) No-only the domain administrator can modify it

    d) Yes-modify a cfg file in LoadRunner’s installation directory

    e) Yes-modify a dft file in LoadRunner’s \dat directory

    f) All of the above

    软件测试专业网站:51Testing软件测试网c.DB"V$O5[
    3. For a host machine in a different domain, you try to monitor PerfMon on it and get an “access denied” message. What might resolve this problem?

    a) Edit a cfy file in the LoadRunner installation directory to update permissions

    b) Edit the registry on the host machine to update permissions by granting READ access toHKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Perflib

    c) Ensure the host machine and the controller machine use the same version of WindowsNT

    d) Run the netstat command from the host machine to update permissions

    e) Run the net use command to update permissions

    f) All of the above


    9O[T9[{IG{1568744. If you run tracert and notice significant network delays while running the load test, depending on the network configuration, you could try the following to reduce net-work traffic:

    a) Run PerMon and check network byte transfer rate on the controller machine

    b) Have the network admin increase the physical packet size (MTU)for large data sets since fragments degrade performance

    c) Initialize all vusers before loading them for the test

    d) If the problem is the network, upgrade the NIC

    e) Configure the controller to write run-time data to a shared network drive, rather than to the host machines

    f) None of the above


    +?0V M+M)P4V-Hx1568745. To monitor an Apache server:

    a) You need the correct URL that reports server statistics

    b) You need to monitor through port 80 to accurately measure the end user experience.

    c) You can update the monitor defaults via a .cfg file in LoadRunner’s \monitors folder

    d) You can update the defaults via a dft file in LoadRunner’s\dat directory

    e) You can monitor Apache even if there is a proxy server between the controller and the Apache servers, after updating a LoadRunner .cfg file

    f) All of above


    7I;H C)d2R,]1568746. Choose the true answer(s) from the list below

    a) You can change the agent’s working language from a list of 4 languages

    b) Use path translation where controller and hosts map a different path to a shared drive where scrīpts are stored

    c) You can select to not collate log files after a run

    d) You can set a file transfer trace if you have problems transferring files

    e) Temporary files ate saved during a run: LoadRunner agent files ate stored in Irr folders and controller files ate stored in brr folders

    f) All temporary files are automatically deleted at the end of the run and cannot be automatically saved

    软件测试专业网站:51Testing软件测试网(R_8n:jW:]
    7. Which of the following is true when trouble-shooting the controller’s communication with load generators?

    a) The controller always uses the host machine’s short name so all host machines must be in the same domain as the controller

    b) To ensure the full machine name is used, modify a .ini file in LoadRunner’s \dat directory

    c) An .exe file in LoadRunner’s \bin lets you check that tcp/ip is properly installed on a current machine since tcp/ip problems can prevent load testing

    d) If the controller has multiple IPs, alias the controller’s name on all load generators via their. Hosts file

    e) Path translation is only effective across different OS platforms

    f) All of the above


    2]Y,H8Q#Lu }1568748. When configuring online graphs per load test, you :

    a) Can choose to display the x-axis with or without clock time

    b) Can choose to let LR automatically pick the Y-axis or set s min max value for custom scaling

    c) Can modify line colors, scaling and visibility of measurements on graphs

    d) Can monitor multiple machine on one monitor graph

    e) Cannot monitor multiple machines on multiple monitor graphs

    f) All of above


    ,[O7ID imz/b^1568749. During a scenario run, the default storage location for vuser data is :

    a) The controller’s temporary folder- this is configurable

    b) The controller’s result folder- this is not configurable

    c) The host’s installation folder-this is not configurable

    d) The host’s temporary folder- this is configurable

    e) The controller’s installation folder- this is configurable

    f) None of above

    软件测试专业网站:51Testing软件测试网\0XL0w+Sn:h/H_
    10. New features in LR 7.6 include:

    a) Wan emulator

    b) Multi-protocol support

    c) Remote global performance monitor

    d) MS-Word report generator

    e) EJB analysis – new views

    f) Analysis data import wizard

    g) All of the above

    软件测试专业网站:51Testing软件测试网!} yL#AN@ V7|[0u(C9T6M
    11. Pick the top time transaction(s) for your 3 rd run :

    a) Login

    b) Logout

    c) FlightSearch_roundTrip

    d) FlightSelect_roundTrip

    e) FlightPurchase_roundTrip

    f) FlightSearch _oneWay

    g) FlightSelect_ oneWay

    h) FlightPurchase_oneWay

    i) DeleteItinerary

    j) ViewItineraryh_roundTrip

     

    12. What must happen in order to generate analysis data :

    a) Transactions must be used

    b) Performance monitors must be used

    c) User data points must be defined

    d) Rendezvous functions must be enabled

    e) Online graphs must be viewed


    4z"QI#]6}f(Y L15687413. You can prevent excessive use of disk space for the analysis database by :

    a) Verifying list separator registry options ate the same on your machine as on the database machine

    b) Instructing LoadRunner to save in Access 2000 rather than Access 97

    c) Storing small databases on a SQL server or MSDE machine

    d) Storing large databases on a SQL server or MSDE machine

    e) Clicking a button in the Options>database tab

    软件测试专业网站:51Testing软件测试网F,P7h MO8a6B
    14. If using a time range filter for stored scenario data:

    a) The running vusers graph expands to suit

    b) The processing time decreases

    c) The db size increases to track what is ignored

    d) The db size decreases

    e) This behavīor will be globally applied

    软件测试专业网站:51Testing软件测试网 lRK,}4v:xe}
    15. When saving display options and filters for future reuse, available features include:

    a) Automatically apply this template to a new session

    b) Use automatic granularity

    c) Generate the following automatic HTML report

    d) Automatically save the session as

    e) All of the above

    软件测试专业网站:51Testing软件测试网C uD:@u7z
    16. From recent versions of the analysis tool, you :

    a) Cannot view the controller’s vuser groups information

    b) Can view the controller’s build number

    c) Can view the controller’s scheduling details

    d) Can distinguish between summary and complete analysis data

    e) All of above


    d\UM H$p'DGd15687417. Which of the following customizations can you apply to a subset of graphs?

    a) Can change the title font and text

    b) Cannot change the background/foreground colors or add images unless exported

    c) Can change the depth perception on the graph using an additional dimension

    d) Cannot rotate or tilt

    e) All of the above


    ,g"B,c0s/r%g15687418. To standardize a gragh is to

    a) Focus on behavīor patterns

    b) Cancel axtual vaues

    c) Have y-axis values converge around zero

    d) Plot standard deviation values

    e) None of the above


    %N Ra ] k8Us4l15687419. The Transactions per Second graph helps you to determine load on the system at any given moment

    a) False

    b) True

    软件测试专业网站:51Testing软件测试网:cvY.H+Q8[b'y
    20. The Response Time (under load) graph helps you create a gradual load

    a) False

    b) True

    软件测试专业网站:51Testing软件测试网\JjJm
    21. The graph helps you calculate the time to first buffer.

    a) False

    b) True


    E\(~ ?)B15687422. If you have min and max acceptable transaction times defined, you can use the Distribution graph to determine if server performance is within an acceptable range.

    a) False

    b) True

    软件测试专业网站:51Testing软件测试网"_6UWu3b)QdG\
    23. The auto correlation options include:

    a) Automatic

    b) Correlate data based on X second intervals

    c) Manual

    d) Correlate data based on X minute intervals

    e) None of the above


    7irNF G.J|`m15687424. When tuning a system, web/web-app server metrics to check include:

    a) Browser version

    b) Physical memory

    c) Load balancing algorithm

    d) Images per page

    e) CPU

    软件测试专业网站:51Testing软件测试网N"O N8Y:^g!j
    25. Two examples of common database server problems are:

    a) Corrupt .dll files

    b) Inefficient index design

    c) Fragmented databases

    d) Compacted data

    e) Short transactions

    软件测试专业网站:51Testing软件测试网kq2G"Jh9|bt6u
    26. When making improvements to SSL web application performance, include these steps:

    a) Cache the session identifiers from each transaction

    b) Avoid excessive use of SSL and re-design pages that have low data sensitivity to not use SSL.

    c) Use “keep-alive” enhancement features available with most web browsers

    d) Change level of security according to level of data sensitivity

    e) Use SSL accelerator appliances and cards

    软件测试专业网站:51Testing软件测试网,ekO+{0~(G!g
    27. Network bottlenecks are indicated during a test when you add considerable load but:

    a) Sever-side components are barely affected

    b) Outgoing replied are significantly delayed compared to incoming requests

    c) Receive timeouts only

    d) No idle servers available

    e) All of above


    3I7mz)ui.LE15687428. Load tests and subsequent data analysis are recommended:

    a) During initial load testing of the test system to determine its final state

    b) After tuning the system to ensure previous problems were fixed

    c) During finial load testing of the system to prove new bottlenecks exist

    d) When determining configuration changes to improve response times

    e) When determining architectural changes to improve response times

    软件测试专业网站:51Testing软件测试网/X jq/A@
    29. Available performance reports include:

    a) Detailed Summary

    b) Transaction Performance by Vuser

    c) Detail Transaction

    d) Failed Transactions

    e) All of above


    1n2a-| LS0bBXd7J15687430. Available activity reports include:

    a) Scenario Summary

    b) Failed Transaction

    c) Failed Vuser

    d) Scenario Execution

    e) All of above

    软件测试专业网站:51Testing软件测试网|2}0RD-o A u{
    31. Two prerequisites for merging graphs are:

    a) Both graphs must be identical

    b) The graph should have identical axes

    c) Both graphs should be opened first

    d) Both graphs should share one common axis

    e) None of the above


    $?U})R'P0K U At"@h15687432. Cross-result graphs can be use to:

    a) Check 2 different result files(maximum)

    b) Test software versions

    c) Determine system capacity

    d) Benchmark hardware

    e) All of above

  • 内存分配方式

    2008-03-19 22:25:45

    内存分配方式
    -------------------------------------------------------------------------

    内存分配方式有三种:
    1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量static变量。
    2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存 分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
    3) 从堆上分配,亦称动态内存分配。程序在运行的时候用mallocnew申请任意多少的内存,程序员自己负责在何时用freedelete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

    常见的内存错误及其对策

    -------------------------------------------------------------------------

    发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。有时用户怒气冲冲地把你找来,程序却没有发生任何问题,你一走,错误又发作了。

    常见的内存错误及其对策如下:

    1>内存分配未成功,却使用了它。
    ------------------------------------------
    编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检 指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用mallocnew来申请内存,应该用if(p==NULL) if(p=NULL)进行防错处理。

    2>内存分配虽然成功,但是尚未初始化就引用它
    ------------------------------------------
    犯这种错误主要有两个起因:一是没有初始化的观念;二是误以为内存的缺省初值全为零,导致引用初 错误(例如数组)。
    内存的缺省初值究竟是什么并没有统一的标准,尽管有些时候为零值,我们宁可信其无不可信其有。所 以无论用何种方式创建数组,都别忘了赋初值,即便是赋零值也不可省略,不要嫌麻烦。

    3>内存分配成功并且已经初始化,但操作越过了内存的边界。
    ------------------------------------------
    例如在使用数组时经常发生下标"1"或者"1"的操作。特别是在for循环语句中,循环次数很容易搞错,导致数组操作越界。

    4>忘记了释放内存,造成内存泄露。
    ------------------------------------------
    含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足,你看不到错误。终有一次程序突然死掉,系统出现提示:内存耗尽。动态内存的申请与释放必须配对,程序中mallocfree的使用次数一定要相同,否则肯定有错误(new/delete同理)。

    5>释放了内存却继续使用它。
    ------------------------------------------
    有三种情况:
    1)程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。
    2)函数的return语句写错了,注意不要返回指向"栈内存""指针"或者"引用",因为该内存在函数体结束时被自动销毁。
    3)使用freedelete释放了内存后,没有将指针设置为NULL。导致产生"野指针"

    【规则1】用mallocnew申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。
    【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。
    【规则3】避免数组或指针的下标越界,特别要当心发生"1"或者"1"操作。
    【规则4】动态内存的申请与释放必须配对,防止内存泄漏。
    【规则5】用freedelete释放了内存之后,立即将指针设置为NULL,防止产生"野指针"

    -------------------------------------------------------------------------

    指针与数组的对比
    C++/C
    程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以为两者是等价的。
        
    数组
    -------------
    数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变。

    指针
    --------------
    指针可以随时指向任意类型的内存块,它的特征是"可变",所以我们常用指针来操作动态内存。指针远比数组灵活,但也更危险。

    下面以字符串为例比较指针与数组的特性。

    1.修改内容
    ------------------------------------------
    示例1中,字符数组a的容量是6个字符,其内容为hello\0a的内容可以改变,如a[0]= 'X'
    指针p指向常量字符串"world"(位于静态存储区,内容为world\0),常量字符串的内容是不可以被修改的。
    从语法上看,编译器并不觉得语句p[0]= ‘X'有什么不妥,但是该语句企图修改常量字符串的内容而导致运行错误。

    示例7-3-1 修改数组和指针的内容
       ------------------------------
       char a[] = "hello";
       a[0] = 'X';
       cout << a << endl;
       char *p = "world"; //
    注意p指向常量字符串  
       p[0] = 'X'; //
    编译器不能发现该错误
    cout << p << endl;
      

    2.内容复制与比较
    ------------------------------------------
    数组复制
    --------
    不能对数组名进行直接复制与比较。示例2中,若想把数组a的内容复制给数组b,不能用语句 b = a ,否则将产生编译错误。应该用标准库函数strcpy进行复制。同理,比较ba的内容是否相同,不能用if(b==a) 来判断,应该用标准库函数strcmp进行比较。

    指针复制
    --------
    语句p = a 并不能把a的内容复制指针p,而是把a的地址赋给了p。要想复制a的内容,可以先用库函数mallocp申请一块容量为strlen(a)+1个字符的内存,再用strcpy进行字符串复制。同理,语句if(p==a) 比较的不是内容而是地址,应该用库函数strcmp来比较。

    示例2 数组和指针的内容复制与比较
    -----------------------------------
            //
    数组...
    char a[] = "hello";
    char b[10];
    strcpy(b, a); //
    不能用
    b = a;
    if(strcmp(b, a) == 0) //
    不能用
    if (b == a)...
    //
    指针
    ...
    int len = strlen(a);
    char *p = (char *)malloc(sizeof(char)*(len+1));  
    strcpy(p,a); //
    不要用
    p = a;
    if(strcmp(p, a) == 0) //
    不要用 if (p == a)...

    3 计算内存容量
    ------------------------------------------
    数组
    ----
    用运算符sizeof可以计算出数组的容量(字节数)。
    示例3中,sizeof(a)的值是12(注意别忘了'\0')。

    指针
    ----
    指针p指向a,但是sizeof(p)的值却是4。这是因为sizeof(p)得到的是一个指针变量的字节数,
    相当于sizeof(char*),而不是p所指的内存容量。

    C++/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。

    注意
    ----
    当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。
    示例3中,不论数组a的容量是多少,sizeof(a)始终等于sizeof(char *)
          
          
    示例3 计算数组和指针的内存容量
    -----------------------------
            char a[] = "hello world";
    char *p = a; cout<< sizeof(a) << endl;// 12
    字节
    cout<< sizeof(p) << endl;// 4
    字节

    示例3b) 数组退化为指针
    -----------------------------
    void Func(char a[100])
    {
    cout<< sizeof(a) << endl;// 4
    字节而不是100字节
       }

    4、指针参数是如何传递内存的?
    ------------------------------------------
    如果函数的参数是一个指针,不要指望用该指针去申请动态内存。
    示例4-1中,Test函数的语句GetMemory(str, 200)并没有使str获得期望的内存,str依旧是NULL,为什么?

    示例4-1 试图用指针参数申请动态内存
    ----------------------------------
    void GetMemory(char *p, int num)
    {
    p = (char *)malloc(sizeof(char) * num);
    }
    void Test(void)
    {
    char *str = NULL;
    GetMemory(str, 100);// str
    仍然为 NULL
    strcpy(str, "hello"); //
    运行错误

    }

    毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本,
    指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,
    就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。
    在本例中,_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变。
    所以函数GetMemory并不能输出任何东西。
    事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。

    如果非得要用指针参数去申请内存,那么应该改用"指向指针的指针",见示例4-2

    示例4-2用指向指针的指针申请动态内存
    ------------------------------------
    void GetMemory2(char **p, int num)
    {
    *p = (char *)malloc(sizeof(char) * num);
    }
    void Test2(void)
    {
    char *str = NULL;
    GetMemory2(&str, 100); //
    注意参数是 &str,而不是str
    strcpy(str, "hello");
    cout<< str << endl;
    free(str);
    }


    由于"指向指针的指针"这个概念不容易理解,我们可以用函数返回值来传递动态内存。
    这种方法更加简单,见示例4-3

    示例4-3 用函数返回值来传递动态内存
    -----------------------------------
    char *GetMemory3(int num)
    {
    char *p = (char *)malloc(sizeof(char) * num);
    return p;
    }
    void Test3(void)
    {
    char *str = NULL;
    str = GetMemory3(100);
    strcpy(str,"hello");
    cout<< str << endl;
    free(str);
    }


    用函数返回值来传递动态内存这种方法虽然好用,但是常常有人把return语句用错了。这里强调不要用return语句返回指向"栈内存"的指针,因为该内存在函数结束时自动消亡,见示例4-4

    示例4-4 return语句返回指向"栈内存"的指针
    --------------------------------------------
    char *GetString(void)
    {
    char p[] = "hello world";
    return p;//
    编译器将提出警告
    }
    void Test4(void)
    {
    char *str = NULL;str = GetString();// str
    的内容是垃圾
    cout<< str << endl;
    }


    用调试器逐步跟踪Test4,发现执行str = GetString语句后str不再是NULL指针,
    但是str的内容不是"hello world"而是垃圾。

    如果把示例4-4改写成示例4-5,会怎么样?

    示例4-5 return语句返回常量字符串
    -----------------------------------
    char *GetString2(void)
    {
    char *p = "hello world";
    return p;
    }
    void Test5(void)
    {
    char *str = NULL;
    str = GetString2();
    cout<< str << endl;
    }


    函数Test5运行虽然不会出错,但是函数GetString2的设计概念却是错误的。
    因为GetString2内的"hello world"是常量字符串,位于静态存储区,它在程序生命期内恒定不变。
    无论什么时候调用GetString2,它返回的始终是同一个"只读"的内存块。

    5 freedelete把指针怎么啦?
    ------------------------------------------
    别看freedelete的名字恶狠狠的(尤其是delete),
    它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。
    用调试器跟踪示例5,发现指针pfree以后其地址仍然不变(非NULL),
    只是该地址对应的内存是垃圾,p成了"野指针"
    如果此时不把p设置为NULL,会让人误以为p是个合法的指针。
    如果程序比较长,我们有时记不住p所指的内存是否已经被释放,
    在继续使用p之前,通常会用语句if (p !=NULL)进行防错处理。
    很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,
    它也不指向合法的内存块。

    示例5 p成为野指针
    --------------------
    char *p = (char *) malloc(100);
    strcpy(p, "hello");
    free(p);        // p
    所指的内存被释放,但是p所指的地址仍然不变 ...
    if(p != NULL) //
    没有起到防错作用

    {      strcpy(p, "world"); //
    出错
    }

    6 动态内存会被自动释放吗?
    ------------------------------------------
    函数体内的局部变量在函数结束时自动消亡。很多人误以为示例6是正确的。
    理由是p是局部的指针变量,它消亡的时候会让它所指的动态内存一起完蛋。这是错觉!

    示例7-6 试图让动态内存自动释放
    ------------------------------
    void Func(void)
    {
    char *p = (char *) malloc(100); //
    动态内存会自动释放吗?
    }


    我们发现指针有一些"似是而非"的特征:
    ------------------------------------
    1)指针消亡了,并不表示它所指的内存会被自动释放。
    2)内存被释放了,并不表示指针会消亡或者成了NULL指针。
        
    这表明释放内存并不是一件可以草率对待的事。也许有人不服气,
        
    一定要找出可以草率行事的理由:
        
    如果程序终止了运行,一切指针都会消亡,动态内存会被操作系统回收。
        
    既然如此,在程序临终前,就可以不必释放内存、不必将指针设置为NULL了。
        
    终于可以偷懒而不会发生错误了吧?
    想得美。如果别人把那段程序取出来用到其它地方怎么办?

    7 杜绝"野指针"
    ------------------------------------------
    "
    野指针"不是NULL指针,是指向"垃圾"内存的指针。

    人们一般不会错用NULL指针,因为用if语句很容易判断。
    但是"野指针"是很危险的,if语句对它不起作用。

    "野指针"的成因主要有两种:

    1)指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,
    它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,
    要么将指针设置为NULL,要么让它指向合法的内存。例如
    char *p = NULL;
    char *str = (char *) malloc(100);

    2)指针pfree或者delete之后,没有置为NULL,让人误以为p是个合法的指针。参见7.5节。

    3)指针操作超越了变量的作用范围。这种情况让人防不胜防,示例程序如下:
    class A
    {
    public:
    void Func(void){ cout << "Func of class A" << endl;
    }

    void Test(void)
    {
    A *p;
    {
    A a;
    p = &a; //
    注意 a 的生命期

    }
    p->Func();// p
    "野指针"
    }

    函数Test在执行语句p->Func()时,对象a已经消失,而p是指向a的,所以p就成了"野指针"
    但奇怪的是我运行这个程序时居然没有出错,这可能与编译器有关。

    8 有了malloc/free为什么还要new/delete
    ------------------------------------------
    malloc
    freeC++/C语言的标准库函数,new/deleteC++的运算符。
    它们都可用于申请动态内存和释放内存。

    对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。
    对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。
    由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,
    不能够把执行构造函数和析构函数的任务强加于malloc/free

    因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运

    算符delete。注意new/delete不是库函数。
    我们先看一看malloc/freenew/delete如何实现对象的动态内存管理,见示例8

    示例8 malloc/freenew/delete如何实现对象的动态内存管理
    -------------------------------------------------------------
    class Obj
    {
    public :
    Obj(void){ cout << "Initialization" << endl; }
    ~Obj(void){cout << "Destroy" << endl; }
    void Initialize(void){ cout << "Initialization" << endl; }
    void    Destroy(void){ cout << "Destroy" << endl; }
    };
    void UseMallocFree(void)
    {
    Obj *a = (obj *)malloc(sizeof(obj)); //
    申请动态内存
    a->Initialize(); //
    初始化
    a->Destroy(); //
    清除工作
    free(a);//
    释放内存
    }
    void UseNewDelete(void)
    {
    Obj *a = new Obj;//
    申请动态内存并且初始化
    delete a;//
    清除并且释放内存
    }

    Obj的函数Initialize模拟了构造函数的功能,函数Destroy模拟了析构函数的功能。
    函数UseMallocFree中,由于malloc/free不能执行构造函数与析构函数,
    必须调用成员函数InitializeDestroy来完成初始化与清除工作。
    函数UseNewDelete则简单得多。

    所以我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete
    由于内部数据类型的"对象"没有构造与析构的过程,对它们而言malloc/freenew/delete是等价的。

    既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?
    这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。

    如果用free释放"new创建的动态对象",那么该对象因无法执行析构函数而可能导致程序出错。
    如果用delete释放"malloc申请的动态内存",理论上讲程序不会出错,但是该程序的可读性很差。
    所以new/delete必须配对使用,malloc/free也一样。

    9 内存耗尽怎么办?
    ------------------------------------------
    如果在申请动态内存时找不到足够大的内存块mallocnew将返回NULL指针,宣告内存申请失败。
    通常有三种方式处理"内存耗尽"问题。

    1)判断指针是否为NULL,如果是则马上用return语句终止本函数。例如:
    void Func(void)
    {
    A *a = new A;
    if(a == NULL)
    {
       return;
    }
    ...
    }

    2)判断指针是否为NULL,如果是则马上用exit(1)终止整个程序的运行。例如:
    void Func(void)
    {
    A *a = new A;
    if(a == NULL)
    {
       cout << "Memory Exhausted" << endl;
       exit(1);
    }
    ...
    }

    3)为newmalloc设置异常处理函数。

    例如Visual C++可以用_set_new_hander函数为new设置用户自己定义的异常处理函数,
    也可以让malloc享用与new相同的异常处理函数。详细内容请参考C++使用手册。

    上述(1)(2)方式使用最普遍。如果一个函数内有多处需要申请动态内存,
    那么方式(1)就显得力不从心(释放内存很麻烦),应该用方式(2)来处理。

    很多人不忍心用exit(1),问:"不编写出错处理程序,让操作系统自己解决行不行?"
    不行。如果发生"内存耗尽"这样的事情,一般说来应用程序已经无药可救。

    如果不用exit(1) 把坏程序杀死,它可能会害死操作系统。
    道理如同:如果不把歹徒击毙,歹徒在老死之前会犯下更多的罪。

    有一个很重要的现象要告诉大家。对于32位以上的应用程序而言
    ,无论怎样使用mallocnew,几乎不可能导致"内存耗尽"
    我在Windows 98下用Visual C++编写了测试程序,见示例9
    这个程序会无休止地运行下去,根本不会终止。
    因为32位操作系统支持"虚存",内存用完了,自动用硬盘空间顶替。
    我只听到硬盘嘎吱嘎吱地响,Window 98已经累得对键盘、鼠标毫无反应。

    我可以得出这么一个结论:对于32位以上的应用程序,"内存耗尽"错误处理程序毫无用处。这下可把UnixWindows程序员们乐坏了:反正错误处理程序不起作用,我就不写了,省了很多麻烦。

    我不想误导读者,必须强调:不加错误处理将导致程序的质量很差,千万不可因小失大。

    示例9试图耗尽操作系统的内存
    void main(void)
    {
       float *p = NULL;
       while(TRUE)
       {
        p = new float[1000000];
        cout << "eat memory" << endl;
        if(p==NULL) exit(1);
       }
    }

    10 malloc/free 的使用要点
    ------------------------------------------
    函数malloc的原型如下:
    void * malloc(size_t size);
    malloc申请一块长度为length的整数类型的内存,程序如下:
    int *p = (int *) malloc(sizeof(int) * length);
    我们应当把注意力集中在两个要素上:"类型转换""sizeof"
    malloc
    返回值的类型是void *,所以在调用malloc时要显式地进行类型转换,
    void * 转换成所需要的指针类型。
    malloc
    函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数。
    我们通常记不住int,float等数据类型的变量的确切字节数。例如int变量在16位系统下是2个字节
    ,在32位下是4个字节;而float变量在16位系统下是4个字节,在32位下也是4个字节。

    最好用以下程序作一次测试:
    cout << sizeof(char) << endl;
    cout << sizeof(int) << endl;
    cout << sizeof(unsigned int) << endl;
    cout << sizeof(long) << endl;
    cout << sizeof(unsigned long) << endl;
    cout << sizeof(float) << endl;
    cout << sizeof(double) << endl;
    cout << sizeof(void *) << endl;

    malloc"()"中使用sizeof运算符是良好的风格,但要当心有时我们会昏了头,写出 p = malloc(sizeof(p))这样的程序来。

    函数free的原型如下:

    void free( void * memblock );

    为什么free函数不象malloc函数那样复杂呢?这是因为指针p的类型以及它所指的内存的容量事先都是知道的,语句free(p)能正确地释放内存。如果pNULL指针,那么freep无论操作多少次都不会出问题。

    如果p不是NULL指针,那么freep连续操作两次就会导致程序运行错误。

    11 new/delete 的使用要点
    ------------------------------------------
    运算符new使用起来要比函数malloc简单得多,例如:
    int *p1 = (int *)malloc(sizeof(int) * length);
    int *p2 = new int[length];
    这是因为new内置了sizeof、类型转换和类型安全检查功能。对于非内部数据类型的对象而言,
    new
    在创建动态对象的同时完成了初始化工作。
    如果对象有多个构造函数,那么new的语句也可以有多种形式。
    例如
    class Obj
    {
    public :
    Obj(void); //
    无参数的构造函数
    Obj(int x); //
    带一个参数的构造函数
    ...
    }
    void Test(void)
    {
    Obj *a = new Obj;
    Obj *b = new Obj(1); //
    初值为1
    ...
    delete a;
    delete b;
    }
    如果用new创建对象数组,那么只能使用对象的无参数构造函数。例如

    Obj *objects = new Obj[100]; //
    创建100个动态对象
    不能写成
    Obj *objects = new Obj[100](1);//
    创建100个动态对象的同时赋初值1
    在用delete释放对象数组时,留意不要丢了符号‘[]'。例如

    delete []objects; //
    正确的用法
    delete objects; //
    错误的用法
    后者相当于delete objects[0],漏掉了另外99个对象。

     

  • QTP

    2008-03-13 12:55:16

    Mercury QuickTest Professional 8.2 自述文件

    本文件提供有关 QuickTest Professional 的下列信息:

    概述

    欢迎使用 QuickTest Professional - Mercury 关键字驱动的自动测试解决方案。通过监视最终用户行为,QuickTest Professional 创建交互式可自定义测试或组件,从而简化并缩短测试周期。

    通过 QuickTest Professional,可以测试标准 Windows 应用程序、Web 对象、ActiveX 控件和 Visual Basic 应用程序。还可以获得适用于许多特殊环境的其他 QuickTest 加载项,例如 Java、Oracle、SAP 解决方案、.NET Windows 以及 Web Forms、Siebel、PeopleSoft 和终端仿真器应用程序。

    QuickTest Professional 兼容 Unicode,支持 Unicode 2.0、UTF-8 和 UTF-16。

    QuickTest Professional 支持运行 WinRunner 7.6 及更高版本的 WinRunner 测试和函数。

    对于测试管理,QuickTest Professional 可以与 Mercury 集中质量解决方案 Quality Center(原为 TestDirector)集成,适用于 TestDirector 7.6 Service Pack 4、TestDirector 8.0 Service Pack 2 和 Quality Center 8.2 版。

    对于 Business Process Testing,QuickTest Professional 可以与 Quality Center 8.2 版(带有支持 Business Process Testing 的许可证)集成。

    QuickTest Professional 可以与 LoadRunner 集成,后者是用于应用程序性能测试的 Mercury 工具(用于版本 7.8、7.81 (FP1) 和 8.0)。

    QuickTest Professional 还可以与 Mercury 应用程序管理(原为 Topaz)集成,后者是用于优化业务可用性和问题解析的 Mercury 解决方案。

    新增功能

    QuickTest Professional 8.2 包含下列新增功能:

    • 新的业务组件关键字视图,有助于在自编文档表格用户界面中快速便捷地设计组件,而无需编程知识。在外观和功能上,业务组件关键字视图类似于 Quality Center 的业务组件模块中的“步骤”选项卡。这使得 QuickTest 用户和 Quality Center 用户可以看到相同的组件内容。
    • 新的函数定义生成器,通过该生成器,可以快速编写和注册用户为测试和组件定义的新函数。
    • 关键字视图中新的“仅文档”选项,通过该选项,可以查看和打印测试或组件的自动文档信息。例如,您可能希望查看和打印“文档”列中显示的步骤描述,以便作为手动测试的说明。
    • QuickTest 提供了一种新的参数类型,即局部参数。使用局部参数,可以对步骤的输入值进行参数化,或者将运行时值输出到一个参数。局部参数只能由当前业务组件进行访问。
    • 现在可以创建多个应用程序区域,并针对应用程序的各个部分使用不同的应用程序区域。每个应用程序区域指定某个组件可使用的资源和设置。
    • QuickTest 提供了一组预定义的资源文件,您可以将其与一个应用程序区域或特定组件相关联,以便获得其他功能。

    在新增功能帮助(从“帮助”>“QuickTest 的新增功能”获得)中,可以找到有关上述功能的其他信息及更多功能。

    客户支持

    通过我们屡获殊荣的客户支持网站为 QuickTest Professional 提供技术支持。客户可以从该网站查阅常见问题、提交并检查支持请求的状态,以及访问联机文档、修补程序和其他下载内容。请访问客户支持网站:

    http://support.mercury.com

    可以从以下网址找到世界各地的客户支持联系电话号码:

    http://support.mercury.com/cgi-bin/portal/CSO/contacts.jsp

    系统要求

    要成功安装并运行 QuickTest Professional,您需要满足以下最低系统要求:
    jszB%kq3W5L156874
    .H8Bhvz$C156874

    计算机/处理器:
    IBM-PC 或与 Pentium III 微处理器兼容的计算机。
    Windows 2000 Service Pack 3 或 Service Pack 4、Windows XP Service Pack 1 或 Service Pack 2 或者 Windows 2003 Server。
    注意:仅当未激活执行保护机制(也称为 DEP - 数据执行保护和 NX - 不执行)时,才能在 Windows XP Service Pack 2 上支持 QuickTest Professional。
    内存:
    256 MB RAM。
    可用硬盘空间:
    250 MB 可用磁盘空间用于应用程序文件和文件夹,另外在系统盘(安装操作系统的磁盘)上需要 120 MB 可用磁盘空间。安装 QuickTest Professional 后,建议系统盘中至少留有 150 MB 可用磁盘空间,以便操作系统和 QuickTest Professional 可以正确运行。
    浏览器:
    Microsoft Internet Explorer 5.5 Service Pack 2 - 6.0。软件测试专业网站:51Testing软件测试网&f h)p \5~Z)s
    有关其他支持的浏览器的信息,请参阅支持的环境和程序

    注意: 尚未为“最低”系统配置优化性能。要获得最佳性能,您的系统应该至少按“建议”级别进行配置。

    支持的加载项

    除了所有 8.2 版加载项,您还可以将下列特定的加载项版本用于 QuickTest Professional 8.2:

    • QuickTest Professional Java 6.5 加载项
    • QuickTest Professional Oracle 6.5 加载项
    • QuickTest Professional Siebel 8.0 加载项
    • QuickTest Professional Terminal Emulator 8.0 加载项
    • 注意: 除以上专门列出的加载项外,您不能将任何低于 8.2 版的加载项用于 QuickTest Professional 8.2。

    有关详细信息和说明,请参阅《Mercury QuickTest Professional 安装指南》。

    支持的环境和程序

    QuickTest Professional 支持使用下面描述的环境和程序来创建、录制和运行测试或组件。

    标准 Windows 应用程序

    QuickTest Professional 支持在基于 Windows API 和 MFC 的应用程序上进行测试。

    Visual Basic 应用程序

    QuickTest Professional 支持在 Visual Basic 6.0 应用程序上进行测试。

    注意: QuickTest Professional .NET 加载项支持 Visual Basic .NET 应用程序。

    浏览器

    • Microsoft Internet Explorer 5.5 Service Pack 2 - 6.0(必需)
    • Netscape 6.1、Netscape 6.22、Netscape 6.23、Netscape 7.02 和 Netscape 7.1(可选)
    • AOL 8.0 和 9.0(可选)

    ActiveX 网格控件

    除了对 ActiveX 属性和方法的基本支持外,QuickTest Professional 还支持在下列 ActiveX 网格控件上进行上下文相关录制和验证:
    Y^.j{_} v'VP%aP156874
    "WvKYK^ i@W156874

    名称
    ProgId
    FarPoint Spreadsheet 2.5
    FPSpread.Spread.1
    FarPoint Spreadsheet 3.0
    FPSpread.Spread.2
    FarPoint Spreadsheet 3.5
    FPSpread.Spread.3
    FarPoint Spreadsheet 6.0
    FPSpread.Spread.4
    FarPoint Spreadsheet 3.0 (OLEDB)
    FPSpreadADO.fpSpread.2
    FarPoint Spreadsheet 3.5 (OLEDB)
    FPSpreadADO.fpSpread.3
    FarPoint Spreadsheet 6 (OLEDB)
    FPSpreadADO.fpSpread.4
    Microsoft Grid 1.0
    MSGrid.Grid
    Microsoft DataBound Grid 5.0
    MSDBGrid.DBGrid
    Microsoft Flex Grid 6.0
    MSFlexGridLib.MSFlexGrid.1
    Sheridan Data Grid 2.0
    SSDataWidgets.SSDBGridCtrlApt.1
    Sheridan Data Grid 3.1
    SSDataWidgets.SSDBGridCtrlApt.3
    Apex True DataBound Grid 5.0
    TrueDBGrid50.TDBGrid
    Apex True DataBound Grid 6.0
    TrueDBGrid60.TDBGrid
    Apex True OLE DB Grid 6.0
    TrueOleDBGrid60.TDBGrid

    ActiveX 日历控件

    除了对 ActiveX 属性和方法的固有支持外,QuickTest Professional 还支持在下列 ActiveX 日历控件上进行上下文相关录制和验证:软件测试专业网站:51Testing软件测试网d \@@f Z-Q u"W7PA#O
    软件测试专业网站:51Testing软件测试网 z;n!@~e

    名称
    ProgId
    Microsoft Date and Time Picker Control 6.0 (SP4)
    MSComCtl2.DTPicker.2
    Microsoft MonthView Control 6.0 (SP4)
    MSComCtl2.MonthView.2

    Microsoft Excel

    在 QuickTest Professional 中使用 Microsoft Excel 文件(例如,向数据表导入数据或从数据表导出数据)时,可以使用 Microsoft Excel 2000、2002、2003 和 XP。

    Microsoft Query

    在 QuickTest Professional 中使用 Microsoft Query(例如,用于数据库检查点)时,可以使用 Microsoft Query 2000、2002、2003 和 XP。

    其他环境

    QuickTest Professional 加载项支持其他环境,例如 Java、.NET Windows 以及 Web Forms、SAP 解决方案、Oracle、Siebel、PeopleSoft、Web 服务和终端仿真器应用程序。有关 QuickTest Professional 加载项的详细信息,请与您的销售代表或 Mercury Interactive 客户支持联系。

    有用的信息

    • 要安装 QuickTest Professional,您必须使用管理员权限登录。
    • 要使用 QuickTest Professional 的调试功能,您必须安装 Microsoft 脚本调试程序。脚本调试程序可以在安装 QuickTest Professional 的过程中安装,也可以以后从 Microsoft 的 Windows 脚本技术站点下载:http://msdn.microsoft.com/library/default.asp?url=/downloads/list/webdev.asp。还可以使用“添加/删除程序”窗口中的“添加/删除 Windows 组件”选项进行安装。
    • QuickTest Professional 8.2 中不支持多媒体加载项。
    • 如果您的网站或应用程序中的某些对象属性值是为指定类型的所有对象动态生成的,则可以创建一个属性模式配置文件,用于指示 QuickTest Professional 自动将该对象属性录制为正则表达式。有关如何使用属性模式功能的详细说明,请参阅 <QuickTest Professional 安装目录>\help 文件夹中的 PropPattern.htm
    • 使用 QuickTest Professional 时,有几种方法可以改进性能并减少磁盘使用空间。有关详细信息,请参阅《Mercury QuickTest Professional 用户指南》。
    • 有关 QuickTest Professional 的详细信息:
      • 有关重要的安装信息和逐步安装说明,请参阅《Mercury QuickTest Professional 安装指南》。您的 CD-ROM 的根文件夹中提供有 PDF 格式的《Mercury QuickTest Professional 安装指南》。安装 QuickTest 后,您还可以在 <QuickTest Professional\help> 文件夹中找到该指南。
      • 如果是第一次使用 QuickTest Professional,请使用“QuickTest Professional 教程”(“帮助”>“QuickTest Professional 教程”),了解如何使用最常用的功能。
      • 有关该版本 QuickTest Professional 中的新增功能和支持的环境的信息,请参阅“QuickTest 新增功能”文档(“帮助”>“QuickTest 新增功能”)。
      • 有关 QuickTest Professional 的详细信息,请参阅《Mercury QuickTest Professional 用户指南》和《Mercury QuickTest Professional 对象模型参考》。从“帮助”菜单(“帮助”>“QuickTest Professional 帮助”)中使用索引和文本组合搜索可以找到上述帮助资源,以及“Microsoft VBscrīpt 参考”。<QuickTest Professional 安装目录>\help 文件夹中也提供有 PDF 格式的《Mercury QuickTest Professional 用户指南》。
      • 《Mercury QuickTest Professional 自动化对象模型参考》(可以从 QuickTest Professional“开始”菜单的程序文件夹以及 QuickTest Professional“帮助”菜单中获得)提供了有关自动化对象、方法和属性的语法、描述性信息及示例。其中还包括帮助用户可对编写 QuickTest 自动化脚本入门的详细描述。
      • 注意: 要打开适用于打印机(PDF 格式)的版本的 QuickTest Professional 文档,必须在您的计算机上安装 Adobe® Reader®。您可以从以下网址下载 Adobe Reader:www.adobe.com

    已知问题和局限性

    安装

    • QuickTest Professional 和/或外部加载项的安装文件所在的路径,以及 QuickTest Professional 和/或外部加载项的安装路径,只能包含英文字符。
    • 安装 QuickTest Professional 6.0 或更高版本时,您可以继续使用当前的单机许可证或并发许可证。但是,如果要使用可用于 Mercury Functional Testing 并发许可证服务器 7.6 版或更高版本的新的通勤者许可证功能,则必须在并发许可证服务器上安装新的许可证。要获得新的许可证,请与 Mercury Interactive 客户支持联系。
    • Mercury Functional Testing 并发许可证服务器不支持使用网络地址转换 (NAT)。
    • 如果某个以前版本的 QuickTest Professional 使用的是演示许可证,并且该许可证已经过期,同时又没有为它安装常规许可证,则您无法使用其演示许可证安装 QuickTest Professional 8.2。
    • 安装 QuickTest Professional 之前,必须安装 Microsoft Internet Explorer 5.5 Service Pack 2 或更高版本。
    • 使用永久许可证安装了 QuickTest Professional 后,您不能使用演示许可证来安装 QuickTest Professional 加载项。
    • 解决方法: 安装用于该加载项的永久许可证。

    • 如果 LSHOST 变量已设置为另一个域中的服务器,则服务器实用程序 lsmon.exe 可能工作不正常。
    • 并发许可证不包括演示许可证,如果未安装 Mercury Functional Testing 并发许可证服务器和许可证代码,则不能使用。
    • 以标准用户身份登录计算机时,您不能将许可证类型从单机更改为并发,也不能从并发更改为单机。
    • 解决方法: 要更改许可证类型,请以具有管理员权限的用户身份登录计算机。

    • 使用活动的演示许可证从 QuickTest Professional 6.5 升级可能会导致在 QuickTest 启动时打开许可证警告。
    • 解决方法:在安装 QuickTest Professional 8.2 之前删除 lservrc 文件。

    • 卸载 QuickTest Professional Floating License Server 版本 6.0 可能会导致 QuickTest 在启动时无法检索许可证。
    • 解决方法:在卸载 QuickTest Professional Floating License Server 版本 6.0 之前备份 lservrc 文件,然后将该文件复制到新的安装路径,或者在安装许可证服务器后重新安装许可证字符串。

    • 如果您的计算机中有版本 6.0.0.8169 的 Pdm.dll,则建议您从以下网址安装更新的版本:http://support.microsoft.com/support/kb/articles/Q293/6/23.ASP。安装过程中将识别该版本,并且 QuickTest Professional 将指示您从 Microsoft 站点下载已更正的 DLL。
    • 如果在还装有 Microsoft HTML Help Workshop 的计算机上安装 QuickTest Professional,则试图在 Microsoft HTML Help Workshop 中编译帮助项目时,您将收到以下错误消息:文件 itircl.dll 尚未正确注册。
    • 解决方法:在您的系统中(\windows\system \winnt\system32 目录下)查找 itcc.dll。如果找到它,请使用 regsvr32.exe 对其进行注册。如果 itcc.dll 根本不在您的系统中,则可以从以下网址下载一个副本:http://www.mvps.org/htmlhelpcenter/htmlhelp/hhtips.html#hhc6003。再次使用 HTML Help Workshop 之前,可能需要重新启动计算机。

    • 在 Windows 2003 中卸载 QuickTest Professional 时,卸载程序可能会在“正在删除备份文件”阶段停止响应。
    • 解决方法:从 Windows 任务管理器终止 msiexec.exeIkernel.exe 进程,并重新启动您的计算机。如果是在安装过程中发生该问题,请从 Windows 任务管理器终止 msiexec.exeIkernel.exe 进程,然后重新运行安装程序。

    • 在 Windows 2003 中卸载 QuickTest Professional 时,卸载程序不会成功完成,同时指示卸载进程无法完成,应手动卸载 QuickTest Professional。此种情况的发生是由于 InstallShield Developer 8.02 中引入的错误导致的。有关详细信息,请参阅 http://support.installshield.com/kb/view.asp?articleid=Q111000
    • 解决方法:执行卸载后,手动删除 QuickTest Professional 安装文件夹中剩余的任何文件。

    • 如果您有外部 6.5.x 加载项,而该加载项是直接在 QuickTest Professional 8.0.x 或更高版本上安装的(以前未在 QuickTest Professional 6.5.x 上安装过),则卸载程序无法卸载这些加载项。
    • 解决方法:执行卸载后,手动删除 QuickTest Professional 安装文件夹中剩余的任何文件。

    • 在 Windows 2000 中安装 QuickTest Professional 时,如果 C: 驱动器具有超过 16 GB 的可用磁盘空间,则会显示以下警告:
    • Microsoft Data Access Components 2.5
      l_+C+EiY.e*K9E7e)H:M156874要安装该程序,需要在驱动器 C: 上具有 20000 KB 磁盘空间。建议您释放所需的磁盘空间,然后继续。 软件测试专业网站:51Testing软件测试网B4^,MN*w7X6\^6R
      是否仍要继续?

      解决方法:单击“是”并继续安装过程。

    向前兼容性

    • 如果您在 QuickTest Professional 6.5 或更低版本中创建了一个测试,然后在 QuickTest Professional 8.2 中将其打开并保存,则不能重新在 QuickTest Professional 6.5 或更低版本中打开它。

    录制和运行测试或组件

    • 在“录制和运行设置”对话框的“Web”选项卡中选择了“在任何打开的 Web 浏览器上录制和运行测试”时,必须在打开 QuickTest Professional 之后打开浏览器。否则,QuickTest 将无法正确地录制和运行测试。
    • QuickTest Professional 不支持录制 Web (HTML) 对象上的拖放操作。
    • QuickTest Professional 使用 Microsoft 正则表达式,在 Microsoft 正则表达式中,字符 . 代表除 \n 以外的任何字符。在较旧版本的 QuickTest Professional 中,该字符代表任意字符。
    • 解决方法:. 字符更改为 [.\n]

    • 在步骤生成器中,如果将焦点放在一个或多个可选方法参数的单元格上(单击该单元格)但不输入值,步骤生成器会将该单元格的内容视为包含空字符串(非空),因而将它们视为强制值。如果发生此情况,将显示一个消息,提示您使用自动完成选项输入默认值或手动输入有效值。无法单击该消息中的“是”选择自动完成选项。
    • 解决方法:单击该消息中的“否”手动输入可选参数的值,或单击“取消”关闭步骤生成器,然后重新打开步骤生成器,输入不带可选参数的语句。

    • 在步骤生成器中,如果您添加了在测试中返回对象和分配的方法,或者组件缺少 Set 语句,则运行会话将失败。
    • 在数据表中选择一个单元格或一行,然后按键盘上的 Ctrl+X 或 Delete 键,将删除选定单元格或行中的数据,但不会删除实际的单元格或行。这样,如果您使用这些快捷键之一删除数据表中的数据时,QuickTest 将仍对该行运行一次循环。
    • 解决方法:要从数据表中删除整个单元格或行,请选中它并从上下文菜单中选择“删除”,或者按键盘上的 Ctrl+K。

    • 如果您导入包含组合框、列表单元格、条件格式或其他特殊单元格格式的 Microsoft Excel 表,将不会导入格式,并且单元格在数据表中显示时带有固定值。
    • 处理数据表时,可以启动 Formula One Designer。该实用程序是外部第三方实用程序,QuickTest 不支持。
    • 如果 Active Screen 在网页中显示 Java applet 或 ActiveX 控件,则该 applet 或控件仅用于进行查看,您无法对对象执行操作(例如,创建检查点、添加方法等等)。
    • 解决方法:录制 Java applet/ActiveX 控件中的操作,使用加载的 ActiveX 加载项和/或 Java 加载项(可以单独使用)在对象上创建一个步骤。然后可以从 Active Screen 中单独的 Java applet/ActiveX 控件创建检查点、参数化步骤或添加方法。

    • 相对屏幕进行模拟录制时,相应的 Active Screen 不会显示以前执行过的模拟步骤的结果。
    • 您只能为 QuickTest Professional 在其上录制 ClickDoubleClick 方法的对象创建虚拟对象。
    • 如果在只是部分可见的对象(即,对象的一部分显示在屏幕以外)上插入位图检查点,QuickTest Professional 将仅捕获该对象的可见部分。
    • 从数据表返回的值始终转换为字符串。
    • 解决方法:使用 VBscrīpt 转换函数,例如 CIntCLngCDbl 等等。例如,Window("Flight Reservation").WinComboBox("Fly From:").Select CInt(DataTable("ItemNumber", dtGlobalSheet))

    • Exist 方法的 Timeout 参数的行为,在 QuickTest 6.5 版和 8.x 版之间有所改动。在 8.x 版中,其行为如下:
      • 如果指定了超时值,则 QuickTest 将等待,直至找到对象或到达超时设置。
      • 如果指定了值 0,则该方法将立即返回 True 或 False 值。
      • 对于测试,如果未指定值,则将使用在“测试设置”对话框中为“对象同步超时”指定的值。对于组件,将使用默认设置 20 秒。
      • 要恢复为 6.5 版的默认行为(默认超时为 0),请执行下列操作:

      • 为所有 Exist 语句的超时参数添加 0 值。
      • 使用库文件中的 RegisterUserFunc 语句,将 Exist 的行为修改为等于 Exist(0),然后将该库文件与所有相关测试相关联。
      • 注意: 建议您不要将“对象同步超时”设置为 0,因为这会使 QuickTest 无法识别那些需花费时间进行加载的对象。此外,还有将“对象同步超时”用作默认值的其他方法,如 WaitPropertySync

    • 测试、组件和操作参数的名称都区分大小写。
    • 如果创建包含虚拟对象的测试或组件,并且使用不同的屏幕分辨率设置运行它,则虚拟对象上的操作可能无法正确执行。
    • 如果在“选项”对话框的“运行”选项卡中为“将步骤屏幕捕获内容保存到结果中”选项选择“出错时”,则对于不是基于 Web 的应用程序,不会将屏幕捕获内容(包括错误)保存到结果。
    • 解决方法:测试标准 Windows 应用程序时,为“将步骤屏幕捕获内容保存到结果中”选项选择“出错和警告时”。

    • 从 Quality Center 测试集运行 QuickTest 测试时,或使用 QuickTest 自动操作时,将忽略“运行会话期间发生错误时”设置(“测试”>“设置”>“运行”选项卡)。而是,在发生错误时,QuickTest 将自动继续下一步骤。如果要更改此设置,请与 Mercury 客户支持联系,以便获得更多信息。
    • QuickTest 不会录制从“开始”菜单启动 Windows 帮助的过程。
    • 如果在录制过程中窗口标题发生了变化,则运行测试或组件时,QuickTest 可能会无法识别该窗口中的对象。
    • 解决方法:从“对象库”对话框的该窗口中的测试对象描述中删除文本属性。

    • 在录制时插入的检查点中的 Focused 属性的值将始终为 False。
    • 解决方法:手动更改该属性的值或者对测试或组件执行更新运行操作。

    • 运行会话中的错误将导致结果中产生多个错误节点。
    • 测试或组件中不能使用在库文件中定义的 VBscrīpt 类。
    • 对于 WinComboBox、WinList、WinListView、VbComboBox、VbList 和 VbListView 测试对象,GetItemProperty 方法可能无法正确地返回文本属性值。
    • 解决方法:使用 GetItem 方法为这些测试对象检索文本属性值。

    • 如果某个测试或组件包含一个 For Each 语句,该语句对 ParameterDefinitions 集合运行循环,则如果该集合是在使用 For Each 语句之前直接检索的,运行该测试或组件可能会失败。
    • 解决方法:使用其他 VBscrīpt 循环语句,例如 ForWhile

    • 在 QuickTest 6.0 和更低版本中,分配给测试对象的名称(以前称为逻辑名称)是区分大小写的。如果在 QuickTest 8.2 中打开测试或组件,而该测试或组件的对象库是在这些版本之一中创建的,并且包含两个相同(大小写除外)的名称,则 QuickTest 会自动使用在测试、操作或组件中的对象库中都是唯一的名称来替换它们。
    • 关键字视图经过像素化处理,难以读取颜色设置小于 256 色的内容。
    • 解决方法:将颜色设置至少增大为 256 色。

    • 如果将焦点更改到关键字视图的“操作”列中的单元格,则不显示工具提示。
    • 如果使用指向手机制,QuickTest 不会在以下场景中自动最小化:使用的是 Windows XP Service Pack 2,且在 Windows XP“显示属性”对话框的“外观”选项卡中选择了“Windows XP 样式”,同时 QuickTest 处于最大化状态。
    • 解决方法:将 Windows XP 显示样式更改为“Windows 经典”,或者在使用指向手机制之前不最大化 QuickTest。如果已在上述场景中选择了指向手,则可以使用 Alt+Tab 显示所需应用程序,或使用 Ctrl 键在更改窗口焦点时暂时禁用指向手机制。

    • 如果运行具有大量循环和业务组件的业务流程测试,则可能会在若干时间后遇到内存可用性问题。
    • 解决方法:使用“远程代理设置”对话框(“开始”>“程序”>“QuickTest Professional”>“工具”>“远程代理”)中的“__ 次运行后重新启动测试工具”选项计算正在运行的业务组件数,并在通过定义的阈值后于第一个业务流程测试循环的结尾自动重新启动 QuickTest。

    • Quality Center 中组件的完整路径(例如,Components/CompFolder1/MyComponent)不能超过 225 个字符。
    • 使用 Business Process Testing 时,不应在同一台计算机上同时在 Quality Center 和 QuickTest Professional 中使用同一个业务组件。这样做可能会损坏该业务组件。

    在 Web 对象上录制和运行测试及组件

    • 如果录制在图像映射(未映射到 Internet Explorer 中的 URL)区域中的单击,则 QuickTest Professional 将在运行会话过程中在该映射的第一个映射区域中执行单击。
    • QuickTest Professional 仅录制 <input type="file"> 标记上的编辑字段中的更改。不会录制浏览操作。
    • 页面的源/HTML 标记上的检查点不能从 Active Screen 插入,而是必须在录制过程中插入。第一次运行会话时,这些检查点可能会失败。
    • 解决方法:在运行包含页的源/HTML 标记检查点的测试或组件之前,对该测试或组件执行更新运行(“测试”>“更新运行”或“组件”>“更新运行”)。

    • 单击类型为 POST 的表单标记可能运行不正确。
    • 解决方法:如果发生此问题,请在单击“根据鼠标操作运行”之前使用以下语句更改 ReplayType:Setting.WebPackage("ReplayType") = 2。建议在单击步骤之后将回放类型恢复为默认(“根据事件运行”)设置:Setting.WebPackage("ReplayType") = 1

    • QuickTest Professional 不会在 Internet Explorer 浏览器的搜索帧上录制。
    • QuickTest Professional 不会在 Internet Explorer 浏览器的查找窗口中录制。
    • 如果在根据 MouseOver 事件进行更改的图像上执行检查点,验证可能会失败。
    • 解决方法:在“Web 事件录制配置”对话框中启用在 MouseOver 事件上录制,或者将函数插入脚本中。有关 Web 事件录制配置的详细信息,请参阅《Mercury QuickTest Professional 用户指南》。

    • 如果使用 Tab 键在密码字段的“自动完成”对话框中录制,QuickTest Professional 可能无法正确录制。
    • 解决方法:在输入用户名后按 Enter 键或单击用于登录的按钮。

    • 如果在使用包含浏览器控件的应用程序(而不是使用 Web 浏览器)时从 Active Screen 插入检查点,则您的检查点可能会失败。
    • 解决方法:在录制过程中插入检查点。

    在 Netscape 中录制和运行测试或组件
    • QuickTest Professional 不支持 Netscape 6.x 和 7.x 菜单。
    • 在该版本的 QuickTest 中,Netscape 浏览器不支持 Web 对象的 .Object 属性。
    • Netscape 处于最小化模式时,QuickTest Professional 无法在 Netscape 中运行测试或组件。
    • 使用 Netscape 录制测试或组件时,Active Screen 将页面图像显示为页面在加载时被捕获的图像。不会显示对页面所做的更改,例如在编辑框中输入数据。
    • 在录制会话过程中使用 Netscape 浏览器创建表检查点所得到的结果,与在从 Active Screen(作用类似于 Internet Explorer 浏览器)中进行录制后创建表检查点所得到的结果可能不同。
    • 解决方法:如果计划使用 Netscape 运行测试或组件,则在录制的同时在 Netscape 浏览器中创建检查点。如果计划使用 Internet Explorer 运行测试或组件,则在录制的同时在 Internet Explorer 浏览器中创建检查点,或者在录制后使用 Active Screen 创建检查点。

    • QuickTest 可能无法在“激活”窗口(该窗口有时候会在 Netscape 6.x 和 7.x 启动时打开)中录制。
    • 解决方法:在 QuickTest 中启动 Netscape 之前完成激活。

    • 并不会始终为 Netscape 6.x 和 7.x 录制 MouseOver 事件。
    • Netscape 6.x 和 7.x 对话框不显示在 Active Screen 中。
    • QuickTest 仅录制 Netscape 6.x 和 7.x 对话框中的按钮、复选框和编辑框。
    • 解决方法:您可以使用“自定义 Web 事件录制配置”对话框来启用在其他对象上的录制。

    • “对象侦查”和“检查点属性”对话框不会检索 Netscape 6.x 和 7.x 对话框中的编辑框的当前值。
    • 在 Netscape 中以低级录制模式录制的测试或组件不会在 Internet Explorer 浏览器中运行。虽然在两种浏览器中以低级模式录制的测试或组件看起来相似,但对象描述不同,这就限制了测试或组件在作为录制地点的相同浏览器中运行。
    • 以低级模式在 Netscape 6.x 和 7.x 中包含 applet 的页面上录制时,QuickTest 在运行会话过程中可能无法识别该 applet。
    • 解决方法:在运行组件或测试以及测试的每次循环之前,必须关闭 Netscape 浏览器。

    在 AOL 中录制和运行测试或组件
    • 在 AOL 浏览器中录制时,请选择“录制和运行设置”对话框的“Web”选项卡中的“在任何打开的 Web 浏览器上录制和运行测试”选项来录制和运行您的测试。(您无法从 QuickTest Professional 中调用 AOL 浏览器。)
    • 在数据表中输入非常大的数字可能会导致意外行为。

    在标准 Windows 对象上录制和运行测试及组件

    • 在 WinMenu 对象上录制时,不会捕获 Active Screen。
    • 您不能在 WinMenu 对象上插入检查点。
    • 解决方法:使用 GetItemProperty 方法来检索并验证菜单项。

    • 检查点不支持样式为简单组合框的组合框对象。
    • 使用 Windows 徽标快捷键进行录制时,录制可能不精确。
    • 解决方法:录制时使用“开始”菜单而不要使用 Windows 徽标键。

    • 更改 WinCalendar 的样式(例如,从单选更改为多选)将导致运行会话失败。
    • 使用“对象侦查”中的指向手机制指向 MFC 静态文本或选项卡控件时,QuickTest 可能无法返回正确的对象。
    • 解决方法:通过指向对象的父窗口并选择“选定对象及其所有后代”,将该对象添加到对象库中。将对象添加到对象库以后,便可以使用 GetROProperty 方法来检索其运行时属性。例如:软件测试专业网站:51Testing软件测试网P\\pr6x
      width = Dialog("Login").Static("Agent Name:").GetROProperty("width")
      zA+S*Dw;] Q zV156874MsgBox width

    在 Visual Basic 应用程序中录制和运行测试及组件

    • 使用 Visual Basic 加载项时,建议选择“在以下应用程序(会话开始时打开的)上录制并运行”选项,然后在“录制和运行设置”对话框的“Windows 应用程序”选项卡中指定应用程序的名称。
    • 如果选择“在任何打开的基于 Windows 的应用程序上录制并运行测试”选项,则应该在第一次开始录制之后打开 Visual Basic 应用程序。

    • 从 Active Screen 在 VbComboBox 对象上插入检查 sellengthseltext 属性的检查点时,捕获的值可能不正确。
    • 解决方法:手动更新值。

    • 不支持样式为简单组合框的组合框对象。
    • VBLabel 对象不支持文本/文本区检查点和输出值。

    在 ActiveX 控件上录制和运行测试及组件

    • 不支持 Netscape 浏览器中的 ActiveX 对象。
    • 如果 QuickTest Professional 不能识别网页中的 ActiveX 控件,请降低您的 Internet Explorer 浏览器中的安全级别。
    • 如果某个 ActiveX 控件的内部属性具有与由 QuickTest Professional 创建的 ActiveX 属性相同的名称,则检索和验证此类属性会发生问题。
    • 解决方法:您可以使用 Object 属性来访问 ActiveX 控件的内部属性。

    • 从 Active Screen 在 ActiveX 表上插入检查点时,浏览器(或应用程序)必须打开至同一页面(或屏幕)。否则,ActiveX 表中的某些数据将丢失。
    • 解决方法:在录制过程中创建 ActiveX 表检查点。

    • 对 Apex、DataBound 和 Sheridan 网格的行和列位置执行的方法返回可见位置的值,而不是返回表中的绝对位置的值。
    • 解决方法:在录制过程中使用滚动条来显示需要的单元格。

    • QuickTest 可能无法正确捕获无窗口的 ActiveX 控件的某些内部属性,例如 x、y、高和宽。
    • 在 ActiveX 控件上录制时,在移动鼠标之前先等待录制步骤显示。移动鼠标太快可能会导致该步骤的 Active Screen 损坏。
    • 在无窗口的 ActiveX 控件上录制可能导致将某些其他步骤添加到您的测试或组件中(例如,AcxRadioButton 对象上除 Set 方法外,还添加一个 Click 方法)。这些额外步骤不会导致运行会话失败。
    • 不支持无窗口的 ActiveX 控件上的 DragDrop 操作。
    • Microsoft 数据绑定网格控件不支持 AcxTable.RowCount 方法。
    • 表检查点仅捕获数据绑定网格中可见的行。
    • QuickTest 可能无法识别由编程描述标识的无窗口 ActiveX 控件。
    • 解决方法:Windowless=True 添加到编程描述中。

      示例:

      set myButton = Descrīption.Create

      myButton("progid").Value = "Forms.CommandButton.1"

      myButton("Windowless").Value = True

      Dialog("ActiveX Collection Client").AcxButton(myButton).Click

    • 不支持类型为 VT_DISPATCH 的 ActiveX 属性的检查点和输出值。
    • 不支持只写模式的 ActiveX 属性的检查点和输出值。

    文本识别

    • 在运行会话中,QuickTest 文本识别机制可能以不同的方式起作用,具体取决于您使用的操作系统版本、已经安装的 service pack、其他安装的工具包、应用程序中使用的 API 等等。
    • 为避免运行会话失败,强烈建议尽量使用以下方法之一来检查或检索文本:

      • 对于文本检查点 - 创建标准检查点或输出值,并从对话框中选择文本(或等效值)属性,而不是在基于 Windows 的应用程序(标准 Windows、Visual Basic、ActiveX、.NET Windows Forms)和终端仿真器(非 HLLAPI)环境中创建文本(或文本区)检查点或输出值。
      • 对于 GetVisibleText 和 GetTextLocation - 使用 GetROProperty 方法或 Object 属性从应用程序的对象中检索文本(或等效值)属性值,而不是使用 GetVisibleTextGetTextLocation 方法来检索。
      • 有关创建文本检查点和使用 GetROProperty 方法或 Object 属性的详细信息,请参阅《Mercury QuickTest Professional 用户指南》。您也可以在 Mercury 客户支持网站 (http://support.mercury.com) 的联机知识库中找到详细信息。

        如果需要使用 GetVisibleText 和/或 GetTextLocation 方法从对象和/或窗口中检索文本,并且检索功能的效果不能始终如您所愿,则向 Mercury 客户支持网站 (http://support.mercury.com) 提供以下信息:

      • 尝试使用 GetROProperty 方法和/或 Object 属性的结果。
      • 用于将文本写入特定对象或窗口的方法、API 或函数。
      • 用于读取特定对象或窗口中的文本的方法、API 或函数。
      • 您试图从其中检索文本的窗口和/或对象的屏幕捕获。
      • 窗口和/或对象的属性。
      • 实际的应用程序或应用程序示例(如果可能)。
    • 不支持从 Active Screen 添加基于 Windows 的应用程序(标准 Windows、Visual Basic、ActiveX、.NET Windows Forms)的文本检查点和输出值。
    • 仅当您有“创建全局对象”用户权限时,针对 Citrix(终端服务)环境的文本识别才可用。有关详细信息,请参阅 Microsoft 支持网站:http://support.microsoft.com/default.aspx?scid=kb;en-us;821546#5

    对象库

    • 如果要引用网络中的共享对象库文件,则必须映射驱动器并在所引用的路径中使用映射的驱动器。
    • 如果您修改对象库中测试对象的名称,而测试或组件脚本包含一个语法错误,则新名称不会在测试或组件脚本中正确更新。
    • 解决方法:解决语法错误,然后再修改测试对象名称。

    • 如果在 QuickTest 8.0 版及更高版本上安装的是版本 6.5.x 的加载项,则“对象库”对话框中的“突出显示”选项不可用。

    恢复场景管理器

    • 恢复场景管理器用于替代 QuickTest 6.0 及更低版本中的异常编辑器的功能。
    • 异常编辑器中包括的默认 Web 异常在恢复场景管理器中作为默认的恢复场景提供。包含这些默认恢复场景的场景文件位于:<QuickTest 安装路径>\recovery

      这些默认恢复场景自动与在 QuickTest 6.0 及更低版本中创建的测试相关联。此外,会自动启用对应于每次测试中处于活动状态的 Web 异常的恢复场景。

    检查点和输出值

    • 包含超过 64K 数据的检查点可能会运行缓慢。
    XML 检查点
    • 在包含 > 作为值的 XML 文件上执行 XML 检查点时,可能会收到错误消息。
    • 在无法加载或格式不正确的文件上插入 XML 文件检查点时,可能会收到错误消息。
    • 您不能从 Active Screen 插入 XML 检查点。
    • 为较大的 XML 文档创建和运行 XML 检查点可能需要几分钟的时间。
    • QuickTest 6.5 版及更高版本将 XML 检查点信息以新格式保存。如果在 QuickTest 8.2 中使用的是 QuickTest 6.0 测试,则必须执行更新运行,或手动打开每个“XML 检查点属性”对话框并单击“确定”按钮。这会将 XML 检查点信息转换为新格式,并大大改进性能。
    数据库检查点
    • 捕获的值的格式取决于特定的系统设置。例如,日期和时间值可能设置为不同的格式。
    • 解决方法:如果运行测试或组件的系统与用于录制测试或组件的系统不同,请确认两个系统使用相同的格式设置。

    • 如果在一台计算机中创建了数据库检查点,并试图在另一台计算机中运行该检查点,则应该确保两台计算机中安装了相同的 ODBC 驱动程序。
    输出值
    • 如果使用的是 QuickTest Professional 6.0 测试,请注意,QuickTest Professional 8.2 将 XML 输出值信息以新格式保存。执行一次更新运行,或手动打开每个“XML 输出值属性”对话框并单击“确定”按钮。这会将 XML 输出值信息转换为新格式,并大大改进性能。

    文档

    • 对于 QuickTest Professional 8.2,新增功能和增强功能在《Mercury QuickTest Professional 8.2 新功能指南》中进行了描述。所有现有的功能在《Mercury QuickTest Professional 用户指南》8.0.1 版中进行了描述。这两本指南应相互配合使用。
    • 不再提供 PDF 格式的《Mercury QuickTest Professional 对象模型参考》。但是,如果您是在以前版本的基础上安装 QuickTest Professional,则您的 <QuickTest Professional 安装目录>\help 文件夹中可能会留有以前版本的 PDF 格式的《Mercury QuickTest Professional 对象模型参考》。
    • “VBscrīpt 参考”>“VBscrīpt”、“VBscrīpt 参考”>“脚本运行时”和“VBscrīpt 参考”>“Windows 脚本主机”部分下的所有帮助主题都来自 Microsoft。这些帮助文件不是由 Mercury 准备的,Mercury 对其内容概不负责。这些帮助文件直接来自于 Microsoft scrīpt56.chm 帮助文件,该文件可以从 http://msdn.microsoft.com/library/default.asp?url=/downloads/list/webdev.asp 下载。
    • “VBscrīpt 参考”标题下的信息可能包含错误、问题或其他局限性。Mercury 对于“VBscrīpt 参考”标题下的信息的准确性、适合性、可靠性、当前性、完整性、适应性或适用性不作任何承诺。Mercury 对由于使用“VBscrīpt 参考”标题下的帮助文件中的信息而产生的任何损坏(包括时间的损失)概不负责。

    • 如果您计划在 QuickTest Professional 6.0 上安装 QuickTest Professional 8.2,则应该在卸载 QuickTest Professional 6.0 之后,安装 QuickTest Professional 8.2 之前从您的 <QuickTest Professional 安装目录>\help 文件夹中手动删除 Java.chm 文件。否则,QuickTest Professional 帮助的“对象模型参考”部分中将包含一个已过时的 Java 部分。

    Quality Center 集成

    • 使用早于 8.2 版的 Quality Center 服务器时,必须安装 Quality Center 连通性加载项(可从您的 Quality Center 服务器中获得)。
    • 对于测试管理,QuickTest Professional 可以与 Mercury 集中质量解决方案 Quality Center(原为 TestDirector)集成,适用于 TestDirector 7.6 Service Pack 4、TestDirector 8.0 Service Pack 2 和 Quality Center 8.2 版。

    对于 Business Process Testing,QuickTest Professional 可以与 Quality Center 8.2 版(带有支持 Business Process Testing 的许可证)集成。

    • 要从 Quality Center 执行操作(例如运行 QuickTest 测试),您必须具有对 Quality Center 缓存文件夹(位于 Quality Center 客户端中)的写权限。
    • Quality Center 不兼容 Unicode。因此:
      • 处理存储在 Quality Center 中的测试或组件时,不应使用 Unicode 值(例如测试或组件的名称,应用程序区域的名称,测试、操作或组件参数的默认值,方法参数值,等等)。
      • 从 Quality Center 发送到 QuickTest 的数据(例如测试、操作或组件参数的值)不兼容 Unicode。
      • 在 Quality Center 结果网格中,包含 Unicode 字符的 QuickTest 结果可能显示为已损坏。但是,您可以在 QuickTest 测试结果窗口中打开和查看包含 Unicode 字符的结果。
      • Quality Center 测试计划模块中显示的“专家视图”窗格不支持 Unicode 字符。
      • 有关 QuickTest Professional Unicode 问题的其他信息,请参阅下面的多种语言支持

    • 在 Quality Center 中重命名 QuickTest 测试或组件会导致该测试或组件运行不正常。
    • 解决方法:要重命名测试或组件,请在 QuickTest 中打开它,然后使用“另存为”选项对其进行重命名。如果已经在 Quality Center 重命名了测试或组件,则再次使用重

  • 所谓MindMap

    2008-03-06 21:47:12

    原文出处:http://risker.org/tech/FreeMind/

    1. 所谓MindMap

    1.1 MindMap是什么

    MindMap是什么呢?其实是英国人托尼·巴赞创造的一种提出笔记方法,和传统的直线记录方法完全不同,它以直观形象的图示建立起各个概念之间的联系。在国内,MindMap又被称为脑图或思维导图。

    思维导图(Mind Mapping)以放射性思考(Radiant Thinking)为基础的收放自如方式,除了提供一个正确而快速的学习方法与工具外,运用在创意的发想与收敛、项目企划、问题解决与分析、会议管理等方面,往往产生令人惊喜的效果。它是一种展现个人智力潜能极至的方法,将可提升思考技巧,大幅增进记忆力、组织力与创造力。它与传统笔记法和学习法有量子跳跃式的差异。

    1.2 MindMap软件介绍

    其实当前MindMap软件相当多,最为流行的应该这三款:

    对我来说,FreeMind最合适,原因有二:

    • 跨平台,这样无论我在Windows、Debian或者FreeBSD下都可以正常使用;
    • 采用xml保存数据,方便读取或者与其它程序转换;

    功能简洁,却又恰到好处的够用,因此我就选定它了!

    2. 我用FreeMind

    2.1 速读

    通过我的读书笔记可以看出,用FreeMind做记录是非常方便的。

    采用了FreeMind后,我对一些“快餐书籍”的阅读方式是这样的:

    1. 仔细看一遍目录,根据目录先画一张mindmap,基本把握作者的思路;
    2. 进入阅读状态,边读边写写画画,圈出重点,读完一章,便在mindmap中完善一章的内容,如此周而复始;
    3. 看整张mindmap,从整体回顾,找出重点,标记不同的颜色以便今后重点重读,并且结合自己的感觉,填进mindmap中;
    4. 扔开mindmap,闭上眼睛回忆阅读的结果。

    2.2 小项目管理

    FreeMind有个很好的功能是根据目录创建文件,也就是可以根据某个目录下的文件结构来直接生成一个MindMap,这个功能也很诱人,于是我利用它来管理我的小项目。

    首先直接生成一幅MindMap,然后进行部份细节调整和分类,再标出生要等级。当项目中有新任务创建时,就做简单记录。这样就能轻松地将企业内部的项目放在一起全盘考虑和分析了。

    2.3 脑力激荡

    一帮朋友在一起讨论某个创业机会时、几个程序员在商量产品功能特点的时候、企业管理人员聚会研究公司发展战略的时候……或者,仅仅是自己想写一篇文章的时候,比如我现在:)

    FreeMind是否都能助你一臂之力?

    2.4 会议记录

    会议记录这点似乎乏善可陈,谁都能看出用它做会议记录,相对较能抓住所谈事务的主题,并且容易促进与会者的关联分析。

    3. 小技巧

    3.1 快捷键或鼠标

    我常用的快捷键有:

    在下方新增节点 = Enter
    新增子节点 
    = INSERT
    在上方新增节点 
    =Shift+Enter
    查找 
    = Ctrl+F
    编辑 
    = F2
    展开或缩起 
    = Space

    当然,按F3-F9能够给节点设置不同的颜色等等,也是很常用的。另外还有些组合键,如按住Alt键后用鼠标选中根节点,就是全选。按住Ctrl+Shift后用鼠标连接两个节点,便是在节点间创建连接线……快捷键也可以自定义,但通常无须这样做。具体的细节也可以参见帮助文件。

    3.2 在web上发布

    当你精心完成一个MindMap后,是否有希望别人看到的愿望呢?直接通过freemind-browser可以轻松地将Mindmap发表到网站上,并且访问者能够象直接操作程序般对各节点进行展开、关闭等行为。

    只要将freemindbrowser.html中的两部份稍做修改,即标题和具体mm文件的位置,并连同freemindbrowser.jar一起复制到你的web服务器上,用户应该就能够正常浏览了。

    3.3 聪明的复制与粘贴

    FreeMind比其它软件优势的一个地方还在于它智能的复制方式,例如,我可以通过一个有缩进层次关系的txt、html或其它文件复制成很漂亮的MindMap,也能将MindMap直接复制进word、excel甚至outlook中,并保持良好的缩进和层次关系。

    3.4 修改配置文件

    在一份user.properties的文件中,保存着许多可配置的选项,其中仅有几项是通过Edit->Preference可以设定的。这份文件通常在你的~目录下,在windows 2k、xp和2003下,应该在c:\Documents and Settings\(your user name) \freemind\user.properties,如果是Win9x下则在C:\WINDOWS\freemind\user.properties,要判断你的HOME目录,可以直接在cmd窗口输入:echo %HOMEPATH%

    里面的部份格式如下:

     
    ## Experimental features, "true" / "false"
    #experimental_file_locking_on 
    = false
    ##If dnd is enabled. 
    "true" or "false"
    #draganddrop 
    = true
    #
    ##The Modes which Freemind will load on startup, full Class names separated by a comma.
    #modes 
    = freemind.modes.browsemode.BrowseMode,freemind.modes.mindmapmode.MindMapMode,freemind.modes.filemode.FileMode
    ##The initial mode that is loaded on startup
    #initial_mode 
    = MindMap

    并不难理解,就不多做说明了。

    3.5 MindManager数据导出到FreeMind

    身边有很多朋友使用的Mind Map工具是MindManager X5,这毫无疑问是一款杰出的商用软件,但与FreeMind之间的格式却是不相通用的,好在两者都采用xml格式来保存数据,因此数据转换并不困难。

    先用解压缩工具打开MindManager的*.mmap文件--该格式实际上就是将相关信息打包压缩。下图是用winrar打开时的情况,我们可以看到里面有一个Document.xml的文件,这就是MindManager的主文件了。

    采用特定的xslt,比如mm2fm.xslt,再配合xsltproc软件,将Document.xml解压后直接进行处理,便能够轻松地将该xml顺利转成Freemind所能理解的mm格式:

    c:\xsltproc>xsltproc.exe -o ssp2p.mm mm2fm.xslt Document.xml
    c:\xsltproc
    >

    3.6 FreeMind数据保存到MindManager

    因为成功地游说了几个朋友转移到FreeMind上来,因此一般我自己没有这个需求,偶尔要做这种转换时,就投机取巧了一把:

    • 选择File->Export to HTML,将mm导出为html;
    • 用MS Word打开该html文件,并另存为Word的doc格式;
    • 打开MindManager,采用File->Open->Microsoft word document(*.doc,*.dot),选定刚才保存的文件后打开。

    3.7 添加自己的插件

    一个程序如果可定制程度高,当然能让人觉得更加自由。MindManager可以使用vb编写宏,并且直接载入菜单,这方面FreeMind做得如何呢?

    答案是:相当出色,事实上你可以用java或者jython编写插件并加载。

    在windows下,到C:\Program Files\FreeMind\accessories\plugins下创建文件Pyhello.py如下:

    from freemind.extensions import NodeHookAdapter
    import javax.swing 
    as swing

    class Pyhello(NodeHookAdapter):
        def __init__(win):
        win 
    = swing.JFrame("HelloWorld")
        win.size 
    = (200200)
        win.show()

    instance
    =Pyhello()

    这是插件程序本身,唯一的功能就是显示Hello World :)

    创建Pyhello.properties如下:

    documentation=This is a simple Jython scrīpt that tests the node hook possibilites
    #
    # the scrīpt returns an 
    object of this type:
    base=freemind.extensions.NodeHookAdapter
    scrīpt
    =Pyhello.py
    modes
    =freemind.modes.mindmapmode
    documentation
    =welcome to risker.org
    icon
    =accessories/plugins/icons/kcmsystem.png

    这里定义了上面那个程序的位置、运行模式、说明及图标,重新载入FreeMind时,我们可以看到在工具栏上多出一个图标,点击弹出helloworld。

    3.8 数据导出

    当前的最新测试版本是v 0.72,在这个版本中新增了将MindMap导出为图片或xslt文件的插件,不用费劲心机地截屏或者打印了,直接存成图片发送好了。

  • Database Testing: How to Regression Test a Relational Database(转)

    2007-12-21 23:42:25

    Relational database management systems (RDBMSs) often persist mission-critical data which is updated by many applications and potentially thousands if not millions of end users.  Furthermore, they implement important functionality in the form of database methods (stored procedures, stored functions, and/or triggers) and database objects (e.g. Java or C# instances).  The best way to ensure the continuing quality of these assets, at least from a technical point of view, you should have a full regression test suite which you can run on a regular basis. 

    In this article I argue for a fully automated, continuous regression testing based approach to database testing.  Just as agile software developers take this approach to their application code, we should also do the same for our databases.

     

     

    Table of Contents

    1. Why test an RDBMS?

    2. What should we test?

    3. When should we test?

    4. How should we test?

    5. Who should test?

    6. Introducing database testing into your organization

    7. Database testing and data inspection

    8. Best practices

     

    1. Why Test an RDBMS?

    There are several reasons why you need to develop a comprehensive testing strategy for your RDBMS:

    1. Data is an important corporate asset.  Doesn't it make sense to invest the effort required to validate the quality of data via effective testing?  My July 2006 survey into the current state of data management indicates that 95.7% of respondents believe that data is a corporate asset.  Yet of them only 40.3% had a database test suite in place to validate the data and of those without a test suite only 31.6% had even discussed the concept.

    2. Mission-critical business functionality is implemented in RDBMSs.  In the survey,  63.7% of respondents indicated that their organizations did this, but of those only 46% had regression tests in place to validate the logic. Shouldn't we be doing better?

    3. Current approaches aren't sufficient.  The current state of the art in many organizations is for data professionals to control changes to the database schemas, for developers to visually inspect the database during construction, and to perform some form of formal testing during the test phase at the end of the lifecycle.  Unfortunately, none of these approaches prove effective.  Application developers will often go around their organization's data management group because they find them too difficult to work with, too slow in the way they work, or sometimes they don't even know they should be working together.  The end result is that the teams don't follow the desired data quality procedures and as a result quality suffers.  Although visual inspection of query results is a good start it is little more than a debugging technique in practice that will help you to find problems but not prevent them.  Testing late in the lifecycle is better than nothing, but as Barry Boehm noted in the early 80s it's incredibly expensive to fix any defects you find at that point.

    4. Testing provides the concrete feedback required to identify defects.  How do you know how good the quality of your source data actually is without an effective test suite which you can run whenever you need to?

    5. Support for evolutionary development.  Many evolutionary development techniques, in particular database refactoring, are predicated upon the idea that it must be possible to determine if something in the database has been broken when a change has been made.  The easiest way to do that is to simply run your regression test suite.

     
    Uncomfortable Question:

    Isn't it time that we stopped talking about data quality and actually started doing something about it?

    Here's a few interesting questions to ask someone who isn't convinced that you need to test the DB:

    1. If you're implementing code in the DB in the form of stored procedures, triggers, ... shouldn't you test that code to the same level that you test your app code?
    2. Think of all the data quality problems you've run into over the years. Wouldn't it have been nice if someone had originally tested and discovered those problems before you did?
    3. Wouldn't it be nice to have a test suite to run so that you could determine how (and if) the DB actually works?
       

    I think that one of the reasons that we don't hear much about database testing is because it is a relatively new idea within the data community. Many traditional data professionals seem to think that testing is something that other people do, particularly test/quality assurance professionals, do. This reflects a penchant for over-specialization and a serial approach towards development by traditionalists, two ideas which have also been shown to be questionable organizational approaches at best.

     

    2. What Should We Test?

    Figure 1 indicates what you should consider testing when it comes to relational databases.  The diagram is drawn from the point of view of a single database, the dashed lines indicate threat boundaries, indicating that you need to consider threats both within the database (clear box testing) and at the interface to the database (black box testing).  Table 1 lists the issues which you should consider testing for both internally within the database and at the interface to it.  For details, read the article What To Test in an RDBMS.

     

    Figure 1. What to test.

     

    Table 1.  What to test in an RDBMS.

    Black-Box Testing at the Interface White/Clear-Box Testing Internally Within the Database
    • O/R mappings (including the meta data)
    • Incoming data values
    • Outgoing data values (from queries, stored functions, views ...)
    • Scaffolding code (e.g. triggers or updateable views) which support refactorings
    • Typical unit tests for your stored procedures, functions, and triggers
    • Existence tests for database schema elements (tables, procedures, ...)
    • View definitions
    • Referential integrity (RI) rules
    • Default values for a column
    • Data invariants for a single column
    • Data invariants involving several columns
     

     

    3. When Should We Test?

    Agile software developers take a test-first approach to development where they write a test before you write just enough production code to fulfill that test.  The steps of test first development (TFD) are overviewed in the UML activity diagram of Figure 2.  The first step is to quickly add a test, basically just enough code to fail.  Next you run your tests, often the complete test suite although for sake of speed you may decide to run only a subset, to ensure that the new test does in fact fail.  You then update your functional code to make it pass the new tests.  The fourth step is to run your tests again.  If they fail you need to update your functional code and retest.  Once the tests pass the next step is to start over.

     

    Figure 2. The Process of Test First Development (TFD).

     

    Test-driven development (TDD) is an evolutionary approach to development which combines test-first development and refactoring.  When an agile software developer goes to implement a new feature, the first question they ask themselves is "Is this the best design possible which enables me to add this feature?"  If the answer is yes, then they do the work to add the feature.  If the answer is no then they refactor the design to make it the best possible then they continue with a TFD approach.  This strategy is applicable to developing both your application code and your database schema, two things that you would work on in parallel.

    When you first start following a TDD approach to development you quickly discover that to make it successful you need to automate as much of the process as possible?  Do you really want to manually run the same build scrīpt(s) and the same testing scrīpt(s) over and over again?  Of course not.  So, agile developers have created OSS tools such as ANT, Maven, and Cruise Control (to name a few) which enable them to automate these tasks.  More importantly, it enables them to automate their database testing scrīpt into the build procedure itself.

    Agile developers realize that testing is so important to their success that it is something they do every day, not just at the end of the lifecycle.  They test as often and early as possible, and better yet they test first.  As you can see with the agile system development lifecycle (SDLC) of Figure 3 testing is in fact something that occurs during the development and release cycles, not just during release.  Furthermore, many agile software developers realize that you can test more than just your code, you can in fact validate every work product created on a software development project if you choose to.  This philosophy is exemplified by the Full Lifecycle Object-Oriented Testing (FLOOT) Methodology.

     

    Figure 3. The Agile Lifecycle.

     

    4. How to Test

    Although you want to keep your database testing efforts as simple as possible, at first you will discover that you have a fair bit of both learning and set up to do.  In this section I discuss the need for various database sandboxes in which people will test: in short, if you want to do database testing then you're going to need test databases (sandboxes) to work in.  I then overview how to write a database test and more importantly describe setup strategies for database tests.  Finally, I overview several database testing tools which you may want to consider.

     

    4.1 Database Sandboxes

    A common best practice on agile teams is to ensure that developers have their own "sandboxes" to work in.  A sandbox is basically a technical environment whose scope is well defined and respected.  Figure 4 depicts the various types of sandboxes which your team may choose to work in.  In each sandbox you'll have a copy of the database.  In the development sandbox you'll experiment, implement new functionality, and refactor existing functionality, validate your changes through testing, and then eventually you'll promote your work once you're happy with it to the project integration sandbox.  In this sandbox you will rebuild your system and then run all the tests to ensure you haven't broken anything (if so, then back to the development sandbox).  Occasionally, at least once an iteration/cycle, you'll deploy your work to the level (demo and pre-production testing), and rerun your test suite (including database tests) each time that you do so to ensure that your changes integrate with the changes made by other developers.  Every so often (perhaps once every six to twelve months) into production. The primary advantage of sandboxes are that they help to reduce the risk of technical errors adversely affecting a larger group of people than is absolutely necessary at the time. 

    Figure 4. Sandboxes.

     

    4.2 Writing Database Tests

    There's no magic when it comes to writing a database test, you write them just like you would any other type of test.  Database tests are typically a three-step process:

    1. Setup the test.  You need to put your database into a known state before running tests against it.  There are several strategies for doing so.
    2. Run the test.  Using a database regression testing tool, run your database tests just like you would run your application tests.
    3. Check the results.  You'll need to be able to do "table dumps" to obtain the current values in the database so that you can compare them against the results which you expected.

    The article What To Test in an RDBMS goes into greater detail.

     

    4.3 Setting up Database Tests

    To successfully your database you must first know the exact state of the database, and the best way to do that is to simply put the database in a known state before running your test suite.  There are two common strategies for doing this:

    1. Fresh start.  A common practice is to rebuild the database, including both creation of the schema as well as loading of initial test data, for every major test run (e.g. testing that you do in your project integration or pre-production test sandboxes). 

    2. Data reinitialization.  For testing in developer sandboxes, something that you should do every time you rebuild the system, you may want to forgo dropping and rebuilding the database in favor of simply reinitializing the source data. You can do this either by erasing all existing data and then inserting the initial data vales back into the database, or you can simple run updates to reset the data values.  The first approach is less risky and may even be faster for large amounts of data.

    An important part of writing database tests is the creation of test data.  You have several strategies for doing so:

    1. Have source test data.  You can maintain an external definition of the test data, perhaps in flat files, XML files, or a secondary set of tables.  This data would be loaded in from the external source as needed.

    2. Test data creation scrīpts.  You develop and maintain scrīpts, perhaps using data manipulation language (DML) SQL code or simply application source code (e.g. Java or C#), which does the necessary deletions, insertions, and/or updates required to create the test data.

    3. Self-contained test cases.  Each individual test case puts the database into a known state required for the test. 

    These approaches to creating test data can be used alone or in combination.  A significant advantage of writing creation scrīpts and self-contained test cases is that it is much more likely that the developers of that code will place it under configuration management (CM) control.  Although it is possible to put test data itself under CM control, worst case you generate an export file that you check in, this isn’t a common practice and therefore may not occur as frequently as required.  Choose an approach that reflects the culture of your organization.

    Where does test data come from?  For unit testing, I prefer to create sample data with known values.  This way I can predict the actual results for the tests that I do write and I know I have the appropriate data values for those tests.  For other forms of testing -- particularly load/stress, system integration, and function testing, I will use live data so as to better simulate real-world conditions.

     
    Beware Coupling:

    One danger with database regression testing, and with regression testing in general, is coupling between tests. If you put the database into a known state, then run several tests against that known state before resetting it, then those tests are potentially coupled to one another.  Coupling between tests occurs when one test counts on another one to successfully run so as to put the database into a known state for it.  Self-contained test cases do not suffer from this problem, although may be potentially slower as a result due to the need for additional initialization steps.

     

    4.4 What Testing Tools Are Available?

    I believe that there are several critical features which you need to successfully test RDBMSs.  First, as Figure 1 implies you need two categories of database testing tools, one for interface tests and one for internal database tests.  Second, these testing tools should support the language that you're developing in.  For example, for internal database testing if you're a Microsoft SQL Server developer, your T-SQL procedures should likely be tested using some form of T-SQL framework.  Similarly, Oracle DBAs should have a PL-SQL-based unit testing framework.  Third, you need tools which help you to put your database into a known state, which implies the need not only for test data generation but also for managing that data (like other critical development assets, test data should be under configuration management control).

    To make a long story short, although we're starting to see a glimmer of hope when it comes to database testing tools, as you can see in Table 2, but we still have a long way to go. Luckily there are some good tools being developed by the open source software (OSS) community and there are some commercial tools available as well.  Having said that, IMHO there is still significant opportunity for tool vendors to improve their database testing offerings.

    Table 2. Some database testing tools.

    Category Descrīption Examples
    Unit testing tools Tools which enable you to regression test your database.
    Testing tools for load testing Tools simulate high usage loads on your database, enabling you to determine whether your system's architecture will stand up to your true production needs.
    Test Data Generator Developers need test data against which to validate their systems.  Test data generators can be particularly useful when you need large amounts of data, perhaps for stress and load testing.

     

    5. Who Should Test?

    During development cycles, the primary people responsible for doing database testing are application developers and agile DBAs.  They will typically pair together, and because they are hopefully taking a TDD-approach to development the implication is that they'll be doing database unit testing on a continuous basis.  During the release cycle your testers, if you have any, will be responsible for the final system testing efforts and therefore they will also be doing database testing.

    The role of your data management (DM) group, or IT management if your organization has no DM group, should be to support your database testing efforts.  They should promote the concept that database testing is important, should help people get the requisite training that they require, and should help obtain database testing tools for your organization.  As you have seen, database testing is something that is done continuously by the people on development teams, it isn't something that is done by another group (except of course for system testing efforts).  In short, the DM group needs to support database testing efforts and then get out of the way of the people who are actually doing the work.

     

    6. Introducing Database Regression Testing into Your Organization

    Database testing is new to many people, and as a result you are likely to face several challenges:

    1. Insufficient testing skills. This problem can be overcome through training, through pairing with someone with good testing skills (pairing a DBA without testing skills and a tester without DBA skills still works), or simply through trial and error. The important thing is that you recognize that you need to pick up these skills.
    2. Insufficient unit tests for existing databases. Few organizations have yet to adopt the practice of database testing, so it is likely that you will not have a sufficient test suite for your existing database(s). Although this is unfortunate, there is no better time than the present to start writing your test suite.
    3. Insufficient database testing tools. As I said earlier, we still have a way to go with respect to tools.
    4. Reticent DM groups.  My experience is that some data management (DM) groups may see the introduction of database regression testing, and agile techniques such as test-first development (TFD) and refactoring, as a threat.  Or, as my July 2006 "state of data management" survey shows, a large percentage of organizations are not only not doing any database testing at all they haven't even discussed it.  For many in the data management community the idea of doing database testing is rather new and it's simply going to take a while for them to think it through.  I'm not so sure that you should wait to do such obvious process improvement.

    In general, I highly suggest that you read my article Adopting Evolutionary/Agile Database Techniques and consider buying the book Fearless Change which describes a pattern language for successfully implementing change within organizations.

     

    7. Database Testing and Data Inspection

    A common quality technique s to use data inspection tools to examine existing data within a database.  You might use something as simple as a SQL-based query tool such as DB Inspect to select a subset of the data within a database to visually inspect the results.  For example, you may choose to view the unique values in a column to determine what values are stored in it, or compare the row count of a table with the count of the resulting rows from joining the table with another one.  If the two counts are the same then you don't have an RI problem across the join.

    As Richard Dallaway points out, the problem with data inspection is that it is often done manually and on an irregular basis.  When you make changes later, sometimes months or years later, you need to redo your inspection efforts.  This is costly, time consuming, and error prone.

    Data inspection is more of a debugging technique than it is a testing technique.  It is clearly an important technique, but it's not something that will greatly contribute to your efforts to ensure data quality within your organization.

     

    8. Best Practices

    I'd like to conclude this article by sharing a few database testing "best practices" with you:

    1. Use an in-memory database for regression testing.  You can dramatically speed up your database tests by running them, or at least portions of them, against an in-memory database such as HSQLDB.  The challenge with this approach is that because database methods are implemented differently across database vendors that any method tests will still need to run against the actual database server.

    2. Start fresh each major test run.  To ensure a clean database, a common strategy is that at the beginning of each test run you drop the database, then rebuild it from scratch taking into account all database refactorings and transformations to that point, then reload the test data, and then run your tests.  Of course, you wouldn't do this to your production database.  ;-)

    3. Take a continuous approach to regression testing.  I can't say this enough, a TDD approach to development is an incredibly effective way to work.

    4. Train people in testing.  Many developers and DBAs have not been trained in testing skills, and they almost certainly haven't been trained in database testing skills.  Invest in your people, and give them the training and education they need to do their jobs.

    5. Pair with novices with people that have database testing experience.  One of the easiest ways to gain database testing skills is to pair program with someone who already has them.

     

  • Database Testing(转)

    2007-12-21 23:15:52

    Introduction to Relational Database Testing
     

    I believe that the virtual absence of discussion about testing within the data management community is the primary cause of the $611 billion annual loss, as reported by The Data Warehouse Institute, experienced by North American organizations resulting from poor data quality.  Relational database management systems (RDBMSs) often persist mission-critical data and implement mission-critical functionality.   We've known for years that effective testing enables you to improve quality, and in particular testing often and early in the lifecycle can do so dramatically.   It seems to me that to improve database quality an important activity, if not the most important one, is to test our databases often (and better yet regressively).  Figure 1 indicates what you should consider testing when it comes to relational databases.   The diagram is drawn from the point of view of a single database, the dashed lines indicate threat boundaries, indicating that you need to consider threats both within the database (clear box testing) and at the interface to the database (black box testing).

    Figure 1. What to test.

    Functionality Testing in Relational Databases

    TBD

    Stored procedures and triggers. Stored procedures and triggers should be tested just like your application code would be.

    Relationship Testing in Relational Databases

    TBD

    Referential integrity (RI). RI rules, in particular cascading deletes in which highly coupled "child" rows are deleted when a parent row is deleted, should also be validated. Existence rules, such as a customer row corresponding to an account row, must exist before the row can be inserted into the Account table, and can be easily tested, too.

    Data Quality Testing in Relational Databases

    TBD

    Default values. Columns often have default values defined for them. Are the default values actually being assigned. (Someone could have accidentally removed this part of the table definition.)

    Data invariants. Columns often have invariants, implemented in the forms of constraints, defined for them. For example, a number column may be restricted to containing the values 1 through 7. These invariants should be tested.

    Validate the attribute size. Is the field size defined in the application is matching with that in the db.


    Performance Testing of Relational Databases

    TBD

    Access time to read/write/delete a single row.

    Access time for common queries returning multiple rows.

    Access time for queries involving several tables.

    Existence test for an index.   Does the expected index exist or not?

    Structural Testing in Relational Databases

    TBD

    Table existence.   We can check whether all the data from the application is being inserted into the database properly, or not

    View definitions. Views often implement interesting business logic. Things to look out for include: Does the filtering/select logic work properly? Do you get back the right number of rows? Are you returning the right columns? Are the columns, and rows, in the right order?

    Terminology

    The following terminology is used throughout this article:

    • Database testing. The act of validating the contents, schema, and functionality within a database. From the point of view of a relational database this includes the actual data itself, the table structures and relationships between tables, and the stored procedures/functions or database classes respectively.
    • Database interface testing.   Database testing which validates the database at the black-box level.   See Figure 1.
    • Internal database testing.   Database testing which validates the database at the white/clear-box level.   See Figure 1.
    • Database regression testing.   The act of running the database test suite on a regular basis, ideally whenever someone does something which could potentially inject a defect into the database such as change how they write data into a database or change some of the code within the database itself.
    • Test Driven Database Development (TDDD). Also known as "behavīor Driven Database Development" (BDDD), this is the act of specifying the design of a database by writing a single test then just enough database code/schema to fulfill that test.
  • 质量体系建立的步骤(网络转载)

    2007-12-18 18:05:51


    质量体系建立的步骤

     

    建立、完善质量体系一般要经历质量体系的策划与设计,质量体系文件的编制、质量体系的试运行,质量体系审核和评审四个阶段,每个阶段又可分为若干具体步骤

    一、质量体系的策划与设计

    该阶段主要是做好各种准备工作,包括教育培训,统一认识,组织落实,拟定计划;确定质量方针,制订质量目标;现状调查和分析;调整组织结构,配备资源等方面。

    (一)教育培训,统一认识

    质量体系建立和完善的过程,是始于教育,终于教育的过程,也是提高认识和统一认识的过程,教育培训要分层次,循序渐进地进行。

    第一层次为决策层,包括党、政、技(术)领导。主要培训:

    1.通过介绍质量管理和质量保证的发展和本单位的经验教训,说明建立、完善质量体系的迫切性和重要性;

    2.通过ISO9000族标准的总体介绍,提高按国家(国际)标准建立质量体系的认识。

    3.通过质量体系要素讲解(重点应讲解“管理职责”等总体要素),明确决策层领导在质量体系建设中的关键地位和主导作用。

    第二层次为管理层,重点是管理、技术和生产部门的负责人,以及与建立质量体系有关的工作人员。

    这二层次的人员是建设、完善质量体系的骨干力量,起着承上启下的作用,要使他们全面接受ISO9000族标准有关内容的培训,在方法上可采取讲解与研讨结合,理论与实际结合。

    第三层次为执行层,即与产品质量形成全过程有关的作业人员。对这一层次人员主要培训与本岗位质量活动有关的内容,包括在质量活动中应承担的任务,完成任务应赋予的权限,以及造成质量过失应承担的责任等。

    (二)组织落实,拟定计划

    尽管质量体系建设涉及到一个组织的所有部门和全体职工,但对多数单位来说,成立一个精干的工作班子可能是需要的,根据一些单位的做法,这个班子也可分三个层次。

    第一层次:成立以最高管理者(厂长、总经理等)为组长,质量主管领导为副组长的质量本系建设领导小组(或委员会)。其主要任务包括:

    1.体系建设的总体规划;

    2.制订质量方针和目标;

    3.按职能部门进行质量职能的分解。

    第二层次,成立由各职能部门领导(或代表)参加的工作班子。这个工作班子一般由质量部门和计划部门的领导共同牵头,其主要任务是按照体系建设的总体规划具体组织实施

    第三层次:成立要素工作小组。根据各职能部门的分工明确质量体系要素的责任单位,例如,“设计控制”一般应由设计部门负责,“采购”要素由物资采购部门负责。

    组织和责任落实后,按不同层次分别制定工作计划,在制定工作计划时应注意:

    1.目标要明确。要完成什么任务,要解决哪些主要问题,要达到什么目的?

    2.要控制进程。建立质量体系的主要阶段要规定完成任务的时间表、主要负责人和参与人员、以及他们的职责分工及相互协作关系。

    3.要突出重点。重点主要是体系中的薄弱环节及关键的少数。这少数可能是某个或某几个要素,也可能是要素中的一些活动。

    (三)确定质量方针,制定质量目标

    质量方针体现了一个组织对质量的追求,对顾客的承诺,是职工质量行为的准则和质量工作的方向。

    制定质量方针的要求是:

    1.与总方针相协调;

    2.应包含质量目标;

    3.结合组织的特点;

    4.确保各级人员都能理解和坚持执行。

    (四)现状调查和分析

    现状调查和分析的目的是为了合理地选择体系要素,内容包括:

    1.体系情况分析。即分析本组织的质量体系情况,以便根据所处的质量体系情况选择质量体系要素的要求。

    2.产品特点分析。即分析产品的技术密集程度、使用对象、产品安全特性等,以确定要素的采用程度。

    3.组织结构分析。组织的管理机构设置是否适应质量体系的需要。应建立与质量体系相适应的组织结构并确立各机构间隶属关系、联系方法。

    4.生产设备和检测设备能否适应质量体系的有关要求。

    5.技术、管理和操作人员的组成、结构及水平状况的分析。

    6.管理基础工作情况分析。即标准化、计量、质量责任制、质量教育和质量信息等工作的分析。

    对以上内容可采取与标准中规定的质量体系要素要求进行对比性分析。

    (五)调整组织结构,配备资源

    因为在一个组织中除质量管理外,还有其他各种管理。组织机构设置由于历史沿革多数并不是按质量形成客观规律来设置相应的职能部门的,所以在完成落实质量体系要素并展开成对应的质量活动以后,必须将活动中相应的工作职责和权限分配到各职能部门。一方面是客观展开的质量活动,一方面是人为的现有的职能部门,两者之间的关系处理,一般地讲,一个质量职能部门可以负责或参与多个质量活动,但不要让一项质量活动由多个职能部门来负责。目前我国企业现有职能部门对质量管理活动所承担的职责、所起的作用普遍不够理想总的来说应该加强。

    在活动展开的过程中,必须涉及相应的硬件、软件和人员配备,根据需要应进行适当的调配和充实。

    二、质量体系文件的编制

    质量体系文件的编制内容和要求,从质量体系的建设角度讲,应强调几个问题:

    1.体系文件一般应在第一阶段工作完成后才正式制订,必要时也可交叉进行。如果前期工作不做,直接编制体系文件就容易产生系统性、整体性不强,以及脱离实际等弊病。

    2.除质量手册需统一组织制订外,其它体系文件应按分工由归口职能部门分别制订,失提出草案,再组织审核,这样做有利于今后文件的执行。

    3.质量体系文件的编制应结合本单位的质量职能分配进行。按所选择的质量体系要,素,逐个展开为各项质量活动(包括直接质量活动和间接质量活动),将质量职能分配落实到各职能部门。质量活动项目和分配可采用矩阵图的形式表述,质量职能矩阵图也可作为附件附于质量手册之后。

    4.为了使所编制的质量体系文件做到协调、统一,在编制前应制订“质量体系文件明细表”,将现行的质量手册(如果已编制)、企业标准、规章制度、管理办法以及记录表式收集在一起,与质量体系要素进行比较,从而确定新编、增编或修订质量体系文件项目。

    5.为了提高质量体系文件的编制效率,减少返工,在文件编制过程中要加强文件的层次间、文件与文件间的协调。尽管如此,一套质量好的质量体系文件也要经过自上而下和自下而上的多次反复。

    6.编制质量体系文件的关键是讲求实效,不走形式。既要从总体上和原则上满足 ISO9000族标准,又要在方法上和具体做法上符合本单位的实际。三、质量体系的试运行

    质量体系文件编制完成后,质量体系将进入试运行阶段。其目的,是通过试运行,考验质量体系文件的有效性和协调性,并对暴露出的问题,采取改进措施和纠正措施,以达到进一步完善质量体系文件的目的。

    在质量体系试运行过程中,要重点抓好以下工作:

    1.有针对性地宣贯质量体系文件。使全体职工认识到新建立或完善的质量体系是对过去质量体系的变革,是为了向国际标准接轨,要适应这种变革就必须认真学习、贯彻质量体系文件。

    2.实践是检验真理的唯一标准。体系文件通过试运行必然会出现一些问题,全体职工立将从实践中出现的问题和改进意见如实反映给有关部门,以便采取纠正措施。

    3.将体系试运行中暴露出的问题,如体系设计不周、项目不全等进行协调、改进。

    4.强信息管理,不仅是体系试运行本身的需要,也是保证试运行成功的关键。所有与质量活动有关的人员都应按体系文件要求,做好质量信息的收集、分析、传递、反馈、处理和归档等工作。

    四、质量体系的审核与评审

    质量体系审核在体系建立的初始阶段往往更加重要。在这一阶段,质量体系审核的重点,主要是验证和确认体系文件的适用性和有效性。

    1.审核与评审的主要内容一般包括:

    (1)规定的质量方针和质量目标是否可行;

    (2)体系文件是否覆盖了所有主要质量活动,各文件之间的接口是否清楚;

    (3)组织结构能否满足质量体系运行的需要,各部门、各岗位的质量职责是否明确;

    (4)质量体系要素的选择是否合理;

    (5)规定的质量记录是否能起到见证作用

    (6)所有职工是否养成了按体系文件操作或工作的习惯,执行情况如何

    2.该阶段体系审核的特点是:

    (1)体系正常运行时的体系审核,重点在符合性,在试运行阶段,通常是将符合性与适用性结合起来进行;

    (2)为使问题尽可能地在试运行阶段暴露无遗,除组织审核组进行正式审核外,还应有广大职工的参与,鼓励他们通过试运行的实践,发现和提出问题;

    (3)在试运行的每一阶段结束后,一般应正式安排一次审核,以便及时对发现的问题进行纠正,对一些重大问题也可根据需要,适时地组织审核;

    (4)在试运行中要对所有要素审核覆盖一遍;

    (5)充分考虑对产品的保证作用;

    (6)在内部审核的基础上,由最高管理者组织一次体系评审。

    应当强调,质量体系是在不断改进中行以完善的,质量体系进入正常运行后,仍然要采取内部审核,管理评审等各种手段以使质量体系能够保持和不断完善。

  • 软件测试基础知识复习 (转)

    2007-12-13 13:12:04

    软件测试基础知识复习 (转)

    软件开发过程及软件质量保证
    1.软件开发过程的几个主要阶段:
    1)定义。明确开发的目标,软件的需求。
    2)计划。制订软件开发所涉及到的计划。
    3)设计。设计、编码、编写文档等,完成要求的软件特性。
    4)稳定化。主要是测试和缺陷修复,确保软件的质量。
    5)安装。安装、提交完成的软件,为客户提供运行环境。
    2.几种常用的软件生命周期模型:
    1)瀑布模型。
    2)原型模型。
    3)增量模型。
    4)螺旋模型。
    软件测试人员的角度来看软件开发过程,需要注意的是:测试贯穿在整个开发过程中,而不是在某个阶段集中地做一下测试而其它阶段不用理会测试工作。

    一个软件之所以被认为为质量优秀,是它内在具备了这样一些特性:
    满足用户的需求;
    合理进度、成本、功能关系;
    具备扩展性和灵活性,能够适应一定程度的需求变化;
    能够有效地处理例外的情况;
    保持成本和性能的平衡。

    软件质量保证(Software Quality Assurance-----SQA)是为了确保软件开发过程和结果符合预期的要求而建立的系列规程,以及依照规程和计划采取的一系列活动及其结果评审。

    软件质量保证的活动主机包括:
    技术方法的就用;
    正式技术评审的实施;
    软件测试;
    标准的执行;
    修改的控制;
    度量;
    记录和记录保存。

    软件错误的定义:软件错误是软件产品中存在的导致期望的运行结果和实际结果间出现差异的一系列问题,这些问题包括故障、失效、缺陷。


    软件测试:
    软件测试就是为了发现软件中存在的错误而分析或执行程序的过程。具体地说,软件测试是分析程序或根据软件开发各阶段的规格说明和各程序的内部结构而精心设计出一批测试用例,并利用测试用例来运行程序,以发现程序错误的过程。

    软件测试有两个基本的功能:验证(Verification)和确认(Validation)。
    验证指保证软件正确地实现了特写功能的一系列活动。
    确认指保证最终的产品满足系统需求。
    通俗的说:验证保证产品的正确性;确认保证生产了正确的产品。

    软件测试人员应该至少具备以下两个关键领域方面的知识:
    1)软件测试技术;
    2)被测应用程序及其相关应用领域知识。

    理解以下的描述:
    测试能提高软件的质量,但是提高质量不能依赖测试;
    测试只能证明错误存在,不能证明错误不存在;
    测试的主要困难是不知道该如何进行有效地测试,也不知道什么时候能够放心的结束测试;
    每个程序员都应当测试自己的程序(份内事),但不能作为程序已通过测试的依据(所以项目需要独立的测试人员);
    80-20原则:80%的错误聚集在20%的模块中,经常出错的模块改错后还是会经常出错;
    测试应当循序渐进,不要企图一次性做完。"欲速则不达"。

    测试人员的目标和主要工作:
    目标:(1).基本目标是发现软件错误;
    (2).要尽可能早的找出软件错误;
    (3).必需确保找出的软件错误得以关闭。

    主要工作:
    1)规划测试任务
    2)设计测试(包括编写测试用例等等)
    3)建立一个合适的测试环境
    4)评估、获取、安装和配置自动测试工具
    5)执行测试
    6)撰写适当的测试文档

    软件测试的分类
    1.从是否需要执行被测试软件的角度分:有静态测试和动态测试。
    2.从测试是否针对软件结构和算法的角度分类分:白盒测试和黑盒测试。
    3.从测试的不同阶段分:单元测试、集成测试、系统测试和验收测试四个阶段。
    其中系统测试有:功能测试、健壮性测试、性能测试、用户界面测试、安全性测试、压力测试、可靠性测试、安装/反安装测试等等。

    针对某些功能作用的测试:
    回归测试:指错误被修正后或软件功能、环境发生变化后进行的重新测试。
    功能测试:测试软件的功能是否符合功能性需求,通常采用黑盒测试方式。
    负载测试:测试软件系统的最大负载,超出此负载软件有可能会失常。
    压力测试:与负载测试差不多,叫法不同。
    易用性测试:测试软件是否易用,主观性比较强。一般要根据用户的反馈信息来评价。
    安装与反安装测试:测试软件在"全部、部分、升级"等状况下的安装/反安装过程。
    恢复测试:测试系统从故障中恢复的能力。
    安全性测试:测试系统防止非法侵入的能力。
    兼容性测试:测试系统与其它软件、硬件兼容的能力。
    内存泄漏测试:测试软件在运行过程中是否会造成内存泄漏。
    比较测试:通过与同类产品比较,考察该产品的优点、缺点。
    Alpha测试:一种先期的用户测试,此时系统刚刚开发完成。
    Beta测试:一种后期的用户测试,此时系统已经通过内部测试,大部分错误已经改正,即将正式发行。同Alpha测试一样都由用户进行,场地不同,Alpha测试一般是把用户请到开发方的场地来测试,Beta测试是指在一个或多个用户的场所进行测试。

    测试工作的主要步骤:
    1)测试计划:测试人员要首先对需求进行分析,最终定义一个测试集合。
    2)测试设计与开发:根据软件需求、说明书完成测试用例设计并编写必要的测试驱动程序。
    3)执行测试:需要做的工作是,建立测试环境;根据前面编写的测试计划和测试用例运行测试;记录测试结果;报告软件缺陷;跟踪软件缺陷直至其被处理;分析测试结果


    PS 测试工程师职业素质
    1)责任心
    2)学习能力
    3)怀疑精神
    4)沟通能力
    5)专注力
    6)洞察力
    7)团队精神
    8)注重积累
  • 做软件测试三、四年的给新手的建议

    2007-12-13 12:38:34

    做软件测试三、四年的给新手的建议

     | 作者: 网络转载 |

    软件测试三,四年了,确实正应了那句“测试不如开发”,只是个人观点,而且我工作过都是外企和大型国有企业,软件测试流程管理都相对很规范化的。

    下面几点给做测试的朋友参考一下:
    1、钱肯定少过开发人员,除非你工作七,八年才能拿年薪10W以上,一般的软件测试工程师很难上6K以上,开发人员工作四,五年后拿7,8K是太多数的。

    2、加班的现象可以说是很普遍,周一到周五随时加班是很正常的,周末肯定有一天要加班。

    3、不管怎么样努力和用什么测试效果的数据说明,领导还是不太重视测试部,领导认为我们测试的没有什么技术含量。但是我们已经在流程上改进很大,使用测试管理工具自动化测试工具来提高测试生产力等等,这些努力的结果好象只有我们的老大才得分比较高,我们下面的小兵就只有吃苦的份。
    4、团队合作精神比较差,都是做技术的人的通病,以为你在一间公司呆久了,就很牛B一样,说话口气难于接受,好象现在公司就是他的一样。这个问题在几间公司里面的测试队伍中得到证实。在工作之余,很少团队一起聚餐或是出外游玩的机会,好象大家就知道上班---吃中午饭--上班--吃晚饭---加班---下班回家---睡觉的简单模式。
    5、人际关系和沟通技能都很重要,这一点不用我多说,大家都知道的。
    6、还有一点要提醒测试人员的是:做测试容易懒惰,因为重复性的工作比较多,然后在公司呆着好好的,什么都不想学和提高了,这样容易使你在软件的测试面比较狭窄了,其实你到其他的公司面试的时候,才发现自己很多不知道,不懂的。
    7、我们做测试几年了,都不想老是停留在执行测试,写测试用例设计测试计划,写测试脚本,评审开发/测试文档上,写缺陷报告,写测试报告,管理和维护测试工具。但是上面的几点工作后,我们软件测试人员还能做些什么?

    怎么样提高软件测试员自身素质培养?

    (1) 首先,应对软件测试感兴趣和对自己有自信,如果具备了这两点,那么在开发过程中不管遇到什么样的困难,我相信你一定能克服。
    (2) 善于怀疑,世界上没有绝对正确的,总有错误的地方,具有叛逆心理,别人认为不可能发生的事,我却认为可能发生。别人认为是对的,我却认为不是对的。
    (3) 打破砂锅问到底的精神,对于只出现过一次的bug,一定找出原因,不解决誓不罢休。
    (4) 保持一个良好的心情,否则可能无法把测试作好。不要把生活中的不愉快的情绪带到工作中来
    (5) 做测试时要细心,不是所有的bug都能很容易的找出,一定要细心才能找出这些bug。
    (6) 灵活一些,聪明一点,多制造一些容易产生bug的例子。
    (7) 在有条件的情况下,多和客户沟通,他们身上有你所需要的。
    (8) 设身处地为客户着想,从他们的角度去测试系统
    (9) 不要让程序员,以“这种情况不可能发生”这句话说服你,相反,你应该去说服他,告诉他在客户心里,并不是这样的。
    (10) 考虑问题要全面,结合客户的需求、业务的流程、和系统的构架,等多方面考虑问题。
    (11) 提出问题不要复杂化,这一点和前面的有点矛盾,如果你是一新手,暂时不要管这一点,因为最终将有你的小组成员讨论解决。
    (12) 追求完美,对于新测试员来说,努力的追求完美,这对你很好,尽管有些事无法做到,但你应该去尝试。
    (13) 幽默感,能和开发小组很好的沟通是关键,试着给你的开发小组找一个“BUG杀手”,或对他们说“我简直不敢相信,你写的程序居然到现在没有找到BUG”。
    (14) 到此是不是对测试很有兴趣呢?不过我要告诉你,测试过程中有酸甜苦辣,其中的滋味只有你知道,也许你会感到枯燥,要学会放松自己,去溜冰或做你喜欢做的事,不过,别放弃,因为你的自信告诉过你“你会是很优秀的测试员”不是吗?

    我们常见软件测试的技巧

    软件测试虽然辛苦,但是掌握了一定的技巧之后将使你事半功倍。
    (1) 边界测试,测试用户输入框中的数值的最大数和最小数,以及为空时的情况。
    (2) 非法测试,例如在输入数字的地方输入字母。
    (3) 跟踪测试,跟踪一条数据的流程,保证数据的正确性。
    (4) 在开始测试时应保证数据的正确性,然后在从系统中找出各种BUG。
    (5) 接口测试,程序往往在接口的地方很容易发生错误,要在此模块测试勿掉以轻心。
    (6) 代码重用测试,在开发过程中有些模块功能几乎相同,程序员在重用代码时可能忘记在原有代码上修改或修改不全面,而造成的错误。
    (7) 突发事件测试,服务器上可能发生意外情况的测试。
    (8) 外界环境测试,有些系统在开发时依赖于另外一个系统,当另外一个系统发生错误时, 这个系统所受到的影响的情况。
    (9) 在程序员刚修复Bug之后的地方,再找一找,往往程序员只修复报告出来的缺陷而不去考虑别的功能在修改时可能会重新造成错误。
    (10) 认真做好测试记录在做完一天的测试记录之后,第二天再根据第一天的测试记录重复测试你会发现有未修正的错误。
    (11) 文字测试,如果在系统中有用词不当的地方,我想这是不应该的。
    (12) 系统兼容测试,例如有些程序在IE6能运行正常,到IE5下不能运行。有些程序在WIN2000下能运行,而到WIN98却不能运行。像一些很特别的用户去使用系统,你很有可能发现BUG。
    (13) 用户的易用性测试,往往用户的需求是不断的变化的,而其中的一部份变化的原因,是有用户操作上不方便引起的。
    软件测试是软件开发中的重中之重,没有一点可以马虎的,在项目管理过程,我强调的时是每个过程的每一个环节都要进行测试,保证系统在每个阶段可以控制。因为软件测试中考虑的问题基本上是项目管理中考虑的问题。
    我认为在项目管理中考虑的一些问题应该是在软件测试时有些体现,体现的内容是软件测试的一些侧重点,具体说,软件测试是事务性的,而项目管理是策略性,一些策略性的东西必须在一些事务性的事务上来实现
    针对这个经验,看过的朋友都会产生相同或者不同的看法,不妨与大家共享一下!

Open Toolbar