花匠学徒---------->

发布新日志

  • 如何发现客户端软件中的内存泄露

    2008-11-02 18:32:53

    如何发现客户端软件中的内存泄露?

            软件测试每周一问:这里的客户端软件包括C/S系统的客户端和B/S系统中的客户端控件,当用户使用客户端软件时,如果发现我们的软件会吃内存,那是很丢面子的事,有哪些好的测试方法呢?希望大家能踊跃提出自己的看法。

    会员huior的精彩回答:

            如何发现客户端软件中的内存泄露?我的看法是:检测内存泄漏的问题应该尽早进行,它绝不应该是系统测试时的主要目标。也就是说,检查是否存在内存泄漏,应该从编码时就要考虑,单元测试和集成测试时要重点检查。如果前期没有考虑,等到了系统测试才想起检查或者才发现泄漏,为时已晚,此时再去定位泄漏的位置,太难太难了,它可能会让你的交付日期delay不确定的时间。

            最近看了一些自动错误预防(AEP)的理论,我深受启发。作为测试人员的我们,从“发现错误”转变到“帮助开发人员预防错误”,这将是一个巨大的转变。所以说,下面我的答案中的第一点,我先说如何预防内存泄漏的问题,然后再讲如何发现。

    1 如何在开发过程中有效预防内存泄漏?

    第一步:遵循“好”的编程规则

            “好”的编程规则是各位前辈经验和教训的集合,好的编程规则堪称开发者的“圣经”。遵循统一的编程规则,可以让开发新手少走好多弯路,可以让项目整体的质量维持一个起码的“质量底线”。

            有关内存泄漏方面的规则主要是“内存管理”方面的,举几个简单的,如下

    ×用malloc或new申请内存之后,立即检查指针值是否为NULL(防止使用指针值为NULL的内存)

    ×动态内存的申请与释放是否配对(防止内存泄漏)

    ×malloc语句是否正确无误?例如字节数是否正确?类型转换是否正确

    ×是否出现野指针,例如用free或delete释放了内存之后,忘记将指针设置为NULL

    ... ...

    第二步:积极主动检测“内存泄漏”

            严格遵循好的编程规则,可以让程序员在代码中尽量少的引入bug,但一旦不小心引入了,怎么办?这就要求我们在单元测试和集成测试中严格把关。

            在这个阶段,单靠程序员或者测试员通过“代码走查”的方式检查内存泄漏,客户的实践和我的经验告诉我,这将是“不切实际”的,无论效率还是时间。如果能够借助于一些专业的工具的话,情况可能就不一样了。

            如果你的程序是用Visual C++ 6.0开发,那么Numega的BoundsChecker将是你检测“内存泄漏”最好的选择,如果是Visual C++.NET,可以试一下Compuware的DevPartner。

            如果你的程序基于Unix或者Linux平台,使用C或者C++,可以考虑一下开源的工具valgrind,我的朋友跟我说,它在一定程度上比Rational的Purify更出色。

            上面的工具都要求程序能够动态运行起来,而且测试用例需要你自己准备。

            如果你正处于单元测试或集成测试阶段,程序代码量已经足够大,而且还不能够动态运行,要尽早检测代码中的“内存泄漏”问题,该怎么办?此时你可以试用一下目前最新的静态分析技术

    ×它不要求代码能够动态运行

    ×也不需要你来编写测试用例

    ×只需要代码能够正常编译,就可以发现代码只有在执行过程中才出现的错误,当然也包括内存泄漏。

            这方面的工具有Klocwork的K7,Coverity的SQS,以及C++test中的BugDetective,其中最“物美价廉”的就是c++test的BugDetective。

    2 如何发现客户端软件的“内存泄漏”?

            如果开发过程中已经按照我上面提到的去做,相信发布后的程序存在“内存泄漏”的可能性几乎为零。

            如果开发过程已经到了后期,系统测试已经开始做了,还要发现内存泄漏,这个时候我希望你能够拿到源代码。如果有源代码,你还可以考虑1中的第二步,借助于专业的工具协助,虽然可能效果不一定特别理想,但总比下面我提到的方法更好一些。

            当然作为测试人员,我当然也理解事情总没有想像那么完美。我们通常会碰到“需要在系统测试阶段检测是否有内存泄漏,而且没有源代码”的难题。我曾经也遇到过。

            记得那还是2002年的事情了。当时我承接的项目是一个电力行业的自动化系统,分为server端和client端,典型的c/s模式,老板要求在测试功能的同时顺便检查内存泄漏的问题,因为这个client端在客户那里可能是长时间不间断运行的,虽然客户很少操作。我当时很为难,因为没有源代码,我甚至无法做“代码走查”。在做功能测试的同时,我一直在琢磨...... 采用什么手段呢?

            最后,借助于WinRunner,我出色的完成了任务,起码我的老板相信我的测试是可信的。我的方法是这样的。

    ×首先咨询开发方,了解到关于内存操作频繁的功能点和模块

    ×从我的功能测试用例中挑选出和这些功能点和模块相关的测试用例

    ×找到一个“纯净”的机器,上面除了操作系统和被测的client端外,没有任何其他应用,这样做是为了排除其他应用可能存在的干扰。

    ×借助于WinRunner,自动化这些用例,形成自动化的脚本;在脚本的最后,添加“切换到Windows任务管理器”“记录该client进程所占用内存数据到文件”的操作脚本。

    ×连续运行N个小时

    ×最后我打开这个数据文件,可以发现在该客户端运行过程中,每次执行完特定的测试用例后,记录的内存占用数据。当时我得出的结论是该client程序有“少许”的内存泄漏,因为在连续运行了72小时后,内存使用增加了近百分之十几。我会把这些数据导入到EXCEL中绘成了一个图表,这样更直观一些。经过简单的计算(内存的增量/用例循环次数),得到用例每次执行后增加的内存使用值,即泄漏的内存数量,然后把操作过程和这个结果一起交给开发方,最后开发方根据我的信息,真的找到了一处有内存泄漏的地方,虽然泄漏的数量很少。

            以上就是我有过的一个类似的经历,我觉得可以提供给大家参考,同时也可以“举一反三,融会贯通”。如B/S的客户端控件,可以用QTP协助完成。

            在测试的最后阶段要去发现甚至定位内存泄漏挺难的,但只要发挥我们测试人员的主观能动性,总是找到一些“旁门左道”的测试手段。

            最后,我个人认为,从时间成本和各种风险考虑,要避免内存泄漏的问题,还是要回到前期的预防,即编程过程的规则检查和单元测试阶段主动的检测。

            一家之言,欢迎讨论。


    原文连接:http://www.51testing.com/?10851/action_viewspace_itemid_84835.html

  • Oracle导入&导出数据库\清空&复制表\其他

    2008-11-01 18:07:34

    Oracle导入&导出数据库\清空&复制表\其他

    from http://www.51testing.com/?140230

    一、oracle导出步骤:
    1
    、点击开始”--“运行”--输入“cmd” 回车
    2
    、输入“exp” 回车
    3
    、输入“xxx\yyy@easdb_192.168.0.41” 回车 //这里xxx为要导出数据库的用户名,yyy为要导出数据库的用户密码,easdb_192.168.0.41为该数据库的连接字符串
    4
    、输入“e:\database.dmp” 回车,注意:这里是把导出的数据库放在e盘,取名为database.dmp
    5
    、一直回车,到要求输入用户名:输test回车,注意:test为刚刚创建的数据库用户名。
    6
    、回车,开始导出数据。


    二、oracle导出步骤:
    1
    、点击开始”--“运行”--输入“cmd” 回车
    2
    、输入“imp” 回车
    3
    、输入“test1\pwd@easdb_192.168.0.41” 回车,注意:test1238数据库中的用户名。
    4
    、输入“e:\database.dmp” 回车,注意:这里指要导入数据库的文件路径及文件名。
    5
    、一直回车,到要求输入用户名:输“test” 回车,注意:test为该数据库文件的前用户名,即此数据库导出时的用户。
    6
    、回车,开始导入数据。

    三、清空&复制表

    1、快速清空表内容:truncate table xxxx     \    truncate table user.xxxx     注:user为数据库的用户,就是清空user用户的xxxx表内容。

    2、复制一个表中的数据到另外一个表:create table yyy as select * from uuu。即把uuu表中的数据复制到yyy中。

    同样可以复制到同服务器上的oracle中的其他用户里(用user为例):create table user.yyy as select * from uuu

    四、其他

    1、创建用户:

    string sql = "create user " + usename + " identified by " +pwd+" default tablespace users Temporary TABLESPACE USERS";   //创建

    string sql2 = "grant connect,resource,dba to "+usename;//授权

    2、删除用户:

    string sql = "drop user "+usename+" cascade";


  • 什么是测试用例?

    2008-11-01 17:44:52

    引自51testing NO11 电子杂志

    什么是测试用例?
    让我们从基础开始,什么是测试用例?
    IEEE 标准610(1990)对测试用例的定义如下:
    1) 为特定目的开发的一套测试输入、执行条件以及期望结果的集合,
    例如运用特殊的程序路径或检查应用是否满足某个特定的需求。
    2) (IEEE Std 829-1983)指定输入、预期结果和一组测试项的执行条件
    的文档。
    根据Ron Patton(2001,p,65)的定义:
    测试用例是进行软件测试时,尝试使用的特殊输入和遵照的流程。

    Boris Beizer(1995,p.3)把测试定义为:
    一个或多个子测试的执行顺序就像是一个序列,因为一个子测试的结果和/
    或最终状态是下一个子测试的输入和/或初始状态。“测试”这一词通常涵盖子测
    试、专用测试和组测试。

    Bob Binder(1999,p.47)定义的测试用例:
    测试用例阐明了IUT 测试前的状态及其环境、测试输入或条件、以及期望
    的结果。期望的结果指明了IUT 会从测试输入中产生什么结果。这些细则包括
    了IUT 产生的信息、异常、返回值、IUT 的结果状态及其环境。测试用例也会为
    其他构成IUT 及其环境的对象指定初始和结果条件。
    实践中,很多事物都可以当作测试用例,即使他们完全不符合准备好的测试

    文档。
    Brian Marick 用一个相关的术语来描述没有完全文档化的测试用例,其测试
    观点是:
    “测试观点是对被测事物的一个简要描述。例如,测试平方根功能,其中一
    个测试构思可以是“测一个小于0 的数”。这个测试想法是检验代码是否有错误
    处理机制。”
    我认为,测试用例是对程序提出的质疑,运行测试的目的就是获取信息,比
    如程序是否会通过测试。
    在明确测试观点是什么以及怎样把这种思想应用在产品的某些特殊方面(比
    如,外观)时,需要还是不需要注明流程细节。依照习惯,如果文件记录是测试
    用例不可或缺的一部分,那么就请用测试观点代替遵循的所有测试用例。
    测试用例定义的一个重要应用就是:测试用例必须具有一定的能力暴露信
    息。
    􀁺 按照这种定义,测试用例的变化范围会随着程序趋于稳定。测试初期,在程
    序的任何方面都会出现问题的时候,试着用最大的有效值填写数据型的输入
    字段是一个明智有效的测试方式。数周之后,程序经过数次构建通过测试之
    后,不再需要测试用例对这个字段进行独立测试,因为它已经具有了处理异
    常的能力。此时,更多相关的测试用例会同时组合10 个不同变量组成边界
    线,或者会根据较长的测试序列或情景设置边界。
    􀁺 同样,按照这种定义,对测试用例数量报告的度量是没有意义的。几周前一
    组20 个单变量的测试是有用的,而现在它们已经没用或者合为一体时,应
    该怎么做?假设你创建了一个包含20 个测试的组合测试,这个测试的度量
    报告是20 还是21 个测试?仅执行一次的测试是怎样的?因为程序设计变化

    待续~~~

  • {转}测试设计中需要考虑的22种测试类型

    2008-11-01 17:15:44

    引自pl80601983的个人空间

    copy Bookmark http://www.51testing.com/?130745

     黑盒测试:不基于内部设计和代码的任何知识,而是基于需求和功能性。

       白盒测试:基于一个应用代码的内部逻辑知识,测试是基于覆盖全部代码、分支、路径、条件。

       单元测试:最微小规模的测试;以测试某个功能或代码块。典型地由程序员而非测试员来做,因为它需要知道内部程序设计和编码的细节知识。这个工作不容易作好,除非应用系统有一个设计很好的体系结构; 还可能需要开发测试驱动器模块或测试套具。

       累积综合测试:当一个新功能增加后,对应用系统所做的连续测试。它要求应用系统的不同形态的功能能够足够独立以可以在全部系统完成前能分别工作,或当需要时那些测试驱动器已被开发出来; 这种测试可由程序员或测试员来做。

       集成测试:一个应用系统的各个部件的联合测试,以决定他们能否在一起共同工作。部件可以是代码块、独立的应用、网络上的客户端或服务器端程序。这种类型的测试尤其与客户服务器和分布式系统有关。

       功能测试:用于测试应用系统的功能需求的黑盒测试方法。这类测试应由测试员做,这并不意味着程序员在发布前不必检查他们的代码能否工作(自然他能用于测试的各个阶段)。

       系统测试:基于系统整体需求说明书的黑盒类测试;应覆盖系统所有联合的部件。

       端到端测试:类似于系统测试;测试级的“宏大”的端点;涉及整个应用系统环境在一个现实世界使用时的模拟情形的所有测试。例如与数据库对话,用网络通讯,或与外部硬件、应用系统或适当的系统对话。

       健全测试:典型地是指一个初始化的测试工作,以决定一个新的软件版本测试是否足以执行下一步大的测试努力。例如,如果一个新版软件每5分钟与系统冲突,使系统陷于泥潭,说明该软件不够“健全”,目前不具备进一步测试的条件。

       衰竭测试:软件或环境的修复或更正后的“再测试”。可能很难确定需要多少遍再次测试。尤其在接近开发周期结束时。自动测试工具对这类测试尤其有用。

       接受测试:基于客户或最终用户的规格书的最终测试,或基于用户一段时间的使用后,看软件是否满足客户要求。

       负载测试:测试一个应用在重负荷下的表现,例如测试一个 Web 站点在大量的负荷下,何时系统的响应会退化或失败。

       强迫测试:在交替进行负荷和性能测试时常用的术语。也用于描述象在异乎寻常的重载下的系统功能测试之类的测试,如某个动作或输入大量的重复,大量数据的输入,对一个数据库系统大量的复杂查询等。

       性能测试:在交替进行负荷和强迫测试时常用的术语。理想的“性能测试”(和其他类型的测试)应在需求文档或质量保证、测试计划中定义。

       可用性测试:对“用户友好性”的测试。显然这是主观的,且将取决于目标最终用户或客户。用户面谈、调查、用户对话的录象和其他一些技术都可使用。程序员和测试员通常都不宜作可用性测试员。

       安装/卸载测试:对软件的全部、部分或升级安装/卸载处理过程的测试。

       恢复测试:测试一个系统从如下灾难中能否很好地恢复,如遇到系统崩溃、硬件损坏或其他灾难性问题。

        安全测试:测试系统在防止非授权的内部或外部用户的访问或故意破坏等情况时怎么样。这可能需要复杂的测试技术

       兼容测试:测试软件在一个特定的硬件/软件/操作系统/网络等环境下的性能如何。

       比较测试:与竞争伙伴的产品的比较测试,如软件的弱点、优点或实力。

       Alpha 测试:在系统开发接近完成时对应用系统的测试;测试后,仍然会有少量的设计变更。这种测试一般由少数用户或其他人员员完成,主要错误由程序员或测试员记录。

       Beta 测试:当开发和测试根本完成时所做的测试,而最终的错误和问题需要在最终发行前找到。这种测试一般由最终用户或其他人员员完成,最终上报给程序员或测试员完成.
  • 软件测试的目的引自macdull的个人空间

    2008-11-01 16:55:53

    软件测试的目的引自macdull的个人空间  http://www.51testing.com/?152318
    软件测试的目的大致可分为三个不同层次:
    1、找出软件中存在的缺陷(这个目标是最基本的)。要想达到这个目标相对来讲比较容易一些。只要能够做到细致全面的测试就可以了,而且如果被测系统的代码质量比较差,那么就更不需要费太大的力气,就可以发现足够多的问题。所以为什么说测试入门门槛比较低,也和这个方面有一定关系
    2、要想测试比别人做的好一些,就要“尽早”发现问题。因为发现问题越早,缺陷修复的成本就会降低很多,说得白一些,就是能为公司“省更多的钱”。这就需要测试人员从初期开始介入。发现需求和设计文档中的缺陷和不足,所以说测试发展的第二个目标是要全面把握和分析需求以及设计。只有比需求人员更“需求”,才有可能发现需求中的缺陷,否则只能按照需求进行功能测试而已
    3、测试的最终目标应该是“协助开发人员减少问题的发生”,也就是说已经犯过的错误,后面项目最好不要再发生。要做到这点,就需要测试人员对以往项目所产生的缺陷进行统计和分析,帮助开发人员提出相关的解决方案,共同提升软件产品的质量。

我的栏目

我的存档

数据统计

  • 访问量: 3942
  • 日志数: 5
  • 建立时间: 2008-11-01
  • 更新时间: 2008-11-02

RSS订阅

Open Toolbar